PDO 准备好的语句如何在“内部”工作?
How does the PDO prepared statements works “inside”?
准备好的语句很有用,因为准备 "templates" 添加数据可以防止 SQL 注入,我的问题是,这怎么可能?
准备好的语句是如何工作的?
在我编写查询、绑定参数并执行查询后,会发生什么?
我不认为参数是 "inserted" 在查询中,在那种情况下准备语句的效果失败......可能它使用特殊的分隔符来检测数据中数据的开始和结束询问。如果这是正确的,它们是什么?
这完全取决于使用的PDO适配器是否可以模拟prepares(sqlsrv就是一个这样的例子)或者适配的RDBMS是否确实支持prepared statements,在这种情况下语句的准备和执行是实际上由客户端处理(或在某些情况下甚至由服务器处理)。
编辑:
如果您对您的特定 PDO 适配器(可能 pdo_mysql)如何处理此问题感兴趣,请查看源代码:https://github.com/php/php-src/blob/master/ext/pdo_mysql/mysql_statement.c
确切的行为取决于。例如,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 解析器,可以用实际值替换占位符。唯一实际的好处是代码更清晰,更易于维护。
本机模式基本上在两个单独的通道中将代码和数据发送到服务器。数据可以按原样发送(即使是二进制模式)。这需要客户端和 server 的支持。好处包括安全性、节省带宽以及使用不同数据集解析 SQL 代码一次和 运行 多次的可能性。实际实现取决于 DBMS。
准备好的语句很有用,因为准备 "templates" 添加数据可以防止 SQL 注入,我的问题是,这怎么可能?
准备好的语句是如何工作的?
在我编写查询、绑定参数并执行查询后,会发生什么?
我不认为参数是 "inserted" 在查询中,在那种情况下准备语句的效果失败......可能它使用特殊的分隔符来检测数据中数据的开始和结束询问。如果这是正确的,它们是什么?
这完全取决于使用的PDO适配器是否可以模拟prepares(sqlsrv就是一个这样的例子)或者适配的RDBMS是否确实支持prepared statements,在这种情况下语句的准备和执行是实际上由客户端处理(或在某些情况下甚至由服务器处理)。
编辑:
如果您对您的特定 PDO 适配器(可能 pdo_mysql)如何处理此问题感兴趣,请查看源代码:https://github.com/php/php-src/blob/master/ext/pdo_mysql/mysql_statement.c
确切的行为取决于。例如,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 解析器,可以用实际值替换占位符。唯一实际的好处是代码更清晰,更易于维护。
本机模式基本上在两个单独的通道中将代码和数据发送到服务器。数据可以按原样发送(即使是二进制模式)。这需要客户端和 server 的支持。好处包括安全性、节省带宽以及使用不同数据集解析 SQL 代码一次和 运行 多次的可能性。实际实现取决于 DBMS。