2009-04-21 50 views
0

考慮下面的代碼:PHP的PDO準備方法失敗雖然在循環

// 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 
} 

我顯然試圖準備語句SELET一切從表2的兩倍。第二個(WHILE循環中的)總是失敗並導致錯誤。

這只是在我的生產服務器,本地開發我沒有問題,所以它必須是某種設置某種地方。

我的直接想法是,MySQL的某種max_connections設置設置爲1,並且連接保持打開狀態,直到WHILE循環完成,因此當我嘗試準備新查詢時它說「nope too too many already already 「並吐出。

任何想法?

編輯:是的,我知道有沒有必要做兩次,它只被while循環編寫我的實際代碼,但就像我說失敗了我的生產服務器上,以便一些測試後,我發現,簡單的SELECT *查詢在WHILE循環中失敗,但不能退出。我給出的示例代碼顯然是非常淡化以說明問題。

+1

我不明白你在說什麼。如果你在循環中使用prepare(),那麼你做錯了。準備在循環之外,在裏面執行。 – 2009-04-21 19:34:48

回答

0

應該不需要多次準備$ example_query。只需在循環中執行查詢即可。

編輯:如果你必須準備在每個循環迭代一個新的查詢,在循環的結束的明確$ example_query-> closeCursor()應釋放與語句對象相關的任何資源。

+0

對不起,我想我不是更清楚。我這樣做,但它在我的prod服務器上失敗。經過一些測試後,我注意到它由於它在哪裏而失敗。 – 2009-04-21 19:27:47

0

問題是,雖然無緩衝查詢正在運行我不能做什麼(這是在while循環中)

的解決辦法是添加以下行,以確保緩衝被查詢使用:

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