2013-03-22 58 views
5

我有最古怪的PHP PDO問題,我希望你們能爲我解決這個問題。當LIMIT太高時,PHP的PDO查詢不會執行?

如果我設置$checkLimit爲50000,查詢工作正常。但是,如果我將它設置爲任何超過50K,它不返回任何結果 - 它不投任何錯誤消息是(我已經把它們使用$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING)

$sql = " 
    SELECT d_domain_name AS domainName, d_domain_id AS domainID 
    FROM domains 
    ORDER BY d_domain_name_length ASC, d_domain_name ASC 
    LIMIT :checkLimit 
"; 
$stmt = $db->prepare($sql); 
$stmt->bindValue(':checkLimit', intval($checkLimit), PDO::PARAM_INT); 
$stmt->execute(); 
$results = $stmt->fetchAll(); 
foreach ($results as $result) { 
// 50k moments of magic 
} 

如果我運行。 PHP以外的查詢,它可以與任何限制(甚至500k,需要約3分鐘)

我試過改變$results = $stmt->fetchAll()while ($result = $stmt->fetch()) {}爲了嘗試和節省內存,但沒有做任何事情,不幸的是,

有人能告訴我我在做什麼錯嗎?我錯過了什麼?爲什麼我不能超過50k?

+0

考慮到'int'值不是無限的,你可能已經超過了限制數。 – fedorqui 2013-03-22 21:53:21

+2

它不是什麼?不要讓我們陷入懸念! – 2013-03-22 21:53:36

+0

@fedorqui:50,000將非常適合32bit PHP int – 2013-03-22 21:54:45

回答

4

參考:http://php.net/manual/en/mysqlinfo.concepts.buffering.php

PDO默認使用 「緩衝查詢」。

這意味着查詢結果會立即從 MySQL服務器轉移到PHP中,然後保存在PHP進程的內存中。 ....緩衝模式的缺點是較大的結果 集可能需要相當多的內存。 ....

以下這些特性緩衝查詢應 情況下,你指望只有有限的結果集或需要閱讀所有行之前知道 量返回的行使用。當您期望更大的結果時,應使用無緩衝模式 。

50k是一個很大的結果集。您可以嘗試讓pdo使用無緩衝模式一次獲取一行?這是從參考中複製的示例。第二行設置無緩衝模式。

<?php 
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); 
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 

$uresult = $pdo->query("SELECT Name FROM City"); 
if ($uresult) { 
    while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { 
     echo $row['Name'] . PHP_EOL; 
    } 
} 
?> 
+0

不錯,這很有趣 – Sebas 2013-03-25 13:21:42

+0

它工作的很好 - 除了我不能在查詢中執行新的查詢; '當其他未緩衝的查詢處於活動狀態時,無法執行查詢。考慮使用PDOStatement :: fetchAll()。或者,如果您的代碼只是針對mysql運行,則可以通過設置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY屬性來啓用查詢緩衝。' – 2013-03-28 08:59:45

+0

您可以嘗試打開另一個pdo連接到其他緩衝查詢的同一數據庫嗎? – 2013-03-28 12:50:12