Liste blättern

radarin

Angesehenes Mitglied
Hallo Liste
Habs schon mit der Suchfunktion versucht, aber nix gefunden. Ich suche eine Anleitung wie ich eine Abfrage aus einer DB in 10er Blöcken anzeigen kann, mit vor und zurück blättern...

Gruss René
 
Setze hinter dem SELECT Statement einfach noch ein " LIMIT [start], [anzahl datensätze]"
Also zB:

CODE SELECT * FROM hallo LIMIT 0, 10


Dann bekommst du zehn Datensätze ab dem ersten Datensatz.

Zum Blätern machst dein einen Link, der per GET den Start übergibt, der immer 10 höher ist als der vorige Wert, also sähe der Link zB so aus:


CODE <a href="index.php?limit=10">weiter</a>


und dann in der Abfrage:


CODE $limit = (int)$_GET['limit'];
.
.
.
SELECT * FROM hallo LIMIT $limit, 10


Hoffe ist verständlich
unsure.gif
 
Mit der Syntax von LIMIT klemmts noch, bekomme eine Fehlermeldung. Habe schon im Netzt nach einer SQL Sprachreferenz gesucht, leider nix gefunden...
 
Genau, hinter allen anderen Sachen.
Hätte ich mal expliziter sagen sollen^^
 
Hat mich einiges an Denkarbeit gekostet das Ganze umzusetzen. Da ich es schätze bei Fragen etwas konkretere Antworten zu bekommen, hier also mein Lösungsansatz, falls wer froh darum ist was kopieren zu können.

Der Datensatz der zuerst angezeigt werden soll (LIMIT), sowie die Nummer der aktuellen Seite wird beim Blättern in der URL übergeben. Beim ersten Seitenanruf werden die Variablen auf einen Default-Wert gesetzt.

CODE
// Start DS ermitteln (Liste blättern)
if(isset($_GET['firstds'])){
 $firstds = $_GET['firstds'];
}else{
 $firstds = 0;
}
// Seite X von Y (Liste blättern)
if(isset($_GET['pagecount'])){
 $pagecount = $_GET['pagecount'];
}else{
 $pagecount = 1;
}



Dann werden die Anzahl der Datensätze in der Datenbank ermittelt


CODE
// Datenbankverbindung herstellen
$database = mysql_connect($dbhost, $dbuser, $dbpasswd);
mysql_select_db($dbname, $database);
// DS zählen (Liste blättern)
$sql_ds = "SELECT * ".
      " FROM ".$table.
   " WHERE view = 1 OR view = 0".
   " ";

$result_ds = mysql_query ($sql_ds);
$num_rows_ds = mysql_num_rows($result_ds);



Etwas unpraktisch ist dabei, dass PHP (oder SQL?) nicht bei 1 sondern bei 0 zu zählen beginnt. Der erste Datensatz hat also die Nummer null.
Zuerst muss definiert werden wieviele Datensätze pro Seite ausgegeben werden sollen. Dann müssen Variablen berechnet werden, damit die Startwerte für das LIMIT beim Zurück- und Vorwärts-Blättern in der URL übergeben werden können. Zusätzlich berechne ich die Zahlen um im Link gleich anzugeben welche Datensätze gezeigt werden sollen. Letzteres ist grundsätzlich nicht nötig und kann auch weggelassen werden.


CODE
$viewds = 5; // Anzahl Datensätze pro Seite
$prefirstds = $firstds - $viewds; // erster DS vorherige Seite (Abfrage)
$nextfirstds = $firstds + $viewds; // erster DS nächste Seite (Abfrage)

$firstview = $firstds + 1;  // Text: Anzeige von...
$lastview = $firstds + $viewds; // Text: Anzeige ...bis
if ($lastview > $num_rows_ds){$lastview = $num_rows_ds;} // Letzter Block wenn kleiner als Vorgabe

$prefirstview = $prefirstds + 1; // Text: Link Anzeige von... (vorherige Seite)
$prelastview = $prefirstview + $viewds - 1; // Text: Link Anzeige ...bis (vorherige Seite)

$nextfirstview = $nextfirstds + 1; // Text: Link Anzeige von... (nächste Seite)
$nextlastview = $nextfirstview + $viewds - 1; // Text: Link Anzeige ...bis (nächste Seite)
if ($nextlastview > $num_rows_ds){$nextlastview = $num_rows_ds;} // Letzter Block wenn kleiner als Vorgabe



Zusätzlich will ich nicht nur anzeigen wie viele DS vorhanden sind, und welche gerade angezeigt werden, sondern auch vieviele Seiten es für alle benötigt und welches die aktuelle Seite ist.


CODE
if ($num_rows_ds > 0) // Anzahl der Seiten berechnen
 {
   $anzpages = 1;
$entry = $viewds;
   while($entry < $num_rows_ds){$anzpages = $anzpages + 1; $entry = $entry + $viewds;}
$prepagecount = $pagecount - 1; // Seite X von Y, vorherige Seite
$nextpagecount = $pagecount + 1; // Seite X von Y, nächste Seite


 }



Danach erfolgt der Aufruf der gewünschten Datensätze sowie deren Ausgabe


