7

将准备好的语句与 pdo 一起使用时,关闭仿真是否有任何副作用?我正在使用 select * 并限制需要作为 int 而不是字符串处理的结果。我可以做两件事之一。

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

或者用参数类型显式绑定这些变量:

$stm = $pdo->prepare('SELECT * FROM table LIMIT ?, ?');
$stm->bindParam(1, $limit_from,PDO::PARAM_INT);
$stm->bindParam(2, $per_page,PDO::PARAM_INT);
$stm->execute();
$data = $stm->fetchAll();

有什么优点或缺点吗?显然,关闭仿真会节省大量绑定。

4

2 回答 2

16

准备好的语句是低级数据库驱动程序的一个特性。数据库先接受查询结构,分别接受可变参数。同样,这是数据库本身实际支持的功能。

“模拟准备”意味着您在 PHP 端使用相同的 API,使用单独的prepare()bind/execute调用,但 PDO 驱动程序只是在内部转义和连接字符串,将一个很好的旧长 SQL 字符串发送到数据库。数据库无法使用其本机参数化查询功能。

关闭仿真准备会强制 PDO 使用数据库的本机参数化查询功能。如果您的数据库(-驱动程序)不支持本机参数化查询,您应该只打开/保留模拟准备。模拟准备仅用于支持旧数据库(-驱动程序),它不会改变您在 PHP 代码中绑定参数的方式。

模拟准备可能会在某些情况下暴露安全漏洞,就像所有客户端转义和连接一样。如果查询和数据一直保持分离到数据库,那么这些缺陷是不可能的。

于 2013-03-30T12:16:21.587 回答
0

不,没有值得一提的优点或缺点。

显然,关闭仿真会节省大量绑定。

没有那么多。您可以仅在具有 LIMIT 的情况下使用绑定,并在execute()所有其他情况下继续使用延迟绑定,即使打开了仿真也是如此。

于 2013-03-30T11:45:18.043 回答