CXJ*_*CXJ 4 php postgresql 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);
Run Code Online (Sandbox Code Playgroud)
PHP版本5.3.15,PHP Postgres客户端版本9.1.4,Postgres服务器版本9.2.1.
见http://www.php.net/manual/en/pdo.prepare.php
注意:
模拟的预准备语句不与数据库服务器通信,因此PDO :: prepare()不检查语句.
(事实上,无论如何都不会立即发送真实的预备声明,请参阅下面的Q2答案)
无论如何你可以发出:
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
Run Code Online (Sandbox Code Playgroud)
获取使用SQL PREPARE命令实现的实际预准备语句.有关更多信息,请参见http://www.php.net/manual/en/pdo.setattribute.php.
在进一步的讨论和测试中,出现了两个问题:
Q1.为什么会pdo::getAttribute(PDO::ATTR_EMULATE_PREPARES)产生错误?
确实setAttribute没有错误但是getAttribute(PDO::ATTR_EMULATE_PREPARES)说:
'SQLSTATE [IM001]:驱动程序不支持此功能:驱动程序不支持该属性'
查看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_EMULATE_PREPARES的痕迹,这就是最终出现此错误的原因.
另一方面,该函数pdo_pgsql_set_attr有一个switch语句:
这确认了设置时实际考虑了该属性.因此,PDO与getAttribute不匹配的不一致setAttribute.
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);
Run Code Online (Sandbox Code Playgroud)
它表明PQprepare使用了(这是一个"真正的"预备语句),但也表明该语句没有立即发送到服务器.这就是为什么dbo::prepare("bogus statement")不会返回false:实际上由于缺少参数类型而没有发送到服务器.
| 归档时间: |
|
| 查看次数: |
4409 次 |
| 最近记录: |