Jürgen: php mysql auf nächsten Datensatz zugreifen

Hallo, ich verwende php-mysqli und bekomme die Datensätze aus der DB mit

$i =0;

while($row = $result->fetch_assoc()) {
 
  echo " Datum aus Datensatz nr ".$i."==> ". $row['createDate'];
  // ich möchte nun innerhalb dieser Schleife auf ein Feld im nächsten Datensatz zugreifen.
  // damit ich das nächste Datum im kommenden Datensatz erhalte.

  echo " Datum aus nächstem Datensatz nr ".$i."==> ". $row['createDate'];
  $i++;
}

Gibt es da eine Möglichkeit?

Grüße Jürgen

  1. Tach!

    ich möchte nun innerhalb dieser Schleife auf ein Feld im nächsten Datensatz zugreifen. Gibt es da eine Möglichkeit?

    Findest du im PHP-Handbuch eine passende Funktion, mit der du wahlfrei auf Datensätze der Ergebnismenge zugreifen kannst? Dann ist das deine Funktion. Wenn nicht, dann ist es einfacher, in die Vergangenheit zu schauen als in die Zukunft. Alternative: erst alles lesen, dann auswerten.

    dedlfix.

    1. Hallo, nein habe keine passsende Funktion gefunden.... mit next() unter php geht das nicht so recht.

      Ich bin auch gerade erst alles einzulesen , und dann im array auf bestimmte Datensätze zuzugreifen... dachte es geht eleganter

      Grüße Jürgen

      1. Tach!

        Hallo,

        nein habe keine passsende Funktion gefunden.... mit next() unter php geht das nicht so recht.

        next() ist eine Array-Funktion - und auch kein "eben mal schauen", sondern ein weiterlaufen. Du brauchst aber etwas, was auf die Ergebnismenge der SQL-Abfrage wirkt, also eine Methode des Results. Du solltest dir diese mal genauer anschauen.

        Ich bin auch gerade erst alles einzulesen , und dann im array auf bestimmte Datensätze zuzugreifen... dachte es geht eleganter

        Zumindest "alles einlesen" geht ja mit einem einzigen Methodenaufruf.

        dedlfix.

        1. Hallo, mit dem "erstmal alles in ein array einlesen" komme ich schon besser klar, da ich nun alle Datensätze zur Verfügung habe. Im genaueren bin ich gerade dabei ein timline-template für mich anzupassen. Da dies mit vielen icons arbeitet (je nach Datum und Aktion der eingegebenen Nachricht) muss ich auf die Datums vergleichen und das immer auf den aktuellen Datensatz, den prev() Datensatz und den next() Datensatz des arrays.

          Mit den PHP-Funktionen prev, next, current hoffe ich das es klappt. Dort steht das der Zeiger dann je nach Methode vor, aktuell oder zurück gesetzt wird... ich hoffe nur das dies nur für den Aufruf gilt und nicht das wenn ich next() aufrufe dann dort der weitergelesen wird wenn ich alles in einer for-schleife habe.

          Ich hoffe aber das dies der richtige Weg sein kann

          Grüße Jürgen

          1. Tach!

            Da dies mit vielen icons arbeitet (je nach Datum und Aktion der eingegebenen Nachricht) muss ich auf die Datums vergleichen und das immer auf den aktuellen Datensatz, den prev() Datensatz und den next() Datensatz des arrays.

            Jeder Eintrag in deinem Array hat eine Nummer zwischen 0 und count()-1. Mit $index +1 oder -1 kannst du auf die umliegenden zugreifen. Zu beachten ist lediglich, dass dabei nicht < 0 oder >= count() rauskommen darf.

            Mit den PHP-Funktionen prev, next, current hoffe ich das es klappt. Dort steht das der Zeiger dann je nach Methode vor, aktuell oder zurück gesetzt wird...

            current() setzt nicht, das liefert nur das Element an der aktuellen Position. Es gibt nur einen Array-Zeiger für das Array. Wenn du den verstellst ist der neue Datensatz der current. foreach ignoriert den Arrayzeiger komplett und setzt ihn auch nicht um. Wenn du dich trotzdem über den Arrayzeiger umherbewegen möchtest, musst du den selbständig verwalten. Dazu gibt es nur die Funktionen reset(), end(), prev(), next(), current() und each() - nichts anderes.

            dedlfix.

          2. Hallo

            mit dem "erstmal alles in ein array einlesen" komme ich schon besser klar, da ich nun alle Datensätze zur Verfügung habe.

            Wenn es denn mit einem aus der Ergebnismenge erzeugtem Array alufen soll …

            Mit den PHP-Funktionen prev, next, current hoffe ich das es klappt.

            Mit diesen Funktionen wechselst du hart von einem auf den vorherigen oder nächsten Arrayeintrag. Das heißt, du schaust nicht vom momentanen Eintrag aus auf den vorherigen oder nächsten Eintrag, sondern du verlässt den momentanen Eintrag und machst den vorherigen bzw. nächsten Eintrag zum momentanen.

            Was du machen kannst, ist, das Ergebnis zeilenweise in ein Array zu überführen (was du wohl jetzt schon machst) und dabei das Datum des jetzigen Eintrags zum vorherigen Eintrag hinzuzufügen. Wie dedlfix schon schrieb, musst du dabei darauf achten, dass du nicht versuchst, das Datum bei einem Eintrag vor dem ersten oder nach dem letzten Arrayelement einzubauen.

            Möglich wäre, das Datum in den vorherigen Datensatz einzufügen und dabei die erste Zeile (0) auszulassen. Mit diesem System hätte die letzte Zeile natürlich kein Datum eines nächsten Eintrags, auch nicht als Arrayfeld.

            $i = 0;
            while ($row = $result->fetch_assoc()) {
                // Kram mit Array, z.B.
                $array[$i]['datum'] = $row['createDate'];
                // wenn wir nicht in der ersten Zeile sind …
                if ($i > 0) {
                    // … füge das Erstellungsdatum des momentanen Datensatzes als eigenes Feld an die vorherige Zeile an
                    $array[$i - 1]['datumNext'] = $row['createDate'];
                }
                $i++;
            }
            

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
  2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

    ja!

    Hallo, ich verwende php-mysqli und bekomme die Datensätze aus der DB mit

    $i =0;
    

    $table = array();

    while($row = $result->fetch_assoc()) {

    $table[$row['id']] = $row;  
    

    }

    echo "<pre>\r\n"; echo htmlspecialchar(print_r($table, 1)); echo "</pre>\r\n";

    Vorausgesetzt, Du hast eine Spalte id in der Abfrage, versuch erst einmal das.
    Und dann kannst Du anschließend in dem Ergebnisarray navigieren.

    Man kann das auch so bauen, dass immer nur zwei Zeilen im Ergebnisarray stehen, wenn anderenfalls das Array zu groß werden würde.

    Bedenke auch, dass es in einer relationalen Tabelle DBMS) per Definition keine Vorgänger und Nachfolger von Datensätzen gibt. Die entstehen erst in der Ergebnismenge durch Wahl einer geeigneten Sortierung!

    Spirituelle Grüße
    Euer Robert
    robert.r@online.de

    --
    Möge der wahre Forumsgeist ewig leben!
    1. Hallo,

      die richtige Sortierung bekomme ich schon via meiner mysql-Abfrage. Ich bekomme also alle Datensätze in der richtigen Datumsreihenfolge.

      Da ic jedoch einen einen Informationsbaum (Timeline) programmiere, muss ich also jeden datensatz mit dem vorherigen und dem nächsten vergleichen. Beispiel: Ich habe folgende Informations-Datensätze

        1. Datum: 01.03.2015 16:30
        1. Datum: 01.03.2015 17:30
        1. Datum: 02.03.2015 1:30
        1. Datum: 01.04.2015 16:30
        1. Datum: 05.04.2015 13:30
        1. Datum: 06.03.2015 16:30

      So soll nun der heutige Datensatz ein Heute-Icon erhalten der Datensatz nr 5 ein Gestern-icon usw die datensätze 2 und 1 wurden ja am gleichen Tag erstellt. nr 2 ist der Start-Datensatz für den 01.03 und der Datensatz Nr 1 ist dann eine weitere Nachricht innerhalb des Containers wo Nr 1 und 2 sich befinden ich muss also immer 3 Datensätze miteinander vergleichen, den letzten, den aktuellen und den nächsten. so ungefähr stelle ich mir das vor :)

      Grüße Jürgen

      Spirituelle Grüße
      Euer Robert
      robert.r@online.de

      Möge der wahre Forumsgeist ewig leben!

      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        ja!

        die richtige Sortierung bekomme ich schon via meiner mysql-Abfrage. Ich bekomme also alle Datensätze in der richtigen Datumsreihenfolge.

        Da ic jedoch einen einen Informationsbaum (Timeline) programmiere, muss ich also jeden datensatz mit dem vorherigen und dem nächsten vergleichen. Beispiel: Ich habe folgende Informations-Datensätze

          1. Datum: 01.03.2015 16:30
          1. Datum: 01.03.2015 17:30
          1. Datum: 02.03.2015 1:30
          1. Datum: 01.04.2015 16:30
          1. Datum: 05.04.2015 13:30
          1. Datum: 06.03.2015 16:30

        So soll nun der heutige Datensatz ein Heute-Icon erhalten der Datensatz nr 5 ein Gestern-icon usw die datensätze 2 und 1 wurden ja am gleichen Tag erstellt. nr 2 ist der Start-Datensatz für den 01.03 und der Datensatz Nr 1 ist dann eine weitere Nachricht innerhalb des Containers wo Nr 1 und 2 sich befinden ich muss also immer 3 Datensätze miteinander vergleichen, den letzten, den aktuellen und den nächsten. so ungefähr stelle ich mir das vor :)

        Hab ich mir schon gedacht. Dein Stichwort heißt "Gruppenwechsel"

        Das zu erklären ist am Tablet etwas mühselig, aber google mal danach.

        Da Du aber dafür allen Datensätze aus der gefilterten Ergebnismenge benötigst, solltest Du dir meinen Vorschlag für den Zwischenschritt mit dem Array ruhig mal ansehen. Ist leider durch die neue Forumssoftware etwas schwer lesbar geworden - tut mir leid ;-)

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!