Datenbank-Abfrage seitenweise ausgeben

Alles, was PHP betrifft, kann hier besprochen werden.

Datenbank-Abfrage seitenweise ausgeben

Postby hilfe » 31. May 2005 21:47

Hallo Leute,

als Anfänger übersieht man ja schonmal etwas. Habe ein Script abgetippt und zigmal auf (Ab)Schreibfehler geprüft. Es will einfach nicht funktionieren? Kriege nur diese Meldung:

Parse error: parse error, unexpected ';' in C:\xampp\htdocs\sbo_test\showdata.php on line 22

Hier das Script:
Code: Select all
<?php

//Verbinden zur Datenbank

   require('connect.php');


//Datensätze durchblaettern
   
   function blaettern($show, $limit)
{
   $querystr = "SELECT count(*) as NUM
           FROM $tabellenname";
   $num = mysql_query($querystr);
   $num = mysql_fetch_array($num);
   $num = $num["num"];

   if ($show>0)
{
   $show = $show - 10;
   print ("<a href=\"$PHP_SELF?show="
    ."$show& limit=$limit\">";
   print  "Vorherige Seite</a>";
   print  "&nbsp;|&nbsp;";
}
   if (($show + 20 + $limit) < $num)
{
   $show = $show + 20;
   print "<a href=\"$PHP_SELF?show="
    ."$show& limit=$limit\">";
   print "Nächste Seite</a>";
}
   elseif (($show + 20 + $limit) >=$num)
{
   print "Nächste Seite";
}
}

?>


Wer sieht das was ich nicht sehe und kann mir helfen?[/i][/quote]
hilfe
 
Posts: 27
Joined: 16. July 2004 19:44

Postby Wiedmann » 31. May 2005 22:11

Zeile 22 müsste dann diese sein?
Code: Select all
print ("<a href=\"$PHP_SELF?show="."$show& limit=$limit\">";


BTW:
Alles was geöffnet wird, muss uach wieder geschlossen werden.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby hilfe » 01. June 2005 20:34

Oder es gehört gar keine Klammer dorthin.
(Jo..Danke)
hilfe
 
Posts: 27
Joined: 16. July 2004 19:44

Postby hilfe » 01. June 2005 22:14

Hm.. jetzt sieht die Sache folgendermaßen aus:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\sbo_test\zeige.php on line 15
Nächste Seite

hier meine connect.php

Code: Select all
<?php
$tabellenname="termine";
$link = mysql_connect("localhost", "root", "");
mysql_select_db("sbo", $link);
?>


und das Script mit dem ich meine Datensätze anzeigen möchte:

Code: Select all
<?php

//Verbinden zur Datenbank

   require('connect.php');


//Datensätze durchblaettern
   
   function blaettern($show, $limit)
{
   $querystr = "SELECT count( *) as NUM
           FROM $tabellenname";
   $num = mysql_query($querystr);
   $num = mysql_fetch_array($num);
   $num = $num["num"];

   if ($show>0)
{
   $show = $show - 10;
   print  "<a href=\"$PHP_SELF?show="
    ."$show& limit=$limit\">";
   print  "Vorherige Seite</a>";
   print  "&nbsp;|&nbsp;";
}
   if (($show + 20 + $limit) < $num)
{
   $show = $show + 20;
   print "<a href=\"$PHP_SELF?show="
    ."$show& limit=$limit\">";
   print "Nächste Seite</a>";
}
   elseif (($show + 20 + $limit) >=$num)
{
   print "Nächste Seite";
}
}
   blaettern($show, 10);
?>


Muß ich die Variable $link aus der connect.php noch irgendwo einbauen ?
Wo? Oder habe ich noch so eine dämliche Sache wie die geöffnete Klammer zuvor übersehen?
hilfe
 
Posts: 27
Joined: 16. July 2004 19:44

Postby Wiedmann » 02. June 2005 12:06

Muß ich die Variable $link aus der connect.php noch irgendwo einbauen ? Wo? Oder habe ich noch so eine dämliche Sache wie die geöffnete Klammer zuvor übersehen?

k.a.

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\sbo_test\zeige.php on line 15

Warum lässt du dir dann nicht einfach eine mögl. Fehlermeldung dort anzeigen wo die "result resource" definiert werden soll?
Code: Select all
$num = mysql_query($querystr) or die(mysql_error());


(Ob es wirklich sinnvoll ist, hier überall mit der selben Variablen zu arbeiten?)
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Hm. Versuch's mal ao:

Postby TConnect » 05. June 2005 02:07

Hi,

also ich hab jetzt nicht den ganzen Thred gelesen, aber irgendwie ist mir das LIMIT nicht aufgefallen. Ist schon spät, vielleich hab ich das ja auch einfach nur übersehen.

Also ich mache das so (DB-Connect vorausgesetzt):

0. Grundsätzliche Voraussetzungen:

Gehen wir mal davon aus, dass der Benutzer sowohl den Offset als auch das Limit mit übergeben kann, dann überprüfe ich als erstes, ob die beiden Variabeln existieren und wenn ja, ob es Zahlen sind:

[code]if(!is_numeric($_GET["offset"])) {
$_GET["offset"] = 0;
}

if(!is_numeric($_GET["limit"])) {
$_GET["limit"] = 10;
}[/code]


1. Zählen, wie viele Datensätze eigentlich in Frage kommen:

[code]$query = "SELECT COUNT(*) FROM tabelle WHERE col1 like '" . $value1 . "'";

$qresult = @mysql_query($where . $query);
$array_count = @mysql_fetch_array($qresult);[/code]

In $array_count[0] ist das Ergebnis als INT abgelegt. Angenommen, ich habe hier 67 Datensätze gezählt, und ich weiß, wie viele maximalen Seiten es geben kann. Dabei muß ich aber berücksichtigen, ob der Max-Wert glatt durch das Limit teilbar ist, oder nicht, da ich ansonsten nämlich noch eine Restseite mehr berücksichtigen muß:

Die Funktion floor() rundet immer bis zum nächst unteren Integer ab:
[code]$max_pages = floor($array_count[0] / $_GET["limit"]); [/code]


Jetzt ermittelt man über den Modulo (der Rest nach einer Division), ob das $array_count[0] glatt durch das Limit teilbar ist, oder nicht. Das ist der Fall, wenn als Rest 0 bleibt, wie z.B. bei 10/5 oder 40/10.
[code]if($array_count[0] % $_GET["limit"] > 0) {
$max_pages++;
}
$current_page = ($_GET["offset"] / $_GET["limit"]) + 1;[/code]


3. Layout für die Seitenzahlen entwerfen (spätere Links auf der Internetseite):

[code]for($i=0; $i < $max_pages; $i++) {
$link = "<a href=\"datei.php?offset=" . ($i * $_GET["offset"]);
$link .= "&limit=" . $_GET["limit"] . "\">";
if($i == $current_page) {
$link .= "<b>" . ($i +1) . "</b>";
} else {
$link .= ($i + 1);
}
$link .= "</a>";
// Hier ggf. $link formatiert ausgeben lassen...
}[/code]

Wie Du das später layouterisch regelst, schaust Du am besten selber.


4. Eigentliche Query ausführen:

[code]$query = "SELECT * FROM tabelle WHERE col1 like '" . $value1 . "'";
$query .= " LIMIT " . $_GET["offset"] . ", " . $_GET["limit"];

$qresult = @mysql_query($query);
$countresult = @mysql_num_rows($qresult);
if($countresult >= 1) {
for($y=0; $y < $countresult; $y++) {
@mysql_data_seek($qresult, $y);
$values = @mysql_fetch_array($qresult, MYSQL_ASSOC);
}
} else {
$errorcode = "Keine Datensätze...?!?";
}[/code]


Die Query beinhaltet eigentlich nur noch die Darstelltung. Die Links zu den Seiten hast Du ja weiter oben schon erstellt.



Liebe Grüße
TConnect
TConnect
 
Posts: 100
Joined: 31. March 2004 22:26

Postby $Ben » 10. June 2005 17:48

Die FAQ bietet dazu auch etwas:
:arrow: http://php-faq.de/q/q-mysql-seitenweise.html

Grüße Ben.
$Ben
 
Posts: 25
Joined: 26. March 2005 22:24
Location: Remagen


Return to PHP

Who is online

Users browsing this forum: No registered users and 57 guests