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

时间:2011-04-20 20:51:53

标签: 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);
}

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

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

2 个答案:

答案 0 :(得分:11)

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

检查PDO::ATTR_EMULATE_PREPARES属性。在当前的PDO手册中,它的记录很少。由于记录不完整,我的意思是它在网站上的评论中只显示 ,而不是手册本身。

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

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

答案 1 :(得分:5)

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

$PDO->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);