Php PDO_PGSQL驱动程序是否支持prepared语句?

Php PDO_PGSQL驱动程序是否支持prepared语句?,php,sql,postgresql,pdo,Php,Sql,Postgresql,Pdo,我正在我的项目中使用PosgreSQL和PDO。正如这里所说,默认情况下,PDO不为不支持它的数据库驱动程序使用准备好的语句。PosgreSQL数据库驱动程序(PDO_PGSQL)是否支持预处理语句?谢谢 PDO默认情况下不使用nativeprepared语句,这意味着它在内部模拟prepared语句,而不是使用实际存在的数据库API。您可以通过将PDO::ATTR\u EMULATE\u PREPARES设置为false来关闭该行为 PDO::ATTR\u EMULATE\u PREPARES

我正在我的项目中使用PosgreSQL和PDO。正如这里所说,默认情况下,PDO不为不支持它的数据库驱动程序使用准备好的语句。PosgreSQL数据库驱动程序(PDO_PGSQL)是否支持预处理语句?谢谢

PDO默认情况下不使用nativeprepared语句,这意味着它在内部模拟prepared语句,而不是使用实际存在的数据库API。您可以通过将
PDO::ATTR\u EMULATE\u PREPARES
设置为
false
来关闭该行为

PDO::ATTR\u EMULATE\u PREPARES
启用或禁用对已准备好的 声明。某些驱动程序不支持本机准备的语句或 对他们的支持有限。使用此设置强制PDO执行以下任一操作: 始终模拟准备好的语句(如果
TRUE
),或尝试使用 本机准备的语句(如果
FALSE
)。它总是会回到过去 如果驱动程序无法成功运行,则模拟准备好的语句 准备当前查询

这只是为了(希望)澄清你的说法

PDO_PGSQL确实支持近10年前发布的本机预制语句。

PDO默认情况下不使用本机预制语句,这意味着它在内部模拟预制语句,而不是使用实际存在的数据库API。您可以通过将
PDO::ATTR\u EMULATE\u PREPARES
设置为
false
来关闭该行为

PDO::ATTR\u EMULATE\u PREPARES
启用或禁用对已准备好的 声明。某些驱动程序不支持本机准备的语句或 对他们的支持有限。使用此设置强制PDO执行以下任一操作: 始终模拟准备好的语句(如果
TRUE
),或尝试使用 本机准备的语句(如果
FALSE
)。它总是会回到过去 如果驱动程序无法成功运行,则模拟准备好的语句 准备当前查询

这只是为了(希望)澄清你的说法


PDO_PGSQL确实支持本机编写的语句,该语句是近10年前发布的。

简短的版本是为了防止SQL注入,它并不重要

数据库驱动程序中正确实现且一致的参数转义足以提供与使用服务器端参数化语句相同级别的SQL注入保护

如果PDO使用PostgreSQL的bind parse execute协议让服务器处理参数化语句,那就太好了,但这样做还远远不够重要

建议人们使用参数化语句(通常不准确地称为“准备语句”)的目的是确保它们与构造语句的方式一致。如果所有转义都通过一个具有正确编写的框架的单一入口点,并且您遵循有关使用该框架的严格规则,那么您就不太可能留下意外的SQL注入漏洞


实际上,您希望PDO对非DML/SELECT语句进行参数化语句模拟,因为PostgreSQL的wire协议不支持DDL的参数绑定。

简短版本是为了防止SQL注入,这无关紧要

数据库驱动程序中正确实现且一致的参数转义足以提供与使用服务器端参数化语句相同级别的SQL注入保护

如果PDO使用PostgreSQL的bind parse execute协议让服务器处理参数化语句,那就太好了,但这样做还远远不够重要

建议人们使用参数化语句(通常不准确地称为“准备语句”)的目的是确保它们与构造语句的方式一致。如果所有转义都通过一个具有正确编写的框架的单一入口点,并且您遵循有关使用该框架的严格规则,那么您就不太可能留下意外的SQL注入漏洞


实际上,您希望PDO对非DML/SELECT语句进行参数化语句模拟,因为PostgreSQL的wire协议不支持DDL的参数绑定。

如果PDO驱动程序不支持准备好的语句,PDO将为您模拟它们。看:是的,我知道。询问PDO_PGSQL是否支持准备好的语句,但不支持关于PDO行为的语句;)因此,请关闭模拟并尝试准备语句…@MarcB“如果驱动程序无法成功准备当前查询,它将始终返回模拟准备好的语句。”-您将如何准确地测试…?:)关闭模拟后,准备语句将失败。如果pdo驱动程序不支持准备好的语句,pdo将为您模拟它们。看:是的,我知道。询问PDO_PGSQL是否支持准备好的语句,但不支持关于PDO行为的语句;)因此,请关闭模拟并尝试准备语句…@MarcB“如果驱动程序无法成功准备当前查询,它将始终返回模拟准备好的语句。”-您将如何准确地测试…?:)关闭模拟后,准备语句将失败。这意味着数据将转义并存储在查询中的占位符中,然后查询将(作为计划文本)发送到数据库服务器,而不创建准备语句?如果使用模拟准备语句,则为“是”,数据被转义并作为一个普通查询发送到数据库;PDO_PGSQL驱动程序会使用真正的准备语句吗?是的,据我所知。这意味着数据将转义并存储在查询中的占位符中,然后查询将(作为计划文本)发送到数据库服务器,而不创建准备语句?如果使用模拟的准备语句,则是,数据被转义并作为o发送到数据库