Hi!
Ich habe den Anwendungsfall jetzt mal separat gekapselt. Hierbei kreise ich jedoch permanent um das gleiche Problem, und zwar dass mir der aktuelle Zeiger* nicht bekannt ist, und ich somit nicht den korrekten Nachfolger und Vorgaenger ermitteln kann.
Der muss dir aber bekannt sein, sonst könntest du den zum Zeiger gehörenden Datensatz gar nicht bestimmen. Das kannst du aber - anhand der ID. Die muss dein Zeiger-Kriterium sein. Mehrfach vorkommende Werte sind dafür nicht geeignet.
Im jetzigen Fall zeigst du, dass du die ID für den Detaildatensatz verwendest, im vorangegangenen Verlauf des Threads sprachst du von benutzerfreundlichen URLs. Die kannst du nur verwenden, wenn du ein Unique-Kriterium hast. Das müsste dann auch durch einen entsprechenden Index gleich auf Tabellenebene sichergestellt werden.
Ich weiß nicht, welche Bedeutung die Spalte position hat, aber als Auswahlkriterium ist sie unbrauchbar, weil sie keinen eindeutigen Inhalt hat. Wenn du ein zweites Kriterium hast, durch das die Wahl eindeutig wird, dann musst du auch immer dieses zur Auswahl hinzuziehen und an den Übergabestellen von position in andere Programmteile mit anführen.
Wobei letzterer sowieso noch einige weitere Aspekte mit sich bringt. Denn um den Vorgaenger zu ermitteln muss ich ja die Sortierung invertieren (so weit ich das jetzt richtig verstanden habe).
Ja, zumindest bei der LIMIT-Lösung. Bei nur einem gesuchten Kandidaten kann auch MIN() und MAX() verwendet werden.
Ist GET['did'] gesetzt, so versucht das Program den Vorgaenger und den Nachgaenger zu ermitteln (links in der Tabelle gibt es Links hierfuer).
Damit hast du ein eindeutiges Kriterium, das muss dein Zeiger sein. Denn darüber bestimmst du ja auch den anzuzeigenden Detail-Datensatz. Und zusammen mit der Sortierung ergeben sich die Vorgänger und Nachfolger.
Der Rest sind allgemeine Hinweise zum Code:
Ich sehe keine Fehlerbehandlung, sprich: Auswertungen der Rückgabewerte der mysql_*-Funktionen. (Wenn du sie nur aufgrund des Quick'n'Dirty-Charakters des Beispiel weggelassen hast, will ich nichts gesagt haben.)
$detailUrl = $_SERVER['PHP_SELF'].'?did='.$row["id"];
$myLink = '<a href="'.$detailUrl.'">'.$row["id"].'</a>';
echo "<tr>";
echo "<td>".$myLink."</td>";
echo "<td>".$row["name"]."</td>";
echo "<td>".$row["position"]."</td>";
echo "<td>".$row["price"]."</td>";
echo "</tr>";
Sowohl bei der URL als auch bei den Tabellenzellen hast du den Kontextwechsel nicht behandelt. Über $_SERVER['PHP_SELF'] und eine entsprechend präparierte Aufruf-URL kann man die HTML- usw. -Code in die angezeigte Seite einfügen. Bei den Tabellenzellen geht das auch, wenn es jemandem gelingt, den HTML-Code in die Datenbank zu bringen. SCRIPT_NAME enthält im Gegensatz zu PHP_SELF nur den reinen Script-Namen, keine angehängten Path-Bestandteile oder den Querystring.
Du kannst PHP_SELF in deinem Fall auch ganz weglassen und nur ?did=... im href-Attribut verwenden. Der Browser ergänzt das selbständig mit der aktuellen Adresse des Dokuments.
if( isset( $_GET['did'] ) )
// Get Current
$currentQuery = 'SELECT id, name, position, price FROM my_items WHERE id = '.$_GET['did'];
Diese Abfrage ist nicht notwendig. Du hast ja bereits alle Datensätze für die Übersichtstabelle abgefragt, unter anderem auch diesen. Du brauchst nur in der ersten while-Schleife hinzuzufügen, auf $_GET['did'] == $row["id"] zu vergleichen und daraufhin $currentRow zu füllen.
$prev .= $prevRow['name']. ' <<< ';
$next .= ' >>> '.$nextRow['name'];
Auch hier wieder den Kontextwechsel beachten. Und < sowie > sind Zeichen mit Sonderbedeutung in HTML, müssen also korrekterweise auch maskiert werden.
Lo!