unLogischer fehler in Blätterfunktion ?
tafkat
- php
Servus, hallo.
Bin gerade dabei mir ein Gästebuch zu schreiben mit einer PHP (SQL) Blätterfunktion.
Ich glaub ich hab da irgendwo einen komischen Fehler drinne den ich irgendwie nichtmehr finde.
Vielleicht kann sich das ja mal jemand anschauen ;)
<?php
$proseite = "5";
if ($seite == "") { $seite = "1"; }
$start = $seite * $proseite;
$maxseite = ($gesamt/$proseite)-1;
if ($seite >= "0" OR $seite <= $maxseite) {
echo "<table align="center" width="80%" border="1" cellpadding="0" cellspacing="0">\n";
echo" <tr>\n";
echo" <td width="33%" align="left" nowrap>\n";
if ($seite > "0") {
$pre = $seite-1;
echo "<a href="index.php?site=guestbook&seite=$pre">Seite vor $pre</a>\n";
}
echo" </td>\n";
echo" <td width="33%" align="right" nowrap>\n ";
if ($seite < $maxseite) {
$vor = $seite+1;
echo "<a href="index.php?site=guestbook&seite=$vor">Seite zurück $vor</a>\n";
}
echo" </td>\n";
echo" </tr>\n";
echo"</table>\n<br>\n";
}
$abfrage = "SELECT * from $gbtable WHERE valid=1 ORDER BY ID DESC LIMIT $start, $proseite";
$ergebnis = mysql_query($abfrage);
... hier würde die ausgabe beginnen ...
Soweit hat das ja auch hin, aber ich hab scherzhafterweise zum Überprüfen mal die $proseite auf "1" gesetzt und hatte 2 Einträge in der DB.
Mit ist aufgefallen, das der erste Eintrag angezeit wird (was auch nicht korrekt ist) und der Link "Seite vor 0" erscheint.
Klickt man diesen an, kommt man auf eine weitere Seite, jedoch erscheint nicht der Link um wieder eine Seite zurück zu Blättern.
echo $begrüßung;
Ich glaub ich hab da irgendwo einen komischen Fehler drinne den ich irgendwie nichtmehr finde.
Wenn du etwas genauer beobachten und beschreibne könntest, was passiert und was eigentlich hätte passieren sollen, müsste man sich als Antwortender nicht so oft über nicht funktionierende Glaskugeln ärgern.
Soweit hat das ja auch hin, aber ich hab scherzhafterweise zum Überprüfen mal die $proseite auf "1" gesetzt und hatte 2 Einträge in der DB.
Um mit Try-and-Error Fehler zu beseitigen braucht man viel Glück. Du weißt doch, was du erreichen willst, und musst zumindest beim Erstellen des Codes dir einmal Gedanken gemacht haben, was du in den Variablen und von den Ausdrücken für Werte erwartest. Vergleiche nun diese Erwartungen mit dem tatsächlichen Inhalt der Variablen und den Ergebnissen der Ausdrücke. Dazu bieten sich Kontrollausgaben mit echo, print, var_dump() und print_r() an. Ich bin mir sicher, dass du damit dem Fehler auf die Schliche kommst.
echo "$verabschiedung $name";
Was passieren sollte ?
Nun, es sollten die Seiten zu Blättern sein... .
Ich guck mir den Code nun schon seit einer Stunde an und komm nit drauf.
Ich nehme ja auch nur an das es ein Fehler im Rechensyntax ist den ich eingebaut habe.
Da ich das Gästebuch erst komplett neu geschrieben hab und daher noch keinerlei Einträge in der DB vorhanden waren, musste ich die Blätterfunk. ja auch irgendwie Testen.
Hätte ich des net gemacht wär mir das net aufgefallen und zum peinlichen erlebnis geworden wenn das GB Online geht.
Mit var_dump habe ich mich auch schon Probiert aber leider geben mir als PHP Neuling die ausgaben keinen aufschluss.
(Ausser das was ich eh schon weiss)
Zur Erklärung:
Eine Indexseite, auf der maximal 5 Gästebucheinträge zu sehen sein sollen.
Diese soll man daher also durchblättern können.
Bei den letzten < 5 Beiträgen soll das Blättern auf die nächste Seite unterbunden werden.
d.h.
Seite 1 -> aktuelle 5 Einträge + weiterblättern
Seite 2 -> vorherige 5 Einträge + weiterblättern
Seite 3 -> ältere 3 Einträge (kein Link zum weiterblättern)
Hallo,
Nun, es sollten die Seiten zu Blättern sein... .
Ich guck mir den Code nun schon seit einer Stunde an und komm nit drauf.
Guck mal nicht auf den Code, nimm dir lieber ein Blatt Papier, und zeiche dir auf, was bei 4, 5, 6 und 11 Gästebucheinträgen passieren soll. Dann formuliere einen Pseudocode oder zeichne ein Struktogramm
Du hast eine beliebige Anzahl von Datensätzen. Dann bestimme zuerst mal die Anzahl der Seiten. Da ist schon die erste Stelle in deinem Code die mir unklar ist.
$maxseite = ($gesamt/$proseite)-1;
Also (6/5)-1 = 0. Es müssen bei 6 Einträgen aber 2 Seiten werden.
$maxseite ist demnach falsch berechnet.
Analysiere anhand deiner Zeichnung welche Fälle im Code unterschieden werden müssen.
Die erste Seite auf der es keinen "zurück" Link gibt
Die Folgeseiten, auf denen es "zurück" und "weiter" Links gibt
Die letzte Seite auf der es keinen "weiter" Link gibt
Überlege welche Sonderfälle abgefangen werden müssen. Zum Beispiel, das jemand die Parameter in der URL von Hand ändert.
Grüße,
Jochen
Hello,
$maxseite = ($gesamt/$proseite)-1;
Also (6/5)-1 = 0. Es müssen bei 6 Einträgen aber 2 Seiten werden.
$maxseite ist demnach falsch berechnet.
Das hängt davon ab, wie man rechnet. Wie ein Mathematiker oder wie ein Informatiker ;-))
Wenn die sowieso benötigte Seite die Nummer 0 trägt, dann hat die höchste Seite die Nummer 1
Da bei den ganzen Berechnungen später die Zählung von 0 bis (Anzahl-1) vorteilhaft ist, kann er das ruhig so lassen, aber bei der Ausgabe der Bezeichnungen nachher daran denken. Denn der Benutzer würde Seite 1 bis n erwarten...
Tafkat, Du solltest Deinen Code strukturieren. Mische nicht
Woher weiß das Script, welche Seite der Browser als letztes angezeigt hatte?
Oder willst Du die Seiten direkt referenzieren mit einem Link oder Button?
Dann brauchst Du ja nur soviele Links auszugeben, wie es Seiten gibt.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hi Tom,
$maxseite = ($gesamt/$proseite)-1;
Also (6/5)-1 = 0. Es müssen bei 6 Einträgen aber 2 Seiten werden.
$maxseite ist demnach falsch berechnet.Das hängt davon ab, wie man rechnet. Wie ein Mathematiker oder wie ein Informatiker ;-))
Nö,
$maxseite = (4/5)-1=-1 (5/5)-1=0 (6/5)-1=0
Erforderliche Seiten: 1 1 2
Egal ob Mathematiker oder Informatiker, die Rechnung stimmt niemals.
tafkat:
~~~php
$seiten = $gesamt / $proseite
settype($seiten,"integer");
if($seiten % $proseite != 0)
$seiten++;
$seiten würde in diesem Fall bei 1 beginnen. Dein $maxseite ist dann $seiten-1.
Grüße,
Jochen
--
Kritzeln statt texten:
[Scribbleboard](http://www.electric-lemon.de/scribbleboard.php)
Hello,
Nö,
$maxseite = (4/5)-1=-1 (5/5)-1=0 (6/5)-1=0
Erforderliche Seiten: 1 1 2Egal ob Mathematiker oder Informatiker, die Rechnung stimmt niemals.
Du solltest genauer lesen!
Seitennummer != benötigte Seiten
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hallo Tom
$maxseite = (4/5)-1=-1 (5/5)-1=0 (6/5)-1=0
Erforderliche Seiten: 1 1 2Du solltest genauer lesen!
Seitennummer != benötigte Seiten
ja, das ist mir durchaus bewusst.
Das hat aber nichts mit dem oben dargestellten Sachverhalt zu tun. Egal ob ich mit 0 oder 1 beginne seine Rechnung stimmt nicht.
Zur Veranschaulichung für dich:
Seine $maxseite (4/5)-1=-1 (5/5)-1=0 (6/5)-1=0
Erforderliche Seiten 1 1 2
$maxseite sollte aber sein 0 0 1
jetzt deutlicher?
Grüße,
Jochen
echo $begrüßung;
Was passieren sollte ?
Nun, es sollten die Seiten zu Blättern sein... .
Das ist zu allgmein. Am Ende soll zwar der Anwender eine Blätterfunktion zu sehen bekommen, aber wie muss im Detail dazu der Code aussehen, bzw. noch genauer gefragt: An welchen Stellen müssen welche Werte eingefügt sein? Diese Details wirst du dir sicher überlegt haben. Dazu kommen noch die Spezialfälle Zurück-Link auf der ersten Seite und Vorwärts auf der letzten.
Ich guck mir den Code nun schon seit einer Stunde an und komm nit drauf.
Ich nehme ja auch nur an das es ein Fehler im Rechensyntax ist den ich eingebaut habe.
Und den bekommt man zwar theoretisch auch mit Code-Anschauen raus, doch nach meiner Erfahrung sieht man manchmal solange dran vorbei bis einem die Kontrollausgaben mit der Nase draufstoßen.
Da ich das Gästebuch erst komplett neu geschrieben hab und daher noch keinerlei Einträge in der DB vorhanden waren, musste ich die Blätterfunk. ja auch irgendwie Testen.
Nicht nur fürs Trockenschwimmen ist es sinnvoll, Teilaufgaben des Programms auszulagern. Das könntest du für die Datenbeschaffung tun. Und für das Testen ohne Datenbank kannst du von dieser Funktion erst einmal Dummy-Daten zurückgeliefert bekommen, die wie die später von der Datenbank gelieferten Datensätze aussehen.
Mit var_dump habe ich mich auch schon Probiert aber leider geben mir als PHP Neuling die ausgaben keinen aufschluss. (Ausser das was ich eh schon weiss)
Nun, wenn die Ausgabe deiner Erwartung entspricht, ist ja alles in Ordnung. Aber dann müsste ja auch ein richtiges Ergebnis entstehen. Also: an irgendeiner Stelle stimmt doch beides nicht überein.
Welche beiden Werte müssen denn für die LIMIT-Klausel eingetragen werden, um die ersten 5 Datensätze zu bekommen? Und wenn du $start als $seite (=1) * $proseite (=5) initialisierst, welchen Wert hast du dann darin? Nach meiner Rechnung kommt da 5 raus, MySQL zählt aber bei 0 los.
echo "$verabschiedung $name";