5

我希望仅对某些请求进行无缓冲查询。

在 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...
}

我查看了 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;
   }
}

但是是否可以仅对“forum_topics”表结果进行无缓冲而不将所有 pdo 实例设置为无缓冲?

4

5 回答 5

11

重新,这不起作用,我在使用您的方法时遇到错误:

SQLSTATE[IM001]: Driver does not support this function: This driver does not support setting attributes

怎么了?

编辑:我在 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));

我希望这会帮助那些还没有找到解决这个问题的方法的人。

于 2014-01-10T20:18:53.140 回答
4

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

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

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

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

然后将属性设置回来

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
于 2014-01-09T17:07:10.777 回答
2

MySQL 没有实现语句级属性设置。

来源:

这是您的错误消息:

上面的条件是在上面检查的stmt->methods->set_attribute

stmt->methods上面定义了,类型声明在:

set_attribute参数是第 10 个结构条目。

这是 MySQL PDO 的实现。语句方法在这里定义:

这表明 MySQL PDO 模块确实实现了该功能。

讨论:

我已经查看了其他扩展。并且只有 Firebird PDO 数据库模块支持该功能。

于 2020-06-01T20:01:19.293 回答
2

这里的答案都是试图MYSQL_ATTR_USE_BUFFERED_QUERY 在 statment 上使用。并且MYSQL_ATTR_USE_BUFFERED_QUERY仅在整个连接上运行,正如您似乎已经猜到的那样。

MYSQL_ATTR_USE_BUFFERED_QUERY也仅在您使用该mysqlnd库时才有效 - 如果您使用的是 PHP 7 或更高版本,那么您的可能性很大。

您将连接设置为无缓冲的原始方法是正确且唯一实际有效的方法。

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

但是是否可以仅对“forum_topics”表结果进行无缓冲而不将所有 pdo 实例设置为无缓冲?

并非所有实例都设置为无缓冲,只有该连接的“实例”。您可以简单地立即重新打开 ala 缓冲:

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

问题是,在无缓冲模式下,每个连接只能迭代一个查询,因此在从第一个集合中检索到所有数据之前,您不能运行第二个查询。

通常您只想对非常大的数据集使用无缓冲查询。我建议使用第二个 PDO 连接到数据库,专门用于在需要运行无缓冲查询时打开的无缓冲查询,即:

$pdo2 = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo2->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
于 2020-07-01T05:21:42.973 回答
-2

如果我的查询是 SELECT,则作为一种解决方法,我不调用 fetchAll 函数。

                $query = 'SELECT ...... ';
                $arr = explode(' ', $query);
                $query_type = strtolower($arr[0]);
                if ($query_type == 'select') {
                    $query_response = $query_prepare->fetchAll(PDO::FETCH_ASSOC);
                } else {
                    $query_response = '';
                }

此外,当您不小心在查询开头放置了一个空格时,您必须处理该异常。希望这会有所帮助。

于 2019-06-06T11:48:13.330 回答