Sascha: Bräuchte dringend mal Hilfe!

Hallo,

habe mal eine kleine Funktion gebastelt, welche nicht ganz funmktioniert, leider! Die Aktion "Erste Seite" und "Nächste Seite" funktionieren einwandfrei, nur die Aktion "Vorherige Seite" nicht.

Wer kann mir sagen, was an meinen Script da falsch ist?

//Zählen der Datensätze

$counter = mysql_query("SELECT Count(*) as total FROM downloadprogramme,downloadzusatz where downloadprogramme.id=downloadzusatz.id AND TO_DAYS(NOW()) - TO_DAYS(timestamp) <= 7 ORDER BY downloadprogramme.datum DESC,downloadprogramme.titel");
$eintraege = mysql_fetch_array($counter);

echo "<div align="center"><table><tr><td bgcolor="";
echo $h_beschr;
echo "">Einträge: ";
echo $eintraege[total];
echo "</td>";
echo "<td colspan="5" bgcolor=";
echo $h_beschr;

$eintrag = bcadd($eintrag, $zps, 0);
$eintrag2 = bcsub($eintrag, $zps, 0);
echo ">[ <a href="index.php?session=neuzugang&eintrag=";
echo $eintrag2;
echo "">Vorherige Seite</a> |<a href="index.php?session=neuzugang&eintrag=";
echo $eintrag;
echo "">Nächste Seite</a> | <a href="index.php?session=neuzugang">Erste Seite</a>]</td></tr>";
echo "</table></div>";

Besten Dank vorab.

Mfg.

