Php 使用PDO对一个请求执行无缓冲查询
我希望只对一些请求进行无缓冲查询 在mysql中,我是这样做的: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中的内容,我们必须以这种方
$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);