PHP Postgres PDO驱动程序不支持预处理语句?

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP Postgres PDO驱动程序不支持预处理语句?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
是否会失去理智,或者Postgres PDO驱动程序是否不支持预备语句,而是模仿客户端?

以下代码PRepare()调用返回NO ERROR,即使它应该.相反,它在调用execute()时返回适用的错误.

编辑:因为根据DanielVérITé我错了,我添加了他建议的代码.我仍然得到错误.我的代码现在看起来如下,添加了Daniel的行.

<?PHP
$pdo = new PDO("pgsql:host=myhost;dbname=mydatabase");

$pdo->setattribute(PDO::ATTR_EMULATE_PREPARES,false);  // as suggested by Daniel

$sth = $pdo->prepare('complete GARBAGE');
echo "[prepare] errorInfo = " . print_r($sth->errorInfo(),true);

$sth->execute();
echo "[execute] errorInfo = " . print_r($sth->errorInfo(),true);

PHP版本5.3.15,PHP Postgres客户端版本9.1.4,Postgres服务器版本9.2.1.

http://www.php.net/manual/en/pdo.prepare.php

(事实上​​,实际准备好的陈述无论如何都不会立即发送,请参阅下面的Q2答案)

无论如何,您可以发出:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);

获取使用sql PREPARE命令实现的实际预准备语句.
详见http://www.php.net/manual/en/pdo.setattribute.php.

在进一步的讨论和测试中,出现了两个问题:

Q1.为什么pdo :: getAttribute(PDO :: ATTR_EMULATE_PREPARES)会产生错误
事实上,setAttribute不会出错,但getAttribute(PDO :: ATTR_EMULATE_PREPARES)说:

查看documentation for pdo::getAttribute,它说适用于数据库连接的常量如下,并且从PDO :: ATTR_AUTOCOMMIT到PDO :: ATTR_TIMEOUT之后有许多常量,并且值得注意的是PDO :: ATTR_EMULATE_PREPARES不在其中.严格地说,无论如何,我们不应期望getAttribute(PDO :: ATTR_EMULATE_PREPARES)能够正常工作.

现在查看代码以确定,似乎pdo_pgsql驱动程序提供了一个pdo_pgsql_get_attribute函数,该函数具有以下的switch语句:

> PDO_ATTR_CLIENT_VERSION
> PDO_ATTR_SERVER_VERSION
> PDO_ATTR_CONNECTION_statUS
> PDO_ATTR_SERVER_INFO

就是这样.没有PDO_ATTR_EMULATE_PREPARES的痕迹,这就是最终出现此错误原因.

另一方面,函数pdo_pgsql_set_attr有一个switch语句:

> PDO_ATTR_EMULATE_PREPARES
> PDO_PGsql_ATTR_DISABLE_NATIVE_PREPAred_STATEMENT

这确认了设置时实际考虑了该属性.
因此,PDO与getAttribute不一致,与getAttribute不匹配.

Q2 – 当准备仿真为假时,为什么伪造的声明在准备好后不会立即引发错误

考虑pgsql_statement.c中的这段代码

if (!S->is_prepared) {
stmt_retry:
            /* we deferred the prepare until Now,because we didn't
             * kNow anything about the parameter tyPEs; Now we do */
            S->result = PQprepare(H->server,S->stmt_name,S->query,stmt->bound_params ? zend_hash_num_elements(stmt->bound_params) : 0,S->param_types);

表明使用了PQprepare(这是一个“真正的”预处理语句),但是该语句也没有立即发送到服务器.这就是为什么dbo :: prepare(“bogus statement”)不会返回false:实际上由于缺少参数类型而没有发送到服务器.

脚本宝典总结

以上是脚本宝典为你收集整理的PHP Postgres PDO驱动程序不支持预处理语句?全部内容,希望文章能够帮你解决PHP Postgres PDO驱动程序不支持预处理语句?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。