2014-01-09 54 views
3

我正在尋求只對某些請求執行無緩衝的查詢。在pdo使用PDO爲一個請求執行無緩衝的查詢

$req = mysql_unbuffered_query('SELECT * FROM forum_topics 
ORDER BY (topic_id/topic_stick) DESC, topic_last_post DESC'); 
while($data = mysql_fetch_assoc($req)) { 
    // display results... 
} 

我看了一下PHP文檔,並根據它,我們必須繼續這樣做查詢緩衝:

在MySQL我這樣做

$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; 
    } 
} 

但它是可能做到這一點沒有緩衝只爲「forum_topics」表結果沒有設置所有的pdo實例無緩衝?

回答

3

如果你使用準備語句(你可以用它們進行簡單的選擇)是這樣的:

$uresult->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 

則執行準備的語句:

$uresult = $pdo->prepare("SELECT Name FROM City"); 

,那麼你可以在uresult設置屬性:

$uresult->execute(); 
if ($uresult) { 
    while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { 
     echo $row['Name'] . PHP_EOL; 
    } 
} 

那麼unbuffered屬性只應用於您的語句,而不是你的整個PDO對象

8

重,這是不行的,在使用你的方法我得到了一個錯誤:

SQLSTATE [IM001]:驅動器不支持此功能:該驅動程序不支持設置屬性

怎麼了?

編輯:我在php.net doc上找到了解決方案。

如果使用這樣的:

$sth->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 

它不工作。

但是,如果你在prepare()中的數組中設置它,它會正常工作。

$sth = $pdo->prepare('SELECT * FROM my_table', 
array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false)); 

我希望這會幫助那些還沒有找到解決方法的人。

+3

您是否檢查過,爲PDOStatement設置此實用程序會導致未緩衝的查詢?我嘗試了不同的相同的東西,它的工作,但它沒有任何影響。 當我設置PDO對象的屬性時,唯一真正得到未緩衝查詢的時間。 – Ragas

相關問題