Probs mit while Abfrage: Solange DS vorhanden ODER $i«=3;
Carsten Wilke
- php
0 Christian Kruse0 Slyh0 Stephan Huber0 Slyh0 Carsten Wilke
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
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
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
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
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
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
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
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
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
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
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