使用PDO对一个请求执行无缓冲查询

Sab*_*eam 4 php pdo request unbuffered

我只想在一些请求上做无缓冲的查询.

在mysql中我这样做:

$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...
}
Run Code Online (Sandbox Code Playgroud)

我查看了php doc,根据它pdo我们必须以这种方式进行无缓冲的查询:

$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;
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,是否可以仅为"forum_topics"表结果进行无缓冲,而无需将所有pdo实例设置为无缓冲?

Sab*_*eam 8

Re,这不起作用,我在使用你的方法时遇到错误:

SQLSTATE [IM001]:驱动程序不支持此功能:此驱动程序不支持设置属性

怎么了?

编辑:我在php.net doc上找到了解决方案.

如果你使用这个:

$sth->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
Run Code Online (Sandbox Code Playgroud)

它不起作用.

但是如果你在prepare()中的数组中设置它,它可以正常工作.

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

我希望这能帮助那些没有找到解决方案的人.

  • 您是否检查过,为PDOStatement设置此操作会导致无缓冲的查询?我尝试了各种不同的东西,它起作用了,但它没有任何效果.我真正得到无缓冲查询的唯一时间是我为PDO对象设置属性. (5认同)

Fél*_*ier 4

您可以在 PDO 连接上设置属性:

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
Run Code Online (Sandbox Code Playgroud)

然后运行这个特定的查询,其结果需要不缓冲,

$uresult = $pdo->query("SELECT Name FROM City");
while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
    echo $row['Name'] . PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

然后将属性设置回来

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
Run Code Online (Sandbox Code Playgroud)

  • @WilliamEntriken 我编辑了这个答案以使其事实上正确。 (2认同)