Peterchens Mondfahrt: while-Scleife: Erster Datensatz fehlt !?

Hallo zusammen,

ich habe einen select, der eine Reihe von Datensätzen zurückliefert.
Mit

while($select = mysql_fetch_row($query))

möchte ich mir diese Datensätze ausgeben lassen.
Das Problem ist, dass immer der erste Datensatz abgeschnitten wird, also fehlt !?
Kann das jemand von euch nachvollzieghen, bzw. erklären ?

Danke

Gruss

Peter

  1. Mahlzeit,

    ich habe einen select, der eine Reihe von Datensätzen zurückliefert.
    Mit

    while($select = mysql_fetch_row($query))

    möchte ich mir diese Datensätze ausgeben lassen.
    Das Problem ist, dass immer der erste Datensatz abgeschnitten wird, also fehlt !?
    Kann das jemand von euch nachvollzieghen, bzw. erklären ?

    Kannst du denn etwas mehr Code zeigen als while(...)?

    Grüße aus Barsinghausen,
    Fabian

    1. Hallo,

      ja natürlich kann ich das *g*
      **************
      $select = "SELECT A,B,C FROM Tabelle WHERE A = $wert ORDER BY B";
      $query = mysql_query($select, $db) or die($mysql_error());
      $queryergeb = mysql_fetch_row($query);
      if (!$queryergeb)
        echo "<tr><td> </td></tr>";
      else {
        while($select = mysql_fetch_row($query)) {
          echo "<td>".$select[1]."-".$select[2]."</td></tr>";
        }
      }
      *********
      Das ist eigentlich schon alles !?
      Und in der while-Schleife fehlt halt immer der erste Datensatz !?

      Gruss

      Peter

      1. Hallo Peter,

        $queryergeb = mysql_fetch_row($query);

        hier rufst du den ersten Datensatz ab...

        while($select = mysql_fetch_row($query)) {

        ...und hier wunderst du dich, wo der erste Datensatz geblieben ist.

        echo "<td>".$select[1]."-".$select[2]."</td></tr>";

        was machst du denn ersten aufruf von mysql_fetch_row()? willst du wissen, ob du ein Ergebnis zurückbekommen hast? - dann solltest du mysql_num_rows() verwenden.

        Grüße aus Nürnberg
        Tobias

        --
        Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        1. Hallo,

          willst du wissen, ob du ein Ergebnis zurückbekommen hast? - dann solltest du mysql_num_rows() verwenden.

          Japp... so ist es, aber mit "_num_rows()" knallt das select total und liefert mir unendlich viele "L E" und "EC" zurück !?

          Gruss
          Peter

          1. hi,

            Japp... so ist es, aber mit "_num_rows()" knallt das select total und liefert mir unendlich viele "L E" und "EC" zurück !?

            dann machst du definitiv etwas falsch.

            mysql_num_rows() beeinflusst mit 100%iger sicherheit nicht mehr im nachhinein die vom select-statement erzeugte ergebnismenge.

            gruss,
            wahsaga

            1. Hallo,

              dann machst du definitiv etwas falsch.

              Das Gefühl hab ich ja auch ;-)

              Also nochmal der KOMPLETTE Code (ohne Kürzungen:
              ************************************************
              $select = "SELECT Tag, P1,Z1,S1,T1,A1 FROM Tabelle WHERE Tag = '$zahl$wann' ORDER BY Z1"; // ($zahl$wann wird korekt übergeben)
              $query = mysql_query($select, $db) or die($mysql_error());
              $queryergeb = mysql_num_rows($query);
              if (!$queryergeb)
                echo "<tr><td>".$zahl."</td><td colspan='2'> </td></tr>";
              else {
                $datalt="".$select[0]."";
                while($queryergeb) {
                  $datneu="".$select[0]."";
                  if ($datneu == $datalt) {
                    echo "<tr><td> </td>";
                    echo "<td>".$select[2]."-".$select[3]."</td>";
                    echo "<td>".$select[1]."-".$select[4]."<br>".$select[5]."</td></tr>";
                  }
                  else {
                    echo "<tr>";
                    echo "<td>".$zahl."</td>";
                    echo "<td>".$select[2]."-".$select[3]."</td>";
                    echo "<td>".$select[1]."-".$select[4]."<br>".$select[5]."</td></tr>";
                  }
                  $datalt="".$select[0]."";
                }
              }
              ******************************************************************

              ... und den Fehler find' ich nicht :(

              Gruss

              Peter

              1. hi,

                $queryergeb = mysql_num_rows($query);
                  while($queryergeb) {
                  }

                was soll das jetzt wieder werden?
                mysql_num_rows() fragt lediglich die anzahl der datensätze ab.
                sofern diese grösser null ist, gehst du in deine while-schleife. in dieser verwendest du $queryergeb (die anzahl der datensätze!) als abbruchbedingung - wann bitte soll diese schleife beendet werden?

                gruss,
                wahsaga

                1. Hi wahsaga,

                  ...klingt logisch, aber wenn ich als Abbruchbedingung "_fetch_row" in der while-Schleife setze, bekomme ich noch immer dieses "LE EC T"-Zeuchs ?!

                  Gruss

                  Peter

                  1. hi,

                    ...klingt logisch, aber wenn ich als Abbruchbedingung "_fetch_row" in der while-Schleife setze, bekomme ich noch immer dieses "LE EC T"-Zeuchs ?!

                    sorry, aber mir ist immer noch vollkommen schleierhaft, was du mit "diesem zeuch" meinst ...

                    gruss,
                    wahsaga

                    1. Hi wahsaga,

                      nerv ich schon ? *g*

                      ...klingt logisch, aber wenn ich als Abbruchbedingung "_fetch_row" in der while-Schleife setze, bekomme ich noch immer dieses "LE EC T"-Zeuchs ?!
                      sorry, aber mir ist immer noch vollkommen schleierhaft, was du mit "diesem zeuch" meinst ...

                      Na, das was da steht... anstelle eines sauberen Datensatzes wie z.B.
                      Otto - Weber - München
                      bekomme ich
                      LE - EC - T
                      zurückgeliefert.... naja, inzwischen ist es:
                      S - S - S

                      !?

                      Gruss

                      Peter

                    2. Hi !!!!!

                      Fehler gefunden !
                      das $select konnte ich knicken... natürlich mussten die Ausgabewerte aus dem ResultSet kommen und nicht aus dem Select (daher auch die lustigen Buchstaben "S" "EL" "EC" und "T") *g*

                      Besten Dank für die Tipps und Denkanstösse !!

                      Gruss

                      Peter

                  2. hi,

                    ...klingt logisch, aber wenn ich als Abbruchbedingung "_fetch_row" in der while-Schleife setze, bekomme ich noch immer dieses "LE EC T"-Zeuchs ?!

                    wie greifst du denn auf die mit mysql_fetch_row angeforderten daten zu?

                    gruss,
                    wahsaga

                    1. Hi wahsaga,

                      wie greifst du denn auf die mit mysql_fetch_row angeforderten daten zu?

                      while(mysql_fetch_row($query)) {
                       if ($datneu == $datalt) {
                       echo "<tr>";
                       echo "<td>".$select['Z1']."-".$select['S1']."</td>";
                       echo "<td>".$select['P1']."-".$select['T1']."<br>".$select['A1']."</td></tr>";
                      ***********************
                      vorher hatte ich $select[0]...[1]... etc. da stehen, aber dann kam der Tip tatsächlich die Spaltennnamen zu benutzen !?

                      Gruss

                      Peter

                      1. Hallo Peter,

                        vorher hatte ich $select[0]...[1]... etc. da stehen, aber dann kam der Tip tatsächlich die Spaltennnamen zu benutzen !?

                        das geht aber nur, wenn du mysql_fetch_assoc() verwendest (siehe http://de3.php.net/mysql_fetch_assoc).

                        Grüße aus Nürnberg
                        Tobias

                        --
                        Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
              2. Hallo Peter,

                $select = "SELECT Tag, P1,Z1,S1,T1,A1 [...]
                  $datalt="".$select[0]."";

                wo willst du $select herhaben? das ist doch dein Query... und da man mit $foo[0] auf das erste Zeichen des Strings in $foo zugreifen kann, hast du in $datalt eben ein großes S stehen (==1.Zeichen deines Querys).

                while($queryergeb) {

                das versteh ich nicht. imho gibt das eine Endlosschleife. schreib hier mal
                 while($select = mysql_fetch_row($query)){ hin dann sollte unten was anderes rauskommen.

                $datneu="".$select[0]."";

                in $datneu steht das gleiche wie in $datalt (s.o.)...

                if ($datneu == $datalt) {

                ...folglich ist das hier immer true

                echo "<td>".$select[2]."-".$select[3]."</td>";
                      echo "<td>".$select[1]."-".$select[4]."<br>".$select[5]."</td></tr>";

                lass mich raten, diese zwei Zeilen geben genau
                <td>L-E</td><td>E-C<br>T</td></tr>
                aus, richtig? (in den Quelltext schauen) - du hohlst dir nämlich einzelen Buchstaben aus deinem Query ganz oben.

                }
                    else {

                hier kommst du nie hin, das die if-Bedingung immer true gibt

                $datalt="".$select[0]."";

                hier reicht übrigends "$datalt=$select[0];" völlig aus, um das gleiche zu erreichen.

                ... und den Fehler find' ich nicht :(

                du solltest etwas konsequenter auf deine Variablen achten, bei mir sieht eine Datenbankabfrage immer etwa so aus:
                ---
                $query = "SELECT...";
                $rs = mysql_query($query,DB);
                while($row=mysql_fetch_assoc($rs)){
                  //daten aus $row holen...
                }
                ----
                dann kann mit den Variablen auch nichts schiefgehen

                Grüße aus Nürnberg
                Tobias

                --
                Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
            2. Hallo,

              JETZT wird's interessant *g*
              **********************************************************
              $query = mysql_query($select, $db) or die($mysql_error());
              $queryergeb = mysql_num_rows($query);

              if (!$queryergeb)
               echo $leereZeile;
              else {
                while(mysql_fetch_row($query)) {
                  $netteAusgabe
                }
              ***********************************************************
              Mit "_num_rows" überprüfe ich, ob ein Datensatz zurückkommt (danke für den Tip) und lasse mir mit "while(mysql_fetch_row" alle Datensätze ausgeben ...
              Folgendes Phänomen:
              Anscheinend wird der erste Datensatz jetzt nichtmehr ausgelassen, was ich aber nicht gut prüfen kann, da das Select nun EWIG lange dauert und $select[0] immer "ET", $select[1] "EC" und $select[3] "T" als Augabe ergibt !?
              Um es kurz auszudrücken: "hääää ?"
              Bitte um Hilfe !

              Danke

              Peter

              1. Hallo Peter,

                $query = mysql_query($select, $db) or die($mysql_error());

                in $select steht das drin, was du erwartest?

                $queryergeb = mysql_num_rows($query);

                was gibt "echo $queryergeb" aus?

                if (!$queryergeb)

                warum nicht if($queryergeb!=0)?

                echo $leereZeile;

                was steht da drin?

                else {
                  while(mysql_fetch_row($query)) {

                warum nicht while($row = mysql_fetch_row($query))? (ich weiß nicht, wie du sonst an deine Daten kommen willst)

                $netteAusgabe

                was soll das ausgeben?
                Schreib mal in der while-Schleife "print_r($row);" (wenn du meine Zeile oben verwendest)

                Anscheinend wird der erste Datensatz jetzt nichtmehr ausgelassen, was ich aber nicht gut prüfen kann, da das Select nun EWIG lange dauert und $select[0] immer "ET", $select[1] "EC" und $select[3] "T" als Augabe ergibt !?

                was steht denn in der Datenbank? du könntest es auch mal mit mysql_fetch_assoc() statt ..._row() versuchen und dann mit nicht z.B. mit $select[0] sondern mit $select['ersterspaltennameinderselectliste'] dein Zeug ausgeben

                Um es kurz auszudrücken: "hääää ?"

                ja, so ganz versteh ich das was du da treibst auch nicht :-)

                Grüße aus Nürnberg
                Tobias

                --
                Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
                1. Hallo Tobias,

                  $query = mysql_query($select, $db) or die($mysql_error());
                  in $select steht das drin, was du erwartest?

                  Definitiv "ja"

                  $queryergeb = mysql_num_rows($query);
                  was gibt "echo $queryergeb" aus?

                  0
                  0
                  0
                  2
                  0
                  0
                  4...

                  if (!$queryergeb)
                  warum nicht if($queryergeb!=0)?

                  is doch das selbe in grün !?

                  echo $leereZeile;
                  was steht da drin?

                  wirklich nur eine leere Zeile in der HTML-Tabelle, also "<tr><td> </td></tr>"

                  ...

                  Um es kurz auszudrücken: "hääää ?"
                  ja, so ganz versteh ich das was du da treibst auch nicht :-)

                  Tobias, schau mal bitte eion paar posts vorher, da hab ich den Code UNGEKÜRZT geposted...

                  Mit echo $select['tabellenspaltenname'] bekomme ich jetzt IMMER ein "S" zurück ??

                  Ich schmeiss gleich alles hin ;-)

                  Gruss

                  Peter

                  1. Hallo Peter,

                    $queryergeb = mysql_num_rows($query);
                    was gibt "echo $queryergeb" aus?
                    0
                    0
                    0
                    2
                    0
                    0
                    4...

                    hää? warum denn so viele Zahlen? mysql_num_rows() sollte _ein_ Zahl zurückgeben...

                    if (!$queryergeb)
                    warum nicht if($queryergeb!=0)?
                    is doch das selbe in grün !?

                    imho ist das schöner if(!$queryergeb) ist nur true weil 0 false entspricht.

                    Tobias, schau mal bitte eion paar posts vorher, da hab ich den Code UNGEKÜRZT geposted...

                    hab ich, aber der schaut auch nicht unbedingt besser aus :-)

                    Mit echo $select['tabellenspaltenname'] bekomme ich jetzt IMMER ein "S" zurück ??

                    was bekommst du, wenn du an der selben stelle print_r($select); schreibst?
                    außerdem könntest du mal am Anfang deines Scriptes ein error_reporting(E_ALL); einfügen, vielleicht gibt das was sinnvolles aus?

                    Grüße aus Nürnberg
                    Tobias

                    --
                    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
  2. Hi,

    while($select = mysql_fetch_row($query))

    möchte ich mir diese Datensätze ausgeben lassen.
    Das Problem ist, dass immer der erste Datensatz abgeschnitten wird, also fehlt !?
    Kann das jemand von euch nachvollzieghen, bzw. erklären ?

    immer diese Probleme mit dem ersten und letzten Datensatz.   ;-)

    Vermutlich hast Du die Methode 'mysql_fetch_row()' zweimal ausgefuehrt bevor Du die Daten bearbeitet hast. - Stimmt's?

    Gruss,
    Lude