这是我到目前为止所读到的PDO::ATTR_EMULATE_PREPARES:
我不知道这些陈述是多么真实.选择MySQL接口时我最担心的是阻止SQL注入.第二个问题是表现.
我的应用程序目前使用过程MySQLi(没有预处理语句),并且使用了很多查询缓存.它很少会在单个请求中重复使用预准备语句.我开始转向PDO以获取已准备好的语句的命名参数和安全性.
我正在使用MySQL 5.1.61和PHP 5.3.2
我应该PDO::ATTR_EMULATE_PREPARES启用还是不启用?有没有办法既具有查询缓存的性能又具有预准备语句的安全性?
请仔细阅读问题.这通常不是愚蠢的"我的代码不起作用!!!" 题.
当我使用预期的错误运行此代码时
try {
$sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
$sth->execute(array("I'm","d'Artagnan"));
} catch (PDOException $e) {
echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息
您的SQL语法中有错误...在第1行'INN('我'','d \'Artagnan')'附近
但我多年来一直认为查询和数据是分开发送给服务器的,而且绝不干涉.因此我有一些问题(虽然我怀疑有人得到答案......)
更新
mysqli 是按预期做的:它会抛出一个错误说 near 'INN(?,?)'