Php PDO准备的报表是如何工作的;内部”;?

Php PDO准备的报表是如何工作的;内部”;?,php,mysql,database,pdo,prepared-statement,Php,Mysql,Database,Pdo,Prepared Statement,准备好的语句很有用,因为准备“模板”来添加数据会阻止SQL注入,我的问题是,这怎么可能 准备好的陈述到底是如何起作用的 在我编写查询、绑定参数并执行查询之后,会发生什么 我不认为参数是“插入”到查询中的,在这种情况下,预处理语句的效果会失败。。。可能它使用特殊的分隔符来检测查询中数据的开始和结束。如果这是正确的,它们是什么?这完全取决于使用中的PDO适配器是否可以模拟prepares(sqlsrv就是这样的一个例子),或者适应的RDBMS是否确实支持prepared语句,在这种情况下,语句的准备

准备好的语句很有用,因为准备“模板”来添加数据会阻止SQL注入,我的问题是,这怎么可能

准备好的陈述到底是如何起作用的

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


我不认为参数是“插入”到查询中的,在这种情况下,预处理语句的效果会失败。。。可能它使用特殊的分隔符来检测查询中数据的开始和结束。如果这是正确的,它们是什么?

这完全取决于使用中的PDO适配器是否可以模拟prepares(sqlsrv就是这样的一个例子),或者适应的RDBMS是否确实支持prepared语句,在这种情况下,语句的准备和执行实际上由客户机处理(在某些情况下甚至包括服务器)


编辑:


如果您对特定PDO适配器(可能是PDO_mysql)如何处理此问题感兴趣,请查看源代码:

确切的行为取决于。例如,PDO中的mysql驱动程序可以根据

启用或禁用已准备语句的模拟。某些驱动程序执行此操作 不支持本机编写的语句或对 使用此设置强制PDO始终模拟或准备好 语句(如果为TRUE),或尝试使用本机准备的语句(如果为TRUE 错误)。它将始终返回到模拟准备好的语句 如果驱动程序无法成功准备当前查询

模拟模式和您描述的一样:PHP有一个SQL解析器,可以用实际值替换占位符。唯一的实际好处是代码更干净,更易于维护


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

如果引擎是mysql,则语句的准备和执行由服务器完成。如果其他引擎处理它,则不同tly是我不知道的东西,但我猜大部分时间是服务器。因此数据与查询分开,因为它们使用两个不同的通信通道?不要使用“通道”这个词太字面了。我只是说,在本机准备的语句中,代码和数据不会被挤在一个字符串中。我没有研究任何DBMS使用的通信协议的细节。