Kann man ein zweites SELECT statement in einem while loop ausführen?

4 Antworten

Hallo LuckyLP,

zunächst mal zu Deiner Fehlermeldung: Du rufst ein fetch_assoc() auf, während $result den Wert false hat. $result ist das Ergebnis des vorherigen query($sql)-Befehls. Laut der PHP-Dokumentation zum query-Befehl in mysqli:

Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.

Da es sich hierbei um eine SELECT-Query handelt, der Rückgabewert aber Boolean ist, wurde folglich false zurückgegeben, daher wurde in $result auch kein Objekt erzeugt, auf das man mit $result->fetch_assoc() hätte zugreifen können. Es ist also naheliegend, dass die Anfrage an sich nicht richtig war. 

Du findest in der PHP-Dokumentation unter
http://php.net/manual/de/mysqli-result.fetch-assoc.php
unter Beispiel #2, wie man so etwas verhindern kann (man muss ein bisschen runter scrollen, aber es komplett zu lesen, schadet garantiert nicht).

Zu der Frage in der Überschrift:

Selbstverständlich kann man innerhalb einer Schleife auch weitere SQL-Statements ausführen. Wichtig ist dabei natürlich, dass das Result außerhalb der Schleife nicht mit dem Result innerhalb der Schleife überschrieben wird, man also eine andere Variable dafür verwenden muss. Allerdings hat Suboptimierer hier Recht: Am besten optimiert man die Anfrage so, dass man das gar nicht erst tun muss, weil das bei größeren Datenbeständen unglaublich bremsen kann. Da wäre zu überlegen, ob Du nicht mit einem JOIN arbeitest. 

Solltest Du das in Erwägung ziehen, gib' mir einfach Bescheid, bräuchte dann noch den Namen der Tabelle, die Du innerhalb der Schleife abfragen willst ;-)

Beste Grüße,
grobmotoriker

Grundsätzlich kann man das. Die Datenbank weiß gar nicht, woher die Anweisungen kommen und wie diese entstanden sind. Entscheidend ist, dass die einzelnen Anweisungen für die Datenbank ausführbar sind. Das heißt, sie dürfen nicht im Widerspruch zu einander stehen und sich nicht gegenseitig stören. So kann man z. B. keinen SELECT abschicken ohne einen vorangegangenen in der Verarbeitung abgeschlossen zu haben.

Wenn man z.B. in einer Schleife die per SELECT gefunden Sätze mit FETCH liest und bei jedem Satz weitere SQL-Zugriffe machen möchte, muss man bei der Definition des Cursors das Attribut WITH HOLD angeben.

Das sollte gehen. Du musst nur darauf achten, nicht die Variablen des äußeren Statements zu verwenden ($result, $row,...)

Beachte, dass PHP-Code i. d. R. langsamer ist als eine optimierte SQL-Abfrage. Wenn es dir möglich ist, solltest du die Datenbank soviel Arbeit wie möglich verrichten lassen.

Woher ich das weiß:Berufserfahrung – Programmierer
LuckyLP 
Fragesteller
 14.12.2016, 16:39

Okay, danke für die schnelle Antwort.

Ich hab aus ihrgendeinem Grund jetzt was funktionierendes hingekriegt.

0

Dan versuchs mal damit:

mysql_select_db("mydb", $con); 

$result1 = mysql_query("SELECT DISTINCT grupeid FROM FROM users");
$result2 = mysql_query("SELECT mitgliedID FROM Mitglieder");
while($row1 = mysql_fetch_array($result))
{
    $row2 =mysql_fetch_array($result2);
    dann mach mal dein Ding...
}
mysql_close($con);

viel Erfolg

notstrom52