Gummibärchennascher: max. Einträge aber wie ??

Hi ich bin Torsten,

ich habe ein kleine Frage.
Kann mir jemand von Euch erklären wie ich es im Grund aufbaue das mir nicht mehr wie 10 Einträge pro Seite in einem Gästebuch auf der Webseite angezeigt werden ?
Ich habe keinerlei Anhaltspunkte wie ich das machen soll.
Unter dem Gästebuch sollen dann dynamisch zu den Einträgen die Seitenzahlen stehen. Also 10 Einträge = 1 Seite 40 Einträge = 4 Seiten usw. Sorry bitte könnt ihr mir helfen ?

Danke Torsten !!

  1. Hallo Thorsten,

    sag doch erstmal, wie Dein Gästebuch gebaut ist. Datenbank? Datei?

    Danke Torsten !!

    Bitte Andreas

    1. Ok Andreas mein Gästebuch funktioniert oder soll über txt. Dateien
      funktionieren.
      Die Grundfunktion wie schreiben ausgeben und lesen habe ich nur ich möchte halt diverse Extras einbauen.
      Ich hoffe das hilft dir weiter.

      Danke Torsten

      1. Die Grundfunktion wie schreiben ausgeben und lesen habe ich...

        schön! und wie stehen die Einträge in der Datei? Hast Du ein Trennzeichen? Alle zusammen in einer Datei?

        Gruß, Andreas

        1. Die Grundfunktion wie schreiben ausgeben und lesen habe ich...
          schön! und wie stehen die Einträge in der Datei? Hast Du ein Trennzeichen? Alle zusammen in einer Datei?

          Gruß, Andreas

          Ok hier ist der Code

          <?php
          include 'inc\config.inc';
          if ($action == "senden")
          {
          $datei = fopen ($file, "a+");
          $eintrag = $name."|".$email."|".$kommentar."|";
          $eintrag = str_replace (array ("\r\n", "\r", "\n"), array ("<br>", "<br>", "<br>"), $eintrag);
          fwrite ($datei, $eintrag."\r\n");
          fclose ($datei);
          echo $danke;
          }
          else
          {
          include 'formular.php';
          foreach (array_reverse (file($file)) as $array)
           {
          $inhalt = explode('|', $array);
          include 'gaestebuch.php';
           }
          }
          $zeilen = count(file($file));
          ?>

          1. Moin!

            Ok hier ist der Code

            Der Code kommt mir aus [pref:t=59275&m=333093] seltsam bekannt vor.

            Und tatsächlich hast du das letzte Posting von Tobias noch nicht beantwortet. Seine Hilfestellung hilft dir exakt auch mit diesem Problem der limitierten Ausgabe der Gästebucheinträge.

            Aber nochmal die Kurzform: Lies die gesamte Datei in ein Array ein und gib dann nur den für die jeweilige Seite gewünschten Teil aus.

            Anhand der Größe des Arrays (Einträge zählen) kannst du außerdem dynamisch Links zu allen Seiten ausgeben.

            Ich hätte es wesentlich besser gefunden, wenn du in deinem alten Posting weitergemacht hättest.

            - Sven Rautenberg

            --
            ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
            1. Sven du hast Recht ich arbeite mit meinem Bruder an dem Projekt Gästebuch. Deshalb 2 mal der selbe Code. Also pass auf wir fangen gerade an php zu lernen und ich glaube wir haben ein zu grosses Projekt begonnen. Doch wir wollen gern ein eigenes Buch.

              So nun zu den Probs.
              Wir haben das mit dem array_reverse hinbekommen.
              Es dreht uns die Einträge nun andersrum so das die neusten Einträge oben stehen.
              Doch laut dem Eintrag von Tobias soll das wohl mit 2 dimensianalen Arrays besser funktionieren ?
              Wir grübeln die ganze Zeit und testen doch wir bekommen das nicht gebacken...ist es besser wir geben auf ?

              Ok so siehts jetzt bei UNS aus ... lol !

              Code :

              <?php
              include 'inc\config.inc';
              if ($action == "senden")
              {
              $datei = fopen ($file, "a+");
              $eintrag = $name."|".$email."|".$kommentar."|";
              $eintrag = str_replace (array ("\r\n", "\r", "\n"), array ("<br>", "<br>", "<br>"), $eintrag);
              fwrite ($datei, $eintrag."\r\n");
              fclose ($datei);
              echo $danke;
              }
              else
              {
              include 'formular.php';

              an der Stelle tauschen wir die Einträge

              foreach (array_reverse (file($file)) as $array)
               {
              $inhalt = explode('|', $array);
              include 'gaestebuch.php';
               }
              }
              ?>

              Wie sollen wir das mit den 2 dimensinalen Arrays machen ?
              Ciao Torsten und Klausi
              Danke schön

              1. hi,

                Wir haben das mit dem array_reverse hinbekommen.
                Es dreht uns die Einträge nun andersrum so das die neusten Einträge oben stehen.

                von hinten durch die brust ins auge also ...

                ich würde davon ausgehen, dass der vorgang "neuen eintrag einfügen" wesentlich weniger oft vorkommt als der vorgang "bisherige einträge anzeigen" - also wäre mir euer weg, bei _jeder_ ausgabe das ganze umzudrehen, zu unperformant.

                warum nicht gleich die einträge "rückwärts" in die datei schreiben?

                • datei öffnen, alle bisherigen einträge auslesen
                • datei im _überschreibenden_ modus öffnen
                • neuen datensatz zuerst reinschreiben
                • alle alten datensätze anhängen

                der kleine vorteil, dass bisher nur "a+" als öffne-modus und schreiben eines einzelnen datensatzes nötig ist, fällt zwar weg.
                aus gründen der performance und um redundantes ausführen des "umdrehens" zu vermeiden, würde ich den von mir beschriebenen weg aber trotzdem vorziehen.

                gruss,
                wahsaga

                1. hi wahsaga,

                  du hast uns schon so oft geholfen, doch wir denken das ist erst mal die Funktion die wir uns wünschen. Umdrehen anzeigen fertig. Was uns nun fehlt und das haben wir bzw. ich Torsten gepostet wir können wir uns max. 10 pro Seite anzeigen lassen ?

                  Wir haben keinerlei Ideen wie wir das realisieren sollen.
                  Wir arbeiten ohne DB d.h. mit txt. Dateien und wir schreiben die Einträge über eine Variable in die Datei.
                  Über ein Zeichen werden die Daten getrennt und in ein Array eingelsen welches später zur Ausgabe dient.

                  Hier auch für dich der Code:

                  <?php
                  include 'inc\config.inc';
                  if ($action == "senden")
                  {
                  $datei = fopen ($file, "a+");
                  $eintrag = $name."|".$email."|".$kommentar."|";
                  $eintrag = str_replace (array ("\r\n", "\r", "\n"), array ("<br>", "<br>", "<br>"), $eintrag);
                  fwrite ($datei, $eintrag."\r\n");
                  fclose ($datei);
                  echo $danke;
                  }
                  else
                  {
                  include 'formular.php';
                  foreach (array_reverse (file($file)) as $array)
                   {
                  $inhalt = explode('|', $array);
                  include 'gaestebuch.php';
                   }
                  }
                  ?>

                  Falls du Fragen hast frag einfach.
                  Denk bitte dran wir lernen das gerade also wenns möglich ist ein bissel ausführlicher ..... rofl * jetzt stellen die noch Ansprüche *

                  Danke Klausi und Torsten

                  1. hi,

                    du hast uns schon so oft geholfen,

                    freut mich.

                    doch wir denken das ist erst mal die Funktion die wir uns wünschen. Umdrehen anzeigen fertig.

                    war ja auch nur ein vorschlag.
                    _ich_ würde es wie gesagt anders machen wollen, aus den genannten gründen.
                    aber das muss euch ja nicht beeinflussen, wenn eure lösung funktioniert, dann ist das ja durchaus ausreichend.

                    Was uns nun fehlt und das haben wir bzw. ich Torsten gepostet wir können wir uns max. 10 pro Seite anzeigen lassen ?
                    Wir haben keinerlei Ideen wie wir das realisieren sollen.

                    Sven hat euch doch in [pref:t=59326&m=333470] schon seinen vorschlag dazu gepostet. wenn unklarheiten bestehen, wie genau das umzusetzen ist, dann zeigt doch an der stelle mal her, was ihr bisher zur umsetzung dieses vorschlages an code realisiert habt, dann können wir euch bei _konkreten_ problemen damit weiterhelfen.

                    gruss,
                    wahsaga

                    1. Hi hier Torsten und Klausi,

                      ich glaube wir sind zu blöd das zu realisieren,

                      allso was haben wir ?

                      Code:

                      $zeilen = count(file($file));
                      $seitenanzahl = ceil($zeilen / $proseite);

                      if ($zeilen < $proseite)
                      {
                      $seite1 = 1;
                      echo "<a href="index.php?page=$seite">".$seite."</a> |\n";
                      }
                      else
                      {
                      ?????????
                      }

                      irgendwie ist bei uns der Knoten drinne. Wie solls den weitergehen ?
                      Es tut uns leid wenn wir euch so nerven.
                      Anfänger halt..... zu ....... zu blöd.

                      Ok trotzdem Danke für eure Mühen !!
                      Klausi und Torsten !!

                      1. hi,

                        irgendwie ist bei uns der Knoten drinne. Wie solls den weitergehen ?

                        also schön, nochmal ein paar kleine hints ...

                        um eine "blättern"-funktion zu realisieren, muss natürlich irgendwie festgestellt werden, welche seite denn aktuell angezeigt werden soll.
                        dazu eignet sich z.b. eine übergabe eines parameter über den URL der seite.

                        script.php?seite=3

                        nach $seite = $_GET['seite'] habt ihr dann in eurem script in script.php den wert 3 in $seite zur verfügung.

                        beim ersten aufruf der seite wird wahrscheinlich kein parameter übergeben, also nur script.php aufgerufen. diesen fall müsst ihr natürlich abfangen, wenn also $_GET['seite'] nicht übergeben wird, dann solltet ihr den wert $seite manuell auf 1 setzen.

                        so, jetzt zur ausgabe.
                        das array mit den einträgen haben wir ja jetzt (endlich ...) in absteigend sortierter reihenfolge vorliegen, nennen wir es $eintraege.

                        nehmen wir jetzt an, es sollen die einträge 11 bis 20 ausgegeben werden - es muss also nacheinander der zugriff auf $eintraege[10], $eintraege[11], ..., $eintraege[19] erfolgen (ihr erinnert euch, php fängt beim zählen mit 0 an, also immer eins weniger).

                        dazu ist z.b. eine for-schleife geeignet,

                        for(var $i=10; $i <=19; $i++)
                        {
                          echo $eintraege[$i];
                        }

                        so, damit hätten wir den teil, dass immer nur ein bestimmer bereich ausgegeben werden soll, hier im beispiel eben eintrag 11 bis 20.

                        jetzt brauchen wir noch den link auf dir vorherige seite und auf die nächste.

                        dazu geben wir einen link mit parameter ?seite=$seite-1 und einen mit ?seite=$seite+1 per echo aus.
                        dabei natürlich überprüfen, ob dabei nicht seite null herauskäme, oder eine seite 11, obwohl wir nur 97 einträge haben und jeweils 10 pro seite anzeigen wollen.

                        was noch erforderlich ist, ist eine anpassung des start- und ende-wertes für unsere for-schleife, sowie eine überprüfung, dass wir nicht versuchen, auf einträge zuzugreifen, die es gar nicht gibt - also auf seite 7 darf unsere for-schleife nicht zu weit (von 60 bis 69) laufen, wenn es nur 63 einträge gibt.
                        aber das ist eigentlich alles nur noch ein wenig mathematik, mit der ihr euch jetzt mal selber ein bisschen auseinandersetzen dürft ...

                        gruss,
                        wahsaga

              2. Moin!

                Sven du hast Recht ich arbeite mit meinem Bruder an dem Projekt Gästebuch.

                Diese Information wäre nett gewesen gleich zu kriegen. Ansonsten sieht das nämlich für die Helfenden etwas doof aus. Außerdem: Koordination ist auch keine verkehrte Sache - wäre gut, wenn ihr von euren Fragen im Forum gegenseitig wißt.

                Deshalb 2 mal der selbe Code. Also pass auf wir fangen gerade an php zu lernen und ich glaube wir haben ein zu grosses Projekt begonnen. Doch wir wollen gern ein eigenes Buch.

                Nein, das glaube ich nun wiederum gar nicht. Ein Gästebuch ist mit das simpelste Projekt, was man als Anfänger angehen kann, und man kann eine Menge davon lernen.

                So nun zu den Probs.
                Wir haben das mit dem array_reverse hinbekommen.

                Hab ich gesehen.

                Es dreht uns die Einträge nun andersrum so das die neusten Einträge oben stehen.

                Ja.
                foreach (array_reverse (file($file)) as $array)

                Du startest eine FOREACH-Schleife, die jedes Element eines Arrays behandelt. Dieses Einzelelement wird in $array abgelegt. Und der Ausgangspunkt ist ein anonymes Array, nämlich array_reverse(file($file)). Die Funktion file() liefert ein Array zurück, welches mit array_reverse() nochmal umgedreht wird - es wird aber nirgendwo in einer Variablen gespeichert, damit man später noch mal drauf zugreifen kann.

                Doch laut dem Eintrag von Tobias soll das wohl mit 2 dimensianalen Arrays besser funktionieren ?

                Naja, darüber kann man streiten. Es hängt ganz davon ab, wie wichtig ein eleganter Datenzugriff ist. Ich wäre aber dafür.

                Wir grübeln die ganze Zeit und testen doch wir bekommen das nicht gebacken...ist es besser wir geben auf ?

                "Aufgeben ist keine Option." Zweidimensionale Arrays sind auch nicht schlimmer, als eindimensionale Arrays.

                Zunächst solltet ihr versuchen, die extreme Kurzform der Schleife oben mal etwas zu entwirren.

                $gbfile = array_reverse(file($file));

                Das speichert das umgedrehte Gästebuch in einem Array.

                foreach ($gbfile as $array)...

                Und so wird es dann zeilenweise abgearbeitet.

                Resultat: Keinerlei Änderung am Verhalten. ABER: Ihr könnt jetzt zusätzlich ermitteln, wieviele Elemente das (noch eindimensionale!) Array enthält:

                $eintraege = count($gbfile); (siehe http://www.php.net/count)

                Dies ergibt beispielsweise 35.

                Mit dieser Zahl könnt ihr errechnen, wieviele GB-Seiten es geben soll. Ihr legt am Skriptanfang einfach eine Variable mit der Zahl der Einträge pro Seite fest:

                $post_pro_seite = 7;

                Und die Zahl der Seiten ergibt sich aus:

                $seiten = ceil($eintraege / $post_pro_seite); (siehe http://www.php.net/ceil)

                ceil() erhöht die Zahl auf die nächstgrößere ganze Zahl - weil ja nur ganze Seiten ausgegeben werden können. Wenn also die Division 3,4 Seiten ergibt, werden 4 ganze Seiten benötigt (die letzte eben nur teilweise).

                Mit der Seitenzahl könnt ihr dann dynamisch eine Reihe von Links zu den einzelnen Seiten ausgeben.

                Bleibt noch die spannendste Frage: Wie wird eine einzelne Seite angezeigt?

                Dazu müßt ihr dem Skript irgendwie sagen, welche Seite es anzeigen soll. Dazu sind Parameter im Link gut:

                <a href="script.php?seite=2"> für Seite 2.

                Seite 2 definiert sich als "Die ersten $post_pro_seite Einträge sind auf Seite 1, Seite 2 beginnt mit Eintrag Nummer $post_pro_seite + 1".

                Jetzt ist das mit den Arrays aber so, dass die Eintragsnummern dummerweise bei Null beginnen - also wird überall 1 abgezogen, und Seite 2 beginnt bei Eintragsnummer $post_pro_seite.

                Seite 3 beginnt dann bei 2 * $post_pro_seite. Und Seite 1 beginn bei 0 * $post_pro_seite (also bei Null). Alle Seiten geben $post_pro_seite Einträge aus.

                Ok, jetzt seid ihr wieder dran!

                - Sven Rautenberg

                --
                ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
          2. Hallo Thorsten,

            erstmal: Du schmeißt in Deinem Script mit lauter Variablen um Dich, die ich nicht kenne. Sie stammen scheinbar aus den include-Dateien. Dann zeig' sie besser auch.
            zweitens: Außerdem wollte ich wissen, wie die Text-Datei aussieht. Jetzt muß ich mir das anhand deines Codes selber überlegen...

            include 'inc\config.inc';

            if($action == "senden")

            Ich vermute mal '$action' ist die von deinem Formular übergebene Variable?

            {
                 $datei = fopen ($file, "a+");
                 $eintrag = $name."|".$email."|".$kommentar."|";
                 $eintrag = str_replace (array ("\r\n", "\r", "\n"), array ("<br>", "<br>", "<br>"), $eintrag);
                 fwrite ($datei, $eintrag."\r\n");

            scheint so, als ob die Einzelnen Einträge durch ein \n von einander getrennt sind.

            [...]

            else
            {
                 include 'formular.php';

            was ist das?

            foreach (array_reverse (file($file)) as $array)
                 {
                    $inhalt = explode('|', $array);
                    include 'gaestebuch.php';

            'gaestebuch.php' scheint die Datei zu sein, die die Eigentliche Ausgabe aus der Textdatei bewirkt oder?

            }
            }

            $zeilen = count(file($file));

            und das?

            Also: helfen gern, aber hellsehen ist in meinem PHP-Buch leider nicht beschrieben ;) Im übrigen erleichtert eine Vernünftige Einrückung das Lesen erheblich... :)

            Gruß, Andreas

      2. Hallo Gummibärchen,

        Ok Andreas mein Gästebuch funktioniert oder soll über txt. Dateien
        funktionieren.

        Wenn du das per include("gaestebuch.txt") oder so in der Art machst, dann muss ich dir sagen dass es nicht geht.
        Wenn du eine DB bentzen würdest würder es mit einer Zaehler Variable gehen aber Text based geht dass eben nicht :(

        samy,

        1. Moin!

          Ok Andreas mein Gästebuch funktioniert oder soll über txt. Dateien
          funktionieren.

          Wenn du das per include("gaestebuch.txt") oder so in der Art machst,

          Wer zum Teufel würde denn sowas schreckliches tun? Und woher nimmst du die Idee, der Fragesteller würde das tun?

          dann muss ich dir sagen dass es nicht geht.

          ...dass es _so_ nicht gehen würde.

          Wenn du eine DB bentzen würdest würder es mit einer Zaehler Variable gehen aber Text based geht dass eben nicht :(

          Doch, geht es auch. Ist nur einen Tick aufwendiger.

          Eine Datenbank ist schließlich auch nur ein Interface zum Zugriff auf Textdateien. Also muß es möglich sein, das, was die DB leistet, auch durch eigenen Code hinzukriegen.

          - Sven Rautenberg

          --
          ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
          1. Hi Torsten hier,

            ich findes toll das mir so viele helfen wollendoch irgendwie hab ich immer noch keinen Ansatz.
            Andreas ist bisher der einzige der einige weitere Infos braucht um helfen zu können.
            Vielleicht könnt ihr auch mal einen Tipp geben. Das es geht das weiss ich schon aber wie muss ich anfangen......ich möchte hier keinen Code von euch sondern lediglich einige Hinweise .... vorrausgesetzt es veralbert mich hier keiner .... Ok ich glaube an das gute im Menschen.
            Ciao Torsten