Peter Nack: suchergebnisse, detailseite und blaetterfunktion

Beitrag lesen

Hallo Dedlfix,

ich moechte einfach nicht weiter voran kommen ;-(

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. 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).

Hier jetzt mal mein Beispielcode.
Er liest Daten aus der Tabelle my_items aus, sortiert nach
1. absteigender Position
2. absteigendem Preis
3. aufsteigendem Name
4. aufsteigender ID
und stellt sie in einer Tabelle dar.
Ist GET['did'] gesetzt, so versucht das Program den Vorgaenger und den Nachgaenger zu ermitteln (links in der Tabelle gibt es Links hierfuer).

Das Programm laeuft korrekt, so fern die einzelnen Positionen konsequent unterschiedlich sind. Sprich, wenn mehrere Item mit der gleichen Position existieren, kommt der Select logischerweise durcheinander - und hierzu weisz ich immernoch keine funktionierende Loesung.

====================================================
= MYSQL

CREATE TABLE IF NOT EXISTS `my_items` (  
  `id` int(11) NOT NULL auto_increment,  
  `name` varchar(255) collate latin1_general_ci NOT NULL,  
  `position` int(11) NOT NULL default '0',  
  `price` int(11) NOT NULL default '0',  
  PRIMARY KEY  (`id`)  
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=13 ;  
INSERT INTO `my_items` (`id`, `name`, `position`, `price`) VALUES  
(1, 'Andorra', 1, 100),  
(2, 'Andorraflex', 1, 1000),  
(3, 'Caesar', 0, 4000),  
(4, 'Zeus', 0, 4433),  
(5, 'Marx', 4, 1222),  
(6, 'Manoman', 4, 4533),  
(7, 'Oligo', 0, 4900),  
(8, 'Denier', 4, 1200),  
(9, 'Stofanus', 2, 4300),  
(10, 'Korgos', 2, 4300),  
(11, 'Situra', 1, 4500),  
(12, 'Radion', 1, 3400);

====================================================
= PHP

<?php  
$order_default = 'ORDER BY position DESC, id ASC';  
$order_reverse = 'ORDER BY position ASC, id DESC';  
  
/** OVERVIEW */  
$link = mysql_connect('localhost', 'root', '');  
$db_selected = mysql_select_db('test');  
$query = 'SELECT id, name, position, price FROM my_items '.$order_default;  
$result = mysql_query($query);  
  
echo "<table border='1' cellpadding='4'><tr><th>ID</th><th>NAME</th><th>POSITION</th><th>PRICE</th></tr>";  
while ($row = mysql_fetch_assoc($result))  
{  
 $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>";  
}  
echo "</table>";  
  
  
  
/** DETAIL VIEW */  
if( isset( $_GET['did'] ) )  
{  
 echo "<hr>";  
	  
 // Get Current  
 $currentQuery = 'SELECT id, name, position, price FROM my_items WHERE id = '.$_GET['did'];  
 $currentResult = mysql_query($currentQuery);  
 $currentRow = mysql_fetch_assoc($currentResult);  
  
 // Previous Item	  
 $prevQuery = 'SELECT id, name, position, price FROM my_items '.  
              ' WHERE position >= '.$currentRow['position'].' '. // >= becoz of "position DESC"  
	      ' AND id != '.$currentRow['id'].' '. // no need for the current one  
              $order_reverse.  
	      ' LIMIT 0,5 '; // ?? Starten __AB__ dem aktuellen Item ???  
 $prevResult = mysql_query($prevQuery);  
 $prev = "";  
 while ($prevRow = mysql_fetch_assoc($prevResult))  
 {  
  $prev .= $prevRow['name']. ' <<< ';  
 }  
		  
 // Next Item	  
 $nextQuery = 'SELECT id, name, position, price FROM my_items '.  
              ' WHERE position <= '.$currentRow['position'].' '.// >= becoz of "position DESC"  
	      ' AND id != '.$currentRow['id'].' '. // no need for the current one  
	      $order_default.  
	      ' LIMIT 0,5 '; // ?? Starten __AB__ dem aktuellen Item ???  
 $nextResult = mysql_query($nextQuery);  
 $next = "";  
 while ($nextRow = mysql_fetch_assoc($nextResult))  
 {  
  $next .= ' >>> '.$nextRow['name'];  
 }  
	  
 // Output  
 echo "<p>";  
 echo $prev;  
 echo "<strong>".$currentRow['name']."</strong> ";  
 echo $next;  
 echo "</p>";  
}  
?>

Vielleicht kannst du da ja einmal drueber schauen und mir ggfs. meinen Denkfehler vor Augen fuehren.

Vielen Dank & MfG
Peter

* Siehe Posting weiter oben. Gemeint ist der "Zeiger" auf den aktuellen Datensatzes innerhalb des Resultsets.