相关疑难解决方法(0)

PDO MySQL:是否使用PDO :: ATTR_EMULATE_PREPARES?

这是我到目前为止所读到的PDO::ATTR_EMULATE_PREPARES:

  1. PDO的准备仿真对性能更好,因为MySQL的本机准备绕过了查询缓存.
  2. MySQL的本机准备更好于安全性(防止SQL注入).
  3. MySQL的本机准备更适合错误报告.

我不知道这些陈述是多么真实.选择MySQL接口时我最担心的是阻止SQL注入.第二个问题是表现.

我的应用程序目前使用过程MySQLi(没有预处理语句),并且使用了很多查询缓存.它很少会在单个请求中重复使用预准备语句.我开始转向PDO以获取已准备好的语句的命名参数和安全性.

我正在使用MySQL 5.1.61PHP 5.3.2

我应该PDO::ATTR_EMULATE_PREPARES启用还是不启用?有没有办法既具有查询缓存的性能又具有预准备语句的安全性?

php mysql pdo

113
推荐指数
7
解决办法
5万
查看次数

PDO参数化查询的工作方式

请仔细阅读问题.这通常不是愚蠢的"我的代码不起作用!!!" 题.

当我使用预期的错误运行此代码时

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')'附近

但我多年来一直认为查询和数据是分开发送给服务器的,而且绝不干涉.因此我有一些问题(虽然我怀疑有人得到答案......)

  1. 它在哪里获得如此熟悉的字符串表示 - 引用和转义?它是否特别报告错误或是否是实际查询的一部分?
  2. 它是如何在真实中起作用的?它是否用占位符代替数据?
  3. 有没有办法获得整个查询,而不仅仅是一点点,用于调试目的?

更新

mysqli 是按预期做的:它会抛出一个错误说 near 'INN(?,?)'

php pdo parameterized-query

8
推荐指数
2
解决办法
780
查看次数

标签 统计

pdo ×2

php ×2

mysql ×1

parameterized-query ×1