Php 准备好的语句关闭仿真

标签 php prepared-statement fetchall

将准备好的语句与 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/

相关文章:

php - 创建一个 jquery/php 系统来识别一个字符串是否包含来自另一个数据库的用户的用户名

php - 是否可以防止标准 HTML 注释出现在源代码中?

php - 为 foreach() codeigniter 提供的参数无效

postgresql - 在 Postgresql 存储过程中使用准备好的语句或动态命令?

mysql - 在 Mysql Prepared 语句中增加设置的变量长度

php - 在不知道字段 php 的情况下循环遍历 fetchall

performance - sqlite.fetchall() 慢是正常的吗?

php - wordpress 插件 -> 调用未定义的函数 wp_get_current_user()

java - 使用 JDBC 插入 PostgreSQL 时间类型时出错

python - 为什么相同的 SQLite 查询在只获取两倍的结果时会慢 30 倍?