用PDO支持服务器端预备语句?

Dav*_*vid 6 php mysql pdo prepared-statement

给出类似的东西

DB()->prepare("SELECT * FROM mysql.general_log WHERE user_host LIKE ?");

$statement->execute( array('%console%') );

foreach($statement as $record){
    var_dump($record);
}
Run Code Online (Sandbox Code Playgroud)

general_log的内容是

*************************** 1. row ***************************
event_time: 2011-04-20 14:27:59
user_host: REDACTED[REDACTED] @ REDACTED [192.168.56.101]
thread_id: 30
server_id: 0
command_type: Connect
argument: REDACTED@REDACTED on REDACTED
*************************** 2. row ***************************
event_time: 2011-04-20 14:27:59
user_host: REDACTED[REDACTED] @ REDACTED [192.168.56.101]
thread_id: 30
server_id: 0
command_type: Query
argument: SELECT * FROM mysql.general_log WHERE user_host LIKE '%console%'
Run Code Online (Sandbox Code Playgroud)

我在一个令人厌恶的框架内工作(没有单元测试,没有文档,没有ryhme或原因)所以有可能在某个地方有人明确地禁用了MySQL准备语句,迫使PDO使用模拟模式......或者这是预期的行为?

PHP是PHP Version 5.2.10-2ubuntu6 MySQL的PDO驱动程序,客户端库版本5.1.41

更新:PDO()使用以下属性构造

PDO::ATTR_PERSISTENT => false
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
Run Code Online (Sandbox Code Playgroud)

我浏览了PDO文档,但不幸的是,似乎没有提到像这个类似问题中写的那样的标志

Cha*_*les 11

某些PDO驱动程序不支持本机预处理语句,因此PDO会执行准备模拟.它还允许您手动启用此仿真.

检查PDO::ATTR_EMULATE_PREPARES属性.在当前的PDO手册中,它的记录很少.通过记录不完整,我的意思是,它似乎在网站上的评论,手册本身不在家.

通常,您希望尽可能使用本机预处理语句.对于MySQL,如果您正在利用查询缓存,您可能实际上想要在PDO中禁用本机预处理语句! MySQL手册有更多信息,但简短版本是5.1.17之前的版本不通过查询缓存运行预准备语句,后续版本仅在某些特定(但常见)条件下使用查询缓存.

(有些人建议完全关闭查询缓存.使用大缓存大小实际上可能是一个主要的性能损失.)


Gri*_*nov 5

默认情况下,PDO_MYSQL模拟准备好的语句.要使用本机服务器端预处理语句,应该明确设置

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