PHP while($row = $result->fetch_assoc()) 2x ausführen lassen

sag mal Saftmeister, kann es sein das du dich irrst?

Grundsätzlich ist das möglich ;-) In diesem speziellen Fall aber nicht. Erklärung folgt.

das holt ja pro Durchlauf 1 Datensatz aus der DB, wenn $row jetzt innerhalb der Bedingung weiter Verarbeitet wird:

PHP:
while ($row = $result->fetch_assoc())
{
    echo $row['title']; 
}

ist $row['title'] beim Fehlschlag der Query nicht deklariert und es kommt zu Notivce-Meldungen.

Wenn der Query fehlschlägt, ist $result null, das bedeutet, du musst dein $result sowieso prüfen. Solltest du ohne zu prüfen auf $result zugreifen, kommt es zu einer ganz anderen Meldung nämlich einem Fatal Error (null kann nicht als Objekt verwendet werden, und hat auch keine Methode fetch_assoc()).

wenn du zuerst die Bedingung sicherstellst:

PHP:
$rows = array ();
$row = $result->fetch_assoc();
while ($row)
{
    $rows[] = $row;
    $row = $result->fetch_assoc()
}

Ist das gleiche in grün nur mit mehr Code.

Ist alles, was sich im Array $rows befindet, deklariert und kann genutzt werden,- sollte die Bedingung nicht erfüllt sein, kannst du das leicht mit

Warum sollte ich zwei mal über die gleichen Ergebnisse loopen. Ich wiederhole mich noch einmal: Was du machst, ist das gleiche nur mit mehr Code! Da bringt es auch nichts, die Ergebnisse noch mal in ein anderes Speicher-Objekt zu kopieren.

PHP:
$count = count ($rows);

Wenn schon so, warum dann nicht mysqli_result::$num_rows verwenden?

feststellen und eine Anweisung einbauen, die ein Hinweis auf ein leeres Ergebnis bringt, ansonsten mit foreach() abarbeiten.
Das ist zwar etwas mehr an Code und eventuell etwas Mühsamer als die gewohnte Art, aber der Code wird dadurch (meiner Meinung nach) viel sauberer :)

Noch mehr Schleifen?

Noch mal langsam fürs Verständnis:

- Dir geht es also darum, das der Query fehlschlagen könnte?

Dann ist weder deine Variante noch meine adäquat, denn es fehlt eine Prüfung auf $result != null.

- Dir geht es darum, das der Query nicht fehlschlägt aber keine Ergebnisse liefert?

Dann ist meine Variante genauso gut wie deine.


Dein Codebeispiel oben ist aus dem Zusammenhang gerissen. Ich hab keine Ahnung, wo $rows her kommt, wie es befüllt wird und wo genau der Zusammenhang mit dem Beispiel des Thread-Erstellers zu suchen ist.

Fakt ist das

PHP:
while($variable = $anderer_wert)

eine völlig legitime Art und Weise ist eine Bedingung für den Abbruch einer while-Schleife festzulegen.

Das kommt daher, das PHP - wie viele andere Sprachen auch, von rechts nach links arbeiten. Es wird also zuerst $anderer_wert zurück gegegeben und damit $variable mit einem Wert versorgt und anschließend gibt $variable auch noch was zurück, nämlich seinen Wert an die Bedingung der while-Schleife.
 
Zuletzt bearbeitet:
Object? Ein Array ist im PHP 5.3 (ich gehe mal von PHP 5.3 aus) kein Object (im PHP4 war es zwar als Object angesehen, aber in Wirklichkeit ein Array, das gehört hier aber nicht hin)!

Wie willst du das Result prüfen, wenn es schon innerhalb des while als HTML-Code ausgegeben werden soll? Und wenn die Query fehl schlägt und Result wirklich false ist, hast du $row trotzdem nicht initialisiert, weil es innerhalb einer fehlgeschlagenen Bedingung initialisiert werden soll. Wo das von mir genannte "$rows" her kommt, steht mit in den Beispielen, es ist auch nicht "das gleiche", sondern ein valides Array, egal ob es ein Result von der Query gibt oder nicht, in euren Beispielen ist $row im besten Fall ein valides Array, im ungünstigsten Fall nicht deklariert.

Mein Beitrag hier ist auch nicht aus den Zusammenhang gerissen, er sollte eher auf einen Fehler innerhalb des Code-Designs hinweisen, welcher wohl von jedem hier ignoriert wird, obwohl deutlich darauf hin gewiesen wird.
 
Object? Ein Array ist im PHP 5.3 (ich gehe mal von PHP 5.3 aus) kein Object (im PHP4 war es zwar als Object angesehen, aber in Wirklichkeit ein Array, das gehört hier aber nicht hin)!

