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之前的版本不通过查询缓存运行预准备语句,后续版本仅在某些特定(但常见)条件下使用查询缓存.
(有些人建议完全关闭查询缓存.使用大缓存大小实际上可能是一个主要的性能损失.)
默认情况下,PDO_MYSQL模拟准备好的语句.要使用本机服务器端预处理语句,应该明确设置
$PDO->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2259 次 |
| 最近记录: |