Sascha

  1. Grüssi!

    Wiederholst du das jetzt so oft bis du eine Antwort bekommst?
    <?m=140754&t=27025>

    habe mal eine kleine Funktion gebastelt, welche nicht ganz funmktioniert, leider! Die Aktion "Erste Seite" und "Nächste Seite" funktionieren einwandfrei, nur die Aktion "Vorherige Seite" nicht.

    $eintrag = bcadd($eintrag, $zps, 0);
    $eintrag2 = bcsub($eintrag, $zps, 0);

    Du bist dir dessen bewusst was du hier machst? du liest aus der Variable aus, die du änderst! ich würde die Variable auf die zugewiesen werden soll umbenennen in '$eintrag1' oder noch besser, einen Namen vergeben, unter dem man sich etwas konkreteres vorstellen kann, z.b. $vorige_seite und $naechste_seite ;-)

    wo definierst du $eintrag? Es sollte dir klar sein, dass bei einer Zuweisung zuerst der Teil links vom '=' Operator ausgewertet wird. Wenn $eintrag da nicht definiert ist, wird auch nix (bzw. nur Kauderwelsch) zugewiesen!

    Schuss ins Blaue: Sollte es vielleicht bcadd($eintraege, $zps, 0) heissen?

    lg bernhard

    PS: http://www.php.net/manual/en/function.bcadd.php
        http://www.php.net/manual/en/function.bcsub.php

    1. Grüssi!

      wo definierst du $eintrag? Es sollte dir klar sein, dass bei einer Zuweisung zuerst der Teil links vom '=' Operator ausgewertet wird.

      Völliger Schwachsinn, sorry: es wird natürlich die RECHTE Seite zuerst ausgewertet ... *kopfschlag* ... ich werde langsam mürbe ;-)

      lg bernhard

    2. Hallo,

      erstmal besten Dank für deine Antwort.

      Antwort auf deine Frage, wieoft ich diesen Beitrag wiederhole:
      Also ich habe die Frage etwas umformuliert, weil niemand geantwortet hat. Das habe ich nämlich schon öfters bemerkt, wenn es nicht sehr gut formuliert ist, dann bekommt man zu 99% keine Antwort weder hier noch in der NG, also dachte ich mir, muß ich wohl das so formulieren, das es auch andere verstehen.

      so zu deiner nächsten Frage, wo ich das definiere:

      also weiter oben im Script, ist folgende Definition drin, über meiner Ausgabetabelle wird das sozusagen definiert, und zwar wie folgt:

      $result         =  mysql_query("select * from downloadprogramme,downloadzusatz where downloadprogramme.id=downloadzusatz.id AND TO_DAYS(NOW()) - TO_DAYS(timestamp) <= 7 ORDER BY downloadprogramme.datum DESC,downloadprogramme.titel LIMIT $eintrag,$zps",$verbindung);

      Und somit ist $eintrag schon richtig! Es geht ja auch fast alles, bis auf die Funktion "Vorherige Seite"

      PS: http://www.php.net/manual/en/function.bcadd.php
          http://www.php.net/manual/en/function.bcsub.php

      und die Links bzw. die deutsch davon kann man im großen ganzen in der Pfeife rauchen. Da war ich schon, und bin eigentlich nicht weiter als vorher! Das große Mango in vielen Handbüchern, Tutorials & Co. ist leider das sehr häufig einfach die Praxisbezogenen Beispiele fehlen! Wäre wenigstens 1 oder 2 Beispiele pro Befehl / Funktion mal genannt - müssen ja keine riesigen sein - würde es Anfängern das wesentlich auch leichter fallen, und sehr viele Fragen würden dann erst garnicht gestellt!

      Ich habe auch ein teures Buch mal zu PHP gekauft, wo am Rande auch MySQL behandelt wird, auch da ist nicht alles drin!

      Mfg.

      Sascha

      Grüssi!

      Wiederholst du das jetzt so oft bis du eine Antwort bekommst?
      <?m=140754&t=27025>

      habe mal eine kleine Funktion gebastelt, welche nicht ganz funmktioniert, leider! Die Aktion "Erste Seite" und "Nächste Seite" funktionieren einwandfrei, nur die Aktion "Vorherige Seite" nicht.

      $eintrag = bcadd($eintrag, $zps, 0);
      $eintrag2 = bcsub($eintrag, $zps, 0);

      Du bist dir dessen bewusst was du hier machst? du liest aus der Variable aus, die du änderst! ich würde die Variable auf die zugewiesen werden soll umbenennen in '$eintrag1' oder noch besser, einen Namen vergeben, unter dem man sich etwas konkreteres vorstellen kann, z.b. $vorige_seite und $naechste_seite ;-)

      wo definierst du $eintrag? Es sollte dir klar sein, dass bei einer Zuweisung zuerst der Teil links vom '=' Operator ausgewertet wird. Wenn $eintrag da nicht definiert ist, wird auch nix (bzw. nur Kauderwelsch) zugewiesen!

      Schuss ins Blaue: Sollte es vielleicht bcadd($eintraege, $zps, 0) heissen?

      lg bernhard

      PS: http://www.php.net/manual/en/function.bcadd.php
          http://www.php.net/manual/en/function.bcsub.php

      1. Grüssi!

        Antwort auf deine Frage, wieoft ich diesen Beitrag wiederhole:

        [...]

        Das Wesen dieses Forums, ist, dass es kaum einen Beitrag "sterben" lässt ;-) Auch wenns nicht so aussieht, aber auch die Beiträge weiter unten werden gelesen. Und zwar gerade von den Leuten, die den anderen den Vortritt lassen wollen, und dann die noch nicht ausreichend beantworteten Fragen sich herauspicken. Das sind meistens die Leute, die hier am meisten Ahnung von der Materie haben ;-)

        also weiter oben im Script, ist folgende Definition drin, über meiner Ausgabetabelle wird das sozusagen definiert, und zwar wie folgt:

        $result         =  mysql_query("select * from downloadprogramme,downloadzusatz where downloadprogramme.id=downloadzusatz.id AND TO_DAYS(NOW()) - TO_DAYS(timestamp) <= 7 ORDER BY downloadprogramme.datum DESC,downloadprogramme.titel LIMIT $eintrag,$zps",$verbindung);

        oh, das habe ich dann übersehen.

        Und somit ist $eintrag schon richtig! Es geht ja auch fast alles, bis auf die Funktion "Vorherige Seite"

        Trotzdem kann ich mir den Sinn hinter einer Zuweisung auf $eintrag nicht erklären!

        PS: http://www.php.net/manual/en/function.bcadd.php
            http://www.php.net/manual/en/function.bcsub.php

        und die Links bzw. die deutsch davon kann man im großen ganzen in der Pfeife rauchen. Da war ich schon, und bin eigentlich nicht weiter als vorher!

        Wieso? bcadd($a,$b,3) zum Beispiel gibt dir die Summe aus $a+$b auf drei Kommastellen genau aus. Steht ja auch so in der Beschreibung. Der Vorteil dabei ist, dass strings gleich intern in Zahlen konvertiert werden. Für deine Zwecke könntest du dir diese Funktion wahrscheinlich sparen

        Wenn ich richtig in der Annahme gehe, dass $zps soviel heisst wie 'Zeilen-pro-Seite', dann weise ich dich nochmal auf die Stelle hin: Schreiben wir die zwei Anweisungen vielleicht etwas verständlicher an:

        $eintrag = $eintrag + $zps;
        $eintrag2 = $eintrag - $zps;

        Ich nehme mir in solchen Situationen immer Zettel und Stift zur hand, und beginne mal zu schreiben:

        Angenommen $zps hat den wert '10', und $eintrag den Wert '20' Das heisst also wir befinden uns auf der zweiten Seite, und wollen uns  gerade die Einträge 10-20 ansehen. Soweit so gut. Nun wollen wir die Indexzahlen für die vorige/nächste Seite berechnen, und kommen zur ersten Anweisung:

        $eintrag = $eintrag + $zps;  // mit eingesetzten Werten: $eintrag = 20 + 10;

        Scheint alles in Ordnung zu sein. Aber jetzt kommt der Blödsinn ;-)

        $eintrag2 = $eintrag - $zps;

        Welchen Wert hat $eintrag jetzt? Schon vergessen? Dann schnell auf den Zettel schauen: Jawohl: !! 30 !! Du rechnest jetzt also:

        $eintrag2 = 30 - 10; // $eintrag2 ist also == 20 !!

        Jetzt starte mal den Versuch und ersetze alle '$eintrag' durch '$naechste' und alle '$eintrag2' durch '$vorherige'. Dann sollte es dir auf einen Schlag einschiessen ;-) Genau darum sollte man immer möglichst 'sprechende' namen für seine Variablen verwenden, und mit Zuweisungen auf sich selber sparsam umgehen!

        War das der Fehler? Du hast nämlich nicht gesagt wie sich der Fehler äussert, hier jedenfalls müsste bei Klick auf den 'Vorherige Seite' Link die aktuelle Seite nochmal aufgerufen werden. Wenn das der Fehler war, sollte er jetzt gelöst sein ;-)

        Ich habe auch ein teures Buch mal zu PHP gekauft, wo am Rande auch MySQL behandelt wird, auch da ist nicht alles drin!

        Falls du dir noch eins kaufen willst, hätt ich ein Gutes, mit vielen Codebeispielen: PHP - Grundlagen und Lösungen, von Jörg Krause, im Hanser Verlag. Steht bei mir halbgelesen in der Ecke, und wartet darauf, endlich mal genau studiert zu werden ;-)

        lg Bernhard

        1. Hallo,

          erstmal vielen Dank für die sehr gute Erklärung!
          War sehr verständlich.

          Kam auch schon etwas weiter ...

          Wenn ich richtig in der Annahme gehe, dass $zps soviel  heisstwie 'Zeilen-pro-Seite', dann weise ich dich nochmal auf die Stelle hin: Schreiben wir die zwei Anweisungen vielleicht etwas verständlicher an:

          ... da hast du richtig angenommen $zps heißt tatsächlich Zeilen-pro-Spalte, und diese Anzahl habe ich in meiner config.php4 drin stehen, die zu diesem kompletten Script da gehört. Derzeit habe ich diesen Wert auf 5 stehen, da meine Zeilen in Tabellen ja ausgeben werden, und diese schon recht umfangreich sind, bei 10 wäre die Seite gigangtisch lang, darum teste ich derzeit mit 5.

          Nun da mir nun tausend Leute klargemacht haben, das eine einfache Bereichnung mit + bzw. - da ausreichen, habe ich das wie folgt mal geändert:

          echo "<div align="center"><table><tr><td bgcolor="";
          echo $h_beschr;
          echo "">Einträge: ";
          echo $eintraege[total];
          echo "</td>";
          echo "<td colspan="5" bgcolor=";
          echo $h_beschr;

          $vorherige = $zps - $vorherige;

          $naechste = $eintrag + $zps;

          echo ">[ <a href="index.php?session=neuzugang&eintrag=";
          echo $vorherige;
          echo "" style="text-decoration:none"><font color="#0000FF"><font size="3">Vorherige Seite</a> | <a href="index.php?session=neuzugang&eintrag=";
          echo $naechste;
          echo "" style="text-decoration:none">Nächste Seite</a> | <a href="index.php?session=neuzugang" style="text-decoration:none">Erste Seite</a> </font></font>]</td></tr>";
          echo "</table><br>
          </div>";

          Habe auch die Variablenamen verändert, wobei bei $naechste das $eintrag stehen bleiben muß, sonst funktioniert das nicht mehr, wie ich es erlebt habe. Und bei $vorherige durfte kein $eintrag stehen, ging so zumindest nicht mehr.

          Wie es im moment da steht, funktioniert das schon mal wesentlich besser als zuvor. Auch das mit vorherige Seite geht nun, wobei noch nicht perfekt, leider.

          Also die ersten 5 Einträge anschauen kein Problem, auf nächste Seite also zu Eintrag 5 bis 10 geht auch usw. - alles perfekt! So von Eintrag z.B. 10 bis 15 auf Eintrag 5 bis 10 zurückblättern funktioniert auch bestens und fehlerfrei. Von noch höheren gehts logischerweise auch! Nur wenn ich auf Seite mit Eintrag 5 bis 10 bin, komme ich leider nich mit vorheriger Seite zu den ersten 5 Einträgen! Das ist das einzigste was nicht geht!

          Gibts dafür auch noch irgendwie eine Möglichkeit oder einen Trick, wie ich das hinbekommen könnte? Ich hab da versucht was mit if oder for zu basteln, aber das führte irgendwie nicht zu dem was ich wollte.

          Vielleicht hat ja jemand da noch einen Tipp für mich, was sehr super wäre.

          Besten Dank im voraus.

          Mfg.

          Sascha

          1. Grüssi!

            $vorherige = $zps - $vorherige;

            Sollte das nicht $vorherige = $eintrag - $zps heissen? Du solltest auch noch sicherheitshalber eine if-Abfrage einbauen, damit du sicherstellst dass $vorherige nicht negativ wird!

            Lass dir die Werte von $vorherige, $naechste und $eintrag einfach mal auf jeder Seite irgendwo am Bildschirm ausgeben, und dann vergleiche, so kommst du wahrscheinlich ziemlich schnell auf eine Lösung!

            if ($vorherige < 0) {$vorherige = 0; } // oder halt der Wert bei dem der Index startet!

            lg bernhard

            1. Hallo Bernhard,

              tausendfachen Dank.

              Es muste tatsächlich $vorherige = $eintrag - $zps heißen, und das war die endgültige Lösung aufs Problem.

              Und in Verbindung mit if ($vorherige < 0) {$vorherige = 0; }
              klappt es nun wunderbar. Fazit => Problem behoben.

              Also nochmals besten Dank.

              Mfg.

              Sascha

              Grüssi!

              $vorherige = $zps - $vorherige;

              Sollte das nicht $vorherige = $eintrag - $zps heissen? Du solltest auch noch sicherheitshalber eine if-Abfrage einbauen, damit du sicherstellst dass $vorherige nicht negativ wird!

              Lass dir die Werte von $vorherige, $naechste und $eintrag einfach mal auf jeder Seite irgendwo am Bildschirm ausgeben, und dann vergleiche, so kommst du wahrscheinlich ziemlich schnell auf eine Lösung!

              if ($vorherige < 0) {$vorherige = 0; } // oder halt der Wert bei dem der Index startet!

              lg bernhard

  2. Hallo Sascha!

    lass dir mal Ausgeben was du da eigentlich tust:

    ....

    echo $eintrag,"<br>";

    $eintrag = bcadd($eintrag, $zps, 0);

    echo $eintrag,"<br>";

    $eintrag2 = bcsub($eintrag, $zps, 0);

    echo $eintrag2,"<br>";

    Ansonsten verstehe nicht wieso du die BCMath Funktionen verwendest, oder hast du mehr als 2147483647 Seiten?

    ein simples
     $naechster_eintrag=$eintrag + $zps;
     $voriger_eintrag=$eintrag-$zps;
    sollte es doch auch tun.

    Gruss,
     Carsten