2009-04-21 4 views
0

den folgenden Code Gegeben:PHP PDO-Methode vorbereiten ausfällt, während in einer Schleife

// Connect to MySQL up here 

$example_query = $database->prepare('SELECT * FROM table2'); 
if ($example_query === false) die('prepare failed'); 

$query = $database->prepare('SELECT * FROM table1'); 
$query->execute(); 
while ($results = $query->fetch()) 
{ 
    $example_query = $database->prepare('SELECT * FROM table2'); 
    if ($example_query === false) die('prepare failed'); //it will die here 
} 

I Aussagen vorzubereiten versuchen, offensichtlich von table2 zu SELET alles zweimal. Die zweite (die in der WHILE-Schleife) schlägt immer fehl und verursacht einen Fehler.

Dies ist nur auf meinem Produktionsserver, lokal zu entwickeln, ich habe keine Probleme, so dass es irgendwo eine Einstellung sein muss.

Mein erster Gedanke ist, dass MySQL eine Art von max_connections Einstellung hat, die auf 1 gesetzt ist und eine Verbindung geöffnet bleibt, bis die WHILE-Schleife abgeschlossen ist. Wenn ich versuche, eine neue Abfrage vorzubereiten, heißt es "nein zu viele bereits verbunden "und scheißt aus.

Irgendwelche Ideen?

EDIT: Ja, ich weiß, es gibt keine Notwendigkeit, es zweimal zu tun, in meinem eigentlichen Code wird nur in der WHILE-Schleife vorbereitet, aber wie ich sagte, dass auf meinem Produktionsserver fehlschlägt, so nach einigen Tests habe ich festgestellt, dass Eine einfache SELECT * -Abfrage schlägt in der WHILE-Schleife fehl, aber nicht daraus. Der Beispielcode, den ich angegeben habe, ist offensichtlich sehr verwässert, um das Problem zu verdeutlichen.

+1

Ich verstehe nicht, was Sie sagen. Wenn Sie prepare() innerhalb der Schleife verwenden, tun Sie es falsch. Bereiten Sie sich außerhalb der Schleife vor, führen Sie sie aus. –

Antwort

0

Es sollte nicht notwendig sein, $ example_query mehr als einmal vorzubereiten. Führen Sie einfach die Abfrage innerhalb Ihrer Schleife aus.

EDIT: Wenn Sie in jeder Schleifeniteration eine neue Abfrage vorbereiten müssen, sollte ein explizites $ example_query-> closeCursor() am Ende der Schleife alle mit dem Anweisungsobjekt verbundenen Ressourcen freigeben.

+0

Entschuldigung, ich denke ich war nicht klarer. Ich mache das, aber es scheitert auf meinem Prod-Server. Nach einigen Tests habe ich bemerkt, dass es scheitert, weil es wo ist. –

0

Problem war, dass ich nicht etwas, während eine ungepufferte Abfrage ausgeführt wurde tun könnte (was es in der While-Schleife war)

Lösung war die folgende Zeile hinzufügen gepuffert Abfragen, um sicherzustellen, wurden verwendet:

$database->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);