PHP PDO / Schleife Verständnisfragen

zlep

Banned
Registriert
Feb. 2016
Beiträge
126
Hallo,

vorweg, bitte entschuldigt diese simple Anfängerfrage. Ich bin gerade dabei PDO für PHP zu lernen und habe soweit auch alles verstanden. Mir fehlt es aber glaube ich noch am Grundverständnis, obwohl ich das Konzept von while-Schleifen eigentlich verstanden habe.

Wenn man Ergebnisse mit fetch() anstatt mit fetchall() holt, nutzt man ja eine while-Schleife anstatt einer foreach-Schleife.

Code:
while ($row = $stmt -> fetch(PDO::FETCH_OBJ)) {
    echo $row -> title;
}

Ich dachte while durchläuft die Schleife immer so lange, bis eine Bedingung falsch wird. Was bedeutet nun aber das obere Beispiel? Ich übersetze das irgendwie so:

"solange ($row = Ergebnisse)".

Das macht doch aber eigentlich keinen Sinn, oder? Schwierig zu erklären, was ich nicht verstehe, aber vielleicht könnt ihr mir trotzdem helfen :)

Außerdem habe ich noch eine andere Verständnisfrage. Ich dachte, man kann im Prinzip alles in eine Variable packen. Also habe ich folgendes probiert:

Code:
$results = $stmt -> fetch(PDO::FETCH_OBJ)

while ($row = $results) {
    echo $row -> title;
}

Ich dachte, anstatt in der while-Schleife das ganze auszuschreiben, packe ich es vorher in eine Variable und setzte diese dann in die while-Schleife. Das liefert aber ein ganz anderes Ergebnis. Warum?

Vielen Dank bereits im Voraus.
 
PDOStatement::fetch

Das fetch liefert dir immer die nächste Zeile. Dafür muss die Funktion aber immer wieder aufgerufen werden. Die Zeile
PHP:
$results = $stmt -> fetch(PDO::FETCH_OBJ)
Weißt der Variable $results die (vermutlich) erste Reihe zu. In dem while weißt du dann $row $results zu. In $results steht aber immer das Gleiche drin.

Ich dachte while durchläuft die Schleife immer so lange, bis eine Bedingung falsch wird.

"The return value of this function on success depends on the fetch type. In all cases, FALSE is returned on failure."
Am Ende gibt es keine weitere Zeile mehr, daher gibt die Funktion FALSE zurück :)
 
Ah, ok, fast alles verstanden. Danke.
Das heißt also, dass der Unterschied zwischen $row = $results in der Schleife und $row = $stmt -> fetch(PDO::FETCH_OBJ) der ist, dass, wenn ich die fetch-Funktion vorher in eine Variable packe, es die "Eigenschaft verliert" FALSE zurückzugeben und deshalb muss man es innerhalb der while-Schleife ausschreiben.

Habe ich das so richtig verstanden?

Wenn dem nicht so wäre, könnte man die Funktion auch in eine Variable $results packen und die dann in der Schleife verwenden. Oder was genau bedeutet while ($a = $b) ?
 
Hi zlep,

PHP:
while ($row = $stmt->fetch(PDO::FETCH_OBJ))

Das in der Bedingung für die Schleife ist KEINE Prüfung, sondern eine Zuweisung.
Es funktionieren Zuweisungen in Bedingungen, d. h.
Der Wert der Funktion fetch wird in die Variable $row geschrieben, diese Variable wird dann geprüft (entweder ist es ein Datensatz, oder FALSE)
siehe auch hier https://www.sitepoint.com/assignment-inside-a-condition/

Die Funktion fetch "fetches the next row from a result set" (http://php.net/manual/de/pdostatement.fetch.php)
D. h. pro fetch-Aufruf, erhältst du immer nur einen Datensatz (daher immer die neue Zuweisung in der Bedingung.

Der folgende Code würde nicht funktionieren:

PHP:
$results = $stmt -> fetch(PDO::FETCH_OBJ)

while ($row = $results) {
    echo $row -> title;
}

In der ersten Zeile, weist du der Variable $results nur den 1. Datensatz zu.
Läufst dann in die Schleife und weist hier wiederum den Inhalt von Variable $result der Variable $row zu.
Ergebnis:
Endlossschleife

Gruß
Tio
 
  • Gefällt mir
Reaktionen: zlep
Danke, jetzt habe ich es verstanden. Ist als Anfänger nicht einfach, das immer so direkt zu begreifen, aber ich habe in den letzten 2 Wochen schon gute Fortschritte gemacht, was mich motiviert, weiterzumachen :)
 
Du hast mehr Fortschritte in 2 Wochen gemacht als manch anderer hier in Monaten oder Jahren würde ich sagen. Also weiter machen! :) Doku genau lesen ist immer ein wichtiger Anfangspunkt. Direkt gefolgt von Fehlern lesen, verstehen und googlen....
 
  • Gefällt mir
Reaktionen: Darrel und zlep
Zurück
Oben