给出类似
的内容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类似问题中所写的那样的标记
答案 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);