Ja, $result ist ein Objekt. Zu mindest in dem Code, den der Thread-Ersteller gepostet hat. Es ist sehr wahrscheinlich ein Objekt vom Typ MySQLi_Result. Das erkennt man daran, das es eine Methode fetch_assoc() anbietet, welche ein assoziatives Array oder NULL zurück liefert (was in einer Bedingung mit false gleichzusetzen ist). Der Thread-Ersteller hat dieses assoziative Array (oder NULL => false) in die Variable $row gelegt. Gleichzeitig wird $row als Bedingung für den Ablauf des Code-Blocks innerhalb der while-Schleife herangezogen.

Wie willst du das Result prüfen, wenn es schon innerhalb des while als HTML-Code ausgegeben werden soll?

Deshalb schrieb ich <vor dem Zugriff auf $result>.


Und wenn die Query fehl schlägt und Result wirklich false ist, hast du $row trotzdem nicht initialisiert

Natürlich ist $row initialisiert. Es hat entweder ein assoziatives Array oder false.

weil es innerhalb einer fehlgeschlagenen Bedingung initialisiert werden soll.

Noch mal: PHP arbeitet von rechts nach links. Die Bedingung liefert erst false und erst dann wird der Code-Block nicht mehr ausgeführt, wenn $result->fetch_assoc() false zurück liefert.

Wo das von mir genannte "$rows" her kommt, steht mit in den Beispielen, es ist auch nicht "das gleiche", sondern ein valides Array, egal ob es ein Result von der Query gibt oder nicht, in euren Beispielen ist $row im besten Fall ein valides Array, im ungünstigsten Fall nicht deklariert.

$row ist immer deklariert. Es ist schlechtesten Fall ist es halt null und sorgt dafür das der while-Code-Block nicht ausgeführt wird.

Mein Beitrag hier ist auch nicht aus den Zusammenhang gerissen, er sollte eher auf einen Fehler innerhalb des Code-Designs hinweisen, welcher wohl von jedem hier ignoriert wird, obwohl deutlich darauf hin gewiesen wird.

Ich sehe darin keinen Fehler. Aber bitte - ich lass mich gern von etwas anderem überzeugen - entgegen der Erfahrung, das ich meine while-Schleifen schon seit Jahren so benutze ;-) und nirgends ein Notice aufgepoppt wäre. Ich vermute langsam, du verwechselst while (kopfgesteuert) mit do-while (fussgesteuert).

EDIT: Ich hab mir mal Gedanken gemacht, wie ich das am besten in einem kleinen Test beweisen kann. Hier ist das Ergebnis:

PHP:
<?php
error_reporting(E_ALL | E_STRICT);

$foo = array('a' => 'Hello', 'b' => 'World');

while( $foo = null )
{
  echo $foo['a'] . ' ' . $foo['b'];
}

Nach deiner Theorie müsste also ein Notice auftauchen, das 'a' und 'b' ungültige Elemente und keine Indizes von $foo sind. Tatsächlich passiert aber folgendes: Nichts.
 
Zuletzt bearbeitet:
"Zuweisung einer Variable innerhalb einer Bedingung"...das sagt doch schon der Satz:
Eine Variable wird in einer Bedingung zugewiesen, schlägt die Bedingung fehl, kann die Variable (in unseren Fall ein Array) nicht als solche zugewiesen werden, demnach wird ein weiterer Gebraucht dieses Arrays jedes mal ein Notice-Meldung ausgeben

Das Beispiel:
PHP:
$foo = (empty ($bar) ? 1 :0);

ist zwar auch eine Zuweisung einer Variable in einer Bedingung, aber egal, welchen Wert $bar hat, die Variable $foo ist mit einem gültigen Wert initialisiert.

Dir ist schon klar, das ein fetch_assoc (); KEIN Object, sondern ein Array ist? das ist nichts anderes als mysql_assoc (), bzw. mysql_query ($result, MYSQL_ASSOC);...und das ist ein Array, lediglich ein mysql_fetch_object (); ist ein Object. Der Variablen innerhalb des HTML-Codes (innerhalb des while() ) vom Threadstarter sagt mir auch, das es ein Array ist und die Methode einen Namen trägt, der auf die Funktion schliessen lässt.
Das "$result" ist ein Object, aber wo das her kommt, ist nirgendwo einsehbar (wenn das der ganze Code ist, gibt es dort ein weiteren fehler...den $result wäre dann nicht deklariert), ich nehme an, das es das Object von der Datenbank-Instanz ist, innerhalb dieses Objects kann es dann natürlich auch die Methode fetch_assoc geben, diese Funktion wiederum liefert Arrays, keine Objecte
 
Und genau da liegt dein Denkfehler. Die Variable wird auf jeden Fall zugewiesen und erst nach der Zuweisung wird die Bedinung als solche geprüft. Eine Prüfung, bei der der Operand den Wert null hat, wird false liefern. So arbeitet PHP nun mal. Ich kann ja auch nichts dafür, das es so ist. Ich nutze nur die Möglichkeiten. Und das ist eine.

EDIT: Ich habe nie geschrieben, das fetch_assoc() ein Objekt zurück gibt. Ich schrieb, das $result ein Objekt ist.
 
Zurück