Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDO对一个请求执行无缓冲查询_Php_Mysql_Pdo_Request_Unbuffered - Fatal编程技术网

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

Php 使用PDO对一个请求执行无缓冲查询,php,mysql,pdo,request,unbuffered,Php,Mysql,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... } 我查看了php文档,根据pdo中的内容,我们必须以这种方

我希望只对一些请求进行无缓冲查询

在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文档,根据
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;
   }
}

但是,在不将所有pdo实例设置为unbuffered的情况下,是否可以仅对“forum_topics”表结果执行unbuffered操作

您可以在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);

Re,这不起作用,我在使用您的方法时出错:

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

怎么了

编辑:我在php.net文档中找到了解决方案

如果您使用此选项:

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

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

作为一种解决方法,如果我的查询是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 = '';
                }
此外,如果在查询开始处意外地放置了空格,则必须处理该异常。
希望这有帮助。

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

来源:

以下是您的错误消息:

在上面的
stmt->methods->set_属性中检查上述条件

上面定义了
stmt->methods
,并在以下位置声明了类型:

set\u属性
参数是第10个结构条目

下面是MySQL PDO实现。这里定义了语句和方法:

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

讨论:


我已经回顾了其他扩展。只有Firebird PDO数据库模块支持该功能。

这里的答案都是试图在Station上使用
MYSQL\u ATTR\u use\u BUFFERED\u QUERY
。而
MYSQL\u ATTR\u USE\u BUFFERED\u QUERY
只在整个连接上运行,就像您使用的那样

MYSQL\u ATTR\u USE\u BUFFERED\u QUERY
仅在您使用
mysqlnd
库时才有效-如果您使用的是PHP7或更高版本,您的成功几率是多少

您最初将连接设置为无缓冲的方法是正确的,也是唯一真正起作用的方法

$pdo->setAttribute(pdo::MYSQL\u ATTR\u USE\u BUFFERED\u QUERY,false);
但是,在不将所有pdo实例设置为unbuffered的情况下,是否可以仅对“forum_topics”表结果执行unbuffered操作

并非所有实例都设置为无缓冲,只有该连接的“实例”才设置为无缓冲。您可以简单地立即将缓冲恢复到ala上:

$pdo->setAttribute(pdo::MYSQL\u ATTR\u USE\u BUFFERED\u QUERY,true);
问题是,在非缓冲模式下,每个连接只能迭代一个查询,因此在从第一个集合检索到所有数据之前,无法运行第二个查询

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

$pdo2 = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo2->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

您是否检查过,为PDO语句设置此值会导致无缓冲查询?我尝试了同样的方法,效果很好,但没有任何效果。我唯一真正得到无缓冲查询的时候是为PDO对象设置属性时。我遇到的结果与@ragastis仅适用于Firebird数据库的结果相同。请参阅@WilliamEntriken的详细信息我编辑了这个答案以使其真实无误。你在
PDO MySQL不支持FETCH_ASSOC
@YourCommonSense上失去了我。我在重写那个句子时脑子里放了一个屁,把一些固定名称和我的粘贴混在了一起。我把这句话讲清楚了,但还是不清楚你想说什么。为什么您需要第二个PDO连接?这本身是一种非常糟糕的做法,在这种特殊情况下完全没有必要。第二个pdo连接的使用是让一个处于缓冲模式,另一个处于非缓冲模式。非缓冲模式下的连接一次只能执行一个查询,因此您无法查询数据的数据库中循环,这可能会非常有限,并导致意外错误。在正常使用中,除了非常大的数据集之外,您希望几乎所有的查询都以缓冲模式执行。只有在需要使用无缓冲查询时才创建无缓冲连接是有意义的。好吧,这是有意义的,但您最好将答案集中在这个特定的用例上。这是一个正确的发现,了解pre-se也很好,但从实际角度看,这并不重要,因为PHP执行是线性的,您可以根据当前需要在连接上来回设置此设置。
struct pdo_stmt_methods
NULL, /* set_attr */
$pdo2 = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo2->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);