CODE
// Anzuzeigende DS aufrufen
$sql = "SELECT * ".
      " FROM ".$table.
   " WHERE view = 1 OR view = 0".
   " ORDER BY stamp DESC".
   " LIMIT ".$firstds.",".$viewds.
   " ";

$result = mysql_query ($sql);
$num_rows = mysql_num_rows($result);

echo "<p class=\"text\">Von ".$num_rows_ds." Einträgen werden die Einträge ".$firstview." - ".$lastview." angezeigt. (Seite ".$pagecount." von ".$anzpages.")\n";

$i = $firstview; // Laufende DS-Nummer

while($results = mysql_fetch_array($result,MYSQL_BOTH))
 {
  $row_color = ( !($i % 2) ) ? "row1" : "row2";
 
 echo "<td class=\"$row_color\" valign=\"top\"><p class=\"text_r\">$i</td>\n";
 $i ++;
 }//endwhile



Zum Schluss kommen nun noch die Links zum Blättern. Die aktuelle Seite ist in der Direktauswahl der Seiten fett hervorgehonen und nicht verlinkt


CODE
// Blättern Links
 // Direktwahl, Link für jede Seite erzeugen
 echo "<p class=\"text_r\">[ \n";
 $pagenr = 0;
 $dsnr = 1;
 $link = 1;
 $block = 1;
 $entry = $viewds;
 while($dsnr <= $num_rows_ds) //1 2
   {
 if ($link == 1)
   {
     $pagenr = $pagenr+ 1;
  if ($pagenr > 1){echo "-";}
  if ($pagenr > 1){echo "-";}
if ($pagecount == $pagenr)
{
echo " <b>".$pagenr."</b> ";
}
else
{
echo "<A HREF=\"index.php?page=gb&firstds=".($entry-$viewds)."&pagecount=".$pagenr."\" class=\"link\">".$pagenr."</A>";
}
  $link = 0;
  $entry = $entry + $viewds;
   }
 if ($block == $viewds)
   {
     $block = 0;
  $link = 1;
   }
 $block = $block + 1;
 $dsnr = $dsnr + 1;
} // endwhile
 
 echo " ]\n";
 // Vorwärts/Retour
 echo "<p class=\"text\">[ \n";
 // zurück
 if ($prefirstds >= 0)
 {
   echo "<A HREF=\"http://www.pferde.ch/admin/index.php?page=gb&firstds=$prefirstds&pagecount=$prepagecount\" class=\"link\">Zurück (".$prefirstview."-".$prelastview.")</A>\n";
 }
 // Trenner
 if ($prefirstds >= 0 && $lastview < $num_rows_ds)
 {
 echo " | \n";
 }
 // weiter
 if ($lastview < $num_rows_ds)
 {
   echo "<A HREF=\"http://www.pferde.ch/admin/index.php?page=gb&firstds=$nextfirstds&pagecount=$nextpagecount\" class=\"link\">Weiter (".$nextfirstview."-".$nextlastview.")</A>\n";
 }
 echo " ]\n";
 

// Speicher freigeben und Verbindung trennen
mysql_close($database);



Das ist es soweit. Wer sehen will wie es funktioniert, hier habe ich es z.B. integriert:

Gästebuch 'pferde.ch'
 
QUOTE Hat mich einiges an Denkarbeit gekostet das Ganze umzusetzen. Da ich es schätze bei Fragen etwas konkretere Antworten zu bekommen, hier also mein Lösungsansatz, falls wer froh darum ist was kopieren zu können.


So soll es ja auch sein. Es werden Denkanstöße gegeben, die man dann realisieren kann. So lernst du dies auch und kannst es dann das nächste Mal auch problemlos(er) erledigen
wink.gif



CODE $sql_ds = "SELECT * ".
" FROM ".$table.
" WHERE view = 1 OR view = 0".
" ";


Hier würde ich kein "SELECT *" machen, denn damit liest du ja alles aus, was bei vielen Datensätzen ja recht viel werden kann und das drückt auf die Performance!
Nutze entweder "SELECT COUNT(*) AS zaehler ..." oder wenigstens "SELECT id". Das ist schlanker und schneller.


QUOTE Etwas unpraktisch ist dabei, dass PHP (oder SQL?) nicht bei 1 sondern bei 0 zu zählen beginnt. Der erste Datensatz hat also die Nummer null.


Kommt von SQL so
wink.gif
Ist aber an sich recht normal, Arrays und so fangen auch oft bei 0 an (also zB auch bei Java, C/C++ usw).
 
QUOTE (radarin @ Mo 24.1.2005, 1:41) Das ist es soweit. Wer sehen will wie es funktioniert, hier habe ich es z.B. integriert:

Gästebuch 'pferde.ch'

Oh hübsch, genau den gleichen Schnee hatte ich auch mal auf meiner Website. Und es passt heute sogar so schön zum Wetter
biggrin.gif


Tipp zu deinem Code: HTML-Ausgaben per echo() solltest du dir abgewöhnen. Kostet unnötig Zeit und nerven! Ich empfehle smarty.php.net , die Einarbeitung lohnt sich.
 
Zurück
Oben