Carsten Wilke: Probs mit while Abfrage: Solange DS vorhanden ODER $i«=3;

Hallo,

wenn ich folgende while BEdingung schreibe:

while ($row=mysql_fetch_array($result) $i<=3);

kommt ewig der Fehler
Warning: Using scalar variable $row as an array or object

Ich möchte aus der While-Bedingung raus, wenn keine DS mehr vorhanden sind oder $i>3

:-(

Danke,
Carsten

  1. Hi,

    Ich möchte aus der While-Bedingung raus, wenn keine DS mehr vorhanden sind oder $i>3

    while ($row=mysql_fetch_array($result) $i<=3);

    Da ist ein logischer Fehler drin ;) richtig wäre

    while($row = mysql_fetch_array($result) && $i<=3)

    mfg
    CK1

    1. Hi,

      Ich möchte aus der While-Bedingung raus, wenn keine DS mehr vorhanden sind oder $i>3

      while ($row=mysql_fetch_array($result) $i<=3);

      Da ist ein logischer Fehler drin ;) richtig wäre

      while($row = mysql_fetch_array($result) && $i<=3)

      Das erklärt allerdings die Warnmeldung nicht, oder!? Normalerweise sollte in $row ja die Anzahl der
      Array-Elemente stehen, die mysql_fetch_array zurückliefert. Allerdings ist mir diese Funktion unbekannt.
      Vielleicht besteht die ja darauf, daß ihr Rückgabewert in eine Array-Variable geschrieben wird...

      Gruß,
      Slyh

      1. Hallo Slyh,

        while($row = mysql_fetch_array($result) && $i<=3)

        Das erklärt allerdings die Warnmeldung nicht, oder!? Normalerweise sollte in $row ja die Anzahl der
        Array-Elemente stehen, die mysql_fetch_array zurückliefert.

        Nein, die Elemente selber als assoziatives Array (Anzahl ist mysql_num_rows).

        Allerdings ist mir diese Funktion unbekannt.

        <dumme frage>Warum schreibst Du dann eine Antwort?</dumme frage>

        Vielleicht besteht die ja darauf, daß ihr Rückgabewert in eine Array-Variable geschrieben wird...

        Nein, Sie macht aus $row eine Array-Variable. Der Fehler ist wohl einfach eine fehlende Klammer:

        while(($row = mysql_fetch_array($result)) && ($i<=3)).

        Ohne die Klammer um die Zuweisung des Arrays an $row beachtet PHP die üblichen Klammerkonventionen,
        und damit ist alles rechts vom = Teil des auszuwertenden Ausdrucks, $row erhält als Wert also true oder false.
        Die Fehlermeldung entsteht dann, weil wahrscheinlich ein paar Zeilen später irgendwas wie
        $name=$row["name"];
        steht->da $row ohne Klammer eine Binärwert ist, keine assoziatives Array, gibt's einen Fehler

        Viele Grüße
        Stephan

        1. Hi,

          warum ich eine Antwort geschrieben habe: Ich habe irrtümlich angenommen, daß es sich hierbei um
          Perl handelt. Das habe ich leider erst einige Minuten nach dem Absenden meines _sehr_ falschen Postings
          gemerkt. Eigentlich wollte ich noch etwas lernen - deshalb auch dieses Posting, das mehr eine Frage als
          eine Antwort war... Asche auf mein Haupt! Heute war aber ohnehin nicht so sehr mein Tag...

          Gruß,
          Slyh

        2. Hallo,

          while($row = mysql_fetch_array($result) && $i<=3)

          nein, ist richtig so, aber das sei mal dahingestellt,
          denn:
          "> > Das erklärt allerdings die Warnmeldung nicht, oder!?"

          Nein, Sie macht aus $row eine Array-Variable. Der Fehler ist wohl einfach eine fehlende Klammer:

          Genau das wars, eine falsche (bzw. fehlende Klammer). Oh man, es ist immer das gleiche: Wenn man sich seinen Quellcode 1000-mal am Tag anschaut+bearbeitet, ist die Fehlersuche echt schwierig!

          Also Danke für eure Hilfe,

          Carsten

          1. Hallo,

            while($row = mysql_fetch_array($result) && $i<=3)
            nein, ist richtig so, aber das sei mal dahingestellt,

            Also wenn Du nach 3 Datensätzen abbrechen willst, dann muß es && heißen. Du willst ja solange (while) einlesen, solange es noch Daten gibt (mysql_fetch_array) _und_ $i noch nicht größer als 3 ist ($i <=3).
            Wenn Du mit verknüpfst, dann bekommst Du wieder alle Datensätze, da ja nur eine der beiden Bedingungen erfüllt sein muß.

            Noch was. ICh weiß ja nicht wie PHP intern arbeitet, aber bei jeder halbwegs normalen Programmiersprache werden die Bedingungen von links nach rechts geprüft. Und normalerweise werden keine weiteren Überprüfungen mehr gemacht, wenn sich das ergebnis nicht ändern kann.

            Du kannst etwas Performance gewinnen, wenn Du schreibst
            while(($i<=3) && ($row = mysql_fetch_array($result)))

            weil ein Zahlenvergleich schneller geht, als das fetchen eines Datensatzes. Das ist vielleicht hier nicht so relevant, aber z.B. wenn längere Operation (URL-Laden oder was weiß ich) gemacht werden, dann wirds schon interessant.
            Das aber nur so am Rande

            Grüße
              Klaus

            1. Hallo Klaus,

              ...

              Also wenn Du nach 3 Datensätzen abbrechen willst, dann muß es && heißen. Du willst ja solange (while) einlesen, solange es noch Daten gibt (mysql_fetch_array) _und_ $i noch nicht größer als 3 ist ($i <=3).
              Wenn Du mit verknüpfst, dann bekommst Du wieder alle Datensätze, da ja nur eine der beiden Bedingungen erfüllt sein muß.

              Ja genau, ich will entweder so lange anzeigen lassen, so lange DS vorhanden sind ODER so lange $i<=3 ist. Bin ich denn jetzt total blöd? (KEINE ehrlichen Meinungen ;-))

              Du kannst etwas Performance gewinnen, wenn Du schreibst
              while(($i<=3) && ($row = mysql_fetch_array($result)))

              Das is ne sehr gute Idee!

              Danke, Carsten

              1. Hi,

                Ja genau, ich will entweder so lange anzeigen lassen, so lange DS vorhanden sind ODER so
                lange $i<=3 ist. Bin ich denn jetzt total blöd? (KEINE ehrlichen Meinungen ;-))

                OK, spielen wir das ganze mal durch ;) Angenommen, du hast 10 Reihen in der Tabelle, so würde der
                Allgorythmus folgendes machen:

                i = 0, noch 10 Datensätze unbearbeitet
                kann eine Reihe extrahiert werden? -> Ja
                ist i noch unter 3 oder gleich 3? -> Ja

                also nächster Durchlauf:

                i = 1, noch 9 Datensätze unbearbeitet
                kann eine Reihe extrahiert werden? -> ja
                ist i noch unter 3 oder gleich 3? -> ja

                also nächster Durchlauf

                i = 2, noch 8 Datensätze unbearbeitet
                kann eine Reihe extrahiert werden? -> ja
                ist i noch unter 3 oder gleich 3? -> ja

                also nächster Durchlauf

                i = 3, noch 7 Datensätze unbearbeitet
                kann eine Reihe extrahiert werden? -> ja
                ist i noch unter 3 oder gleich 3? -> ja

                Also nächster Durchlauf

                i = 4, noch 6 Datensätze unbearbeitet
                kann eine Reihe extrahiert werden? -> ja
                ist i noch unter 3 oder gleich 3? -> nein

                So, wenn du jetzt mit (oder) verknüpfst, läuft die Schleife weiter, weil ja die
                erste Bedingung (kann eine Reihe extrahiert werden?) noch erfüllt ist. Verknüpfst
                du jedoch mit && (und), dann wird die Schleife _nicht_ mehr fortgesetzt, weil
                _beide_ Bedingungen erfüllt sein müssen.

                Was du jetzt willst, sei dahin gestellt, aus deinem Posting geht das nicht eindeutig
                hervor, auch wenn ich einfach mal unterstelle, du möchtest eine &&-Verknüpfung ;)

                mfg
                CK1

                1. Hallo,

                  Es gibt ja noch einen interessanten Fall dabei:
                  Es sind weniger als 3 Datensätze vorhanden.
                  Dann werden gnadenlos trotzdem drei angezeigt.

                  Aus einem vorherigen Posting entnehme ich, daß Carsten abbrechen will, wenn entweder keine Daten mehr da sind _oder_ $i>3 ist.

                  Ist halt so ein Krampf mit den logischen Verknüpfungen.
                  while bedeutet, daß etwas gemacht wird, solange die Bedingungen wahr ergeben.
                  und daher muß es lauten

                  machwas solange nochwaszumlesen _und_ gleichoderwenigeralsdreidatensätze

                  oder in code

                  while(fetchrow && $i<=3)
                     {
                     machwas;
                     }

                  Hab ich schon gesagt, daß es ein Kreuz ist mit den logischen Verknüpfungen?

                  Grüße
                     Klaus

                2. Hi Christian!

                  » OK, spielen wir das ganze mal durch ;) Angenommen, du hast 10 Reihen in der Tabelle, so würde der

                  Allgorythmus folgendes machen:

                  So, wenn du jetzt mit || (oder) verknüpfst, läuft die Schleife weiter, weil ja die
                  erste Bedingung (kann eine Reihe extrahiert werden?) noch erfüllt ist.

                  D.h. also, es wird *immer* die gesamte Tabelle geholt und verarbeitet.

                  Schlecht ist aber auch der Fall, wenn nur 0, 1 oder 2 DS in der Tabelle sind. i<=3 ist dann naemlich immer noch true, also wird fleissig weitergefetcht, obwohl gar nichts mehr da ist, was vermutlich (kann kein PHP) mit irgendwelchen Fehlern bestraft wird.

                  So long