php – 用PDO支持服务器端预处理语句?

给出类似的东西

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

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

foreach($statement as $record){
    var_dump($record);
}

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%'

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

PHP是PHP版本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

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

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

检查PDO :: ATTR_EMULATE_PREPARES属性.目前的PDO手册中没有详细记录.由于记录不完整,我的意思是它只出现在网站上的评论中,而不是手册本身.

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

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

https://stackoverflow.com/questions/5736492/support-server-side-prepared-statements-with-pdo

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:php – 用PDO支持服务器端预处理语句?