php - PDO 准备好的语句如何工作 “inside” ?

标签 php mysql database pdo prepared-statement

准备好的语句很有用,因为准备"template"来添加数据可以防止 SQL 注入(inject),我的问题是,这怎么可能?

准备好的语句是如何工作的?

在我编写查询、绑定(bind)参数并执行查询后,会发生什么?

我不认为参数是在查询中“插入”的,在那种情况下,准备语句的效果会失败……也许它使用特殊的定界符来检测查询中数据的开始和结束。如果这是正确的,它们是什么?

最佳答案

确切的行为取决于。例如,PDO 中的 MySQL 驱动程序可以根据 PDO::ATTR_EMULATE_PREPARES attribute 的值做两件完全不同的事情。 :

Enables or disables emulation of prepared statements. Some drivers do not support native prepared statements or have limited support for them. Use this setting to force PDO to either always emulate prepared statements (if TRUE), or to try to use native prepared statements (if FALSE). It will always fall back to emulating the prepared statement if the driver cannot successfully prepare the current query.

模拟模式就像您描述的那样:PHP 有一个 SQL 解析器,它用实际值替换占位符。唯一实际的好处是代码更清晰且更易于维护。

native 模式基本上是通过两个单独的 channel 向服务器发送代码和数据。数据可以按原样发送(即使是二进制模式)。这需要客户端和 server支持。好处包括安全性、节省带宽以及解析 SQL 代码一次并使用不同数据集运行多次的可能性。实际实现取决于 DBMS。

关于php - PDO 准备好的语句如何工作 “inside” ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34064984/

相关文章:

mysql - 如何将查询从 MYSQL 更改为 SQL SERVER 的 LIMIT

mysql - 如何准备文件中的数据并将其插入到 Mysql DB 中?

database - 如何将几何数据类型用于 postgres 表?

sql - 我们可以将SQL中的逗号分隔列表作为参数传递吗

php - 部署到开发服务器时 Capifony 缓存错误

PHP Foreach 循环效率

php - 我如何使用 Stripe php 用卡 ID 或客户 ID 收费?

c# - RSA 在 C# (.NET 3.5) 中解密数据,在 php 5.3.2 中用 openssl 加密

mysql - 简单的 CREATE TABLE 语句出现奇怪的 MySQL 语法错误

python - Django 将表迁移到新数据库