[PHP / SQL ] - Ergebnisabfrage über meherere Seiten
-
Hallo Zusammen.
Ich hab da mal etwas gebastelt, was aber nicht recht klappen will. Ziel ist es, eine SQL-Abfrage pro Seite zu begrenzen (SPrich: 5 auf einer Seite). Wenn es mehr gibt als die 5 Ergebnisse, sollte ein Link erscheinen mit (Seite 2) oder so ähnlich. Die Abfrage klappt und ist in Ordnung allerdings gibt es zwei Probleme.
Problem Nr 1:
Wenn ich in die Abfrage ein ORDER BY KundenNr ASC hinter dem $limit." anhänge, klappt das nicht da ein Fehler kommt. Genau dasselbe kommt auch, wenn die Abfrage mit einem WHERE erweitert werden sollte. Danach erscheint nämlich die folgende FEhlermeldung:Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/globesolutions.ch/subdomains/application/httpdocs/clientis/cltvrw_ma.php on line 145
Problem Nr 2:
Die Ausgabe des Links mit "next" und "Previous" ist ok. Nur frage ich mich, wie bringe ich dann PHP Dazu die neue Abfrage zu starten?? Ich hab eine Variable $newStart und wo sollte ich die hinschreiben? Hab diese schon versucht in den Link zu setzen, aber nichts passiert, ich bleib einfach bei meiner Seite...Hier der Code, der die Seiten ausrechnen und anzeigen soll:
if ($start > 0) { $newStart = ($start - $limit < 0) ? 0 : ($start-$limit); echo '<a href="'.$_SERVER['PHP_SELF'].'?action=kndsearch&req=sview" target="_self"><< previous</a>'; } if ($start + $limit < $total) { $newStart = $start + $limit; echo '<a href="'.$_SERVER['PHP_SELF'].'?action=kndsearch&req=sview" target="_self">next >></a>'; }
und nun noch der gesamste Code:
$connectionid = mysql_connect ($db_host, $db_user, $db_pass); if (!mysql_select_db ($db_name, $connectionid)) { die ("Database Error"); } $start = (isset($start)) ? abs((int)$start) : 0; $limit = 2; $resultID = mysql_query("SELECT COUNT(id) FROM clt_stdata"); $total = mysql_result($resultID,0); $start = ($start >= $total) ? $total - $limit : $start; if(($_POST['clt_nr'] == "") && ($_POST['clt_name'] == "")) { $sql = "SELECT * FROM clt_stdata LIMIT ".$start.",".$limit.""; } else { $sql ="SELECT * FROM clt_stdata LIMIT ".$start.",".$limit." WHERE KundenNr = '".$_POST['clt_nr']."' OR Nachname = '".$_POST['clt_name']."'"; } $result = mysql_query($sql); while($view = mysql_fetch_array($result)) { echo '<tr><td>'.$view['KundenNr'].'</td><td> </td><td>'.$view['Nachname'].'</td><td> </td><td>'.$view['Vorname'].'</td><td> </td><td>'.$view['Adresse'].'</td><td> </td><td>'.$view['Ort'].'</td><td> </td><td>'.$view['TelP'].'</td><td> </td><td><a href="'.$_SERVER['PHP_SELF'].'?action=knddetail&KNR='.$view['KundenNr'].'&KNN='.$view['Nachname'].'" target="_self">Details</a></td></tr>'; } echo '</table><br />'; if ($start > 0) { $newStart = ($start - $limit < 0) ? 0 : ($start-$limit); echo '<a href="'.$_SERVER['PHP_SELF'].'?action=kndsearch&req=sview" target="_self"><< previous</a>'; } if ($start + $limit < $total) { $newStart = $start + $limit; echo '<a href="'.$_SERVER['PHP_SELF'].'?action=kndsearch&req=sview" target="_self">next >></a>'; }
Weiss jemand woran das liegen könnte ??
Gruss
Wolf
-
1. Die Reihenfolge der SQL-Klauseln kann nicht beliebig vertauscht werden. Zuerst wird die Ergebnisrelation erzeugt und möglicherwiese eingeschränkt, dann sortiert und abschließend portioniert. Also Where muß vor Order By und Limit stehen und Limit muß vor Order By stehen.
2. Speicherst Du die aktuelle Seite irgendwo in einer Session? Wenn nicht mußt Du doch diese mit in den Links übergeben sonst weiß er doch nicht wo er sich gerade befindet.
echo "[ url=".$_SERVER['PHP_SELF']."&start=5]";
oder ähnlich.
-
noch ein tip (den du sicher kennst):
schreibe folgendes:
sql) or die ("Fehler in: " . $sql);
und schau dir deine fehlerhaften queries mal in reinschrift an.
-
elise schrieb:
noch ein tip (den du sicher kennst):
schreibe folgendes:
sql) or die ("Fehler in: " . $sql);
und schau dir deine fehlerhaften queries mal in reinschrift an.
Jo hast Recht. Hab ich vergessen, war gestern ziemlich müde.
Wenn ich nun folgendes habe: Select * FROM irgendwaqs LIMIT 'limit' ORDER BY irgendwas ASC , dann erhalte ich folgende FEhlermeldung:Fehler in: SELECT * FROM clt_stdata LIMIT 0,2 ORDER BY KundenNr ASC
Hab ich keine ORDER BY drin, also nur Limit oder Where, funktionierts.
Lediglich noch immer das Problem mit den Seiten.Nein ich speichere die aktuelle Seite nicht in einer Session, die Abfrage über MYSQL Befindet sich in einem SWITCH-Trakt unter case 'kndsearch' mit untergeordnetem case 'sview'. Deshalb auch die Links mit ?action= etc..
Ich nahm nur newStart'. .. die Variable newStart wird erfolgreich und korrekt übergeben, jedoch passiert weiterhin nichts, es bleibt bei der ersten Abfrage (resp, wird nicht mehr ausgeführt).
Hier der Code mit den Seitenausgaben:
if ($start > 0) { $newStart = ($start - $limit < 0) ? 0 : ($start-$limit); echo '<a href="'.$_SERVER['PHP_SELF'].'?action=kndsearch&req=sview&start='.$newStart.'" target="_self"><< previous</a>'; } if ($start + $limit < $total) { $newStart = $start + $limit; echo '<a href="'.$_SERVER['PHP_SELF'].'?action=kndsearch&req=sview&start='.$newStart.'" target="_self">next >></a>'; }
Was mir noch auffällt ist, wenn ich die Suche mit WHERE 'Nachname' mache, dann erscheint (folglich logisch) nur ein Ergebnis mit dem Kunden mit dem gesuchten Nachnamen. Ok, jezt ist der Link "next" aber auch da und klick ich drauf, hab ich dann zwei Kunden (die nichts mit dem Nachnamen) zu tun haben. Maximale Ergebnise ($limit) hab ich auf 2 eingestellt (als Test), aber scheinbar scheint da etwas falsch zu laufen.
Hab noch nicht rausgefunden was.
-
nur kurz geschaut: falsch rum
SELECT * FROM clt_stdata ORDER BY KundenNr ASC LIMIT 0,2
limit nach order by
http://www.little-idiot.de/mysql/mysql-117.html (erster link, ohne gewehr, is ja weihnachten)
-
elise schrieb:
nur kurz geschaut: falsch rum
SELECT * FROM clt_stdata ORDER BY KundenNr ASC LIMIT 0,2
limit nach order by
http://www.little-idiot.de/mysql/mysql-117.html (erster link, ohne gewehr, is ja weihnachten)
Ja natürlich, Fehler meinerseits.
-
Danke. Das wars
Den anderen Fehler hab ich auch gefunden.
Die Variable wird durch den Link weitergegeben start=2 zum Beispiel, jedoch weiss die IF-Anweisung nichts davon weil eifach von $start ausgegangen wird (der Standardwert). Folgende Änderung in REQUEST hat nun das ganze zum laufen gebracht. Vielen Dank.$start = (isset($_REQUEST['start'])) ? abs((int)$_REQUEST['start']) : 0;