将准备好的语句与 pdo 一起使用时,关闭仿真有任何副作用吗?我正在使用 select * 并限制需要作为 int 而不是字符串处理的结果。我可以做两件事中的一件。
$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
或者用参数类型显式绑定(bind)这些变量:
$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();
有什么好处或坏处吗?显然关闭仿真会节省大量绑定(bind)。
最佳答案
准备好的语句是低级数据库驱动程序的一个特性。数据库先接受查询结构,再分别接收可变参数。同样,这是数据库本身实际支持的功能。
“模拟准备”意味着您在 PHP 端使用相同的 API,具有单独的 prepare()
和 bind
/execute
调用,但 PDO 驱动程序只是在内部转义和连接字符串,将一个很好的旧长 SQL 字符串发送到数据库。数据库无法使用其 native 参数化查询功能。
关闭模拟准备会强制 PDO 使用数据库的 native 参数化查询功能。如果您的数据库(驱动程序)不支持 native 参数化查询,您应该只打开/离开模拟准备。模拟准备仅用于支持旧数据库(驱动程序),它不会改变您在 PHP 代码中绑定(bind)参数的方式。
模拟准备可能在某些情况下会暴露安全漏洞,就像所有客户端转义和连接一样。如果查询和数据在到达数据库的整个过程中都保持分离,那么这些缺陷就不可能存在。
关于Php 准备好的语句关闭仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15718148/