PHP pdo链接postgresql数据库,where条件中使用json报错

  • 最近在使用postgresql数据库的json格式,发现pdo查询报错
  • 源码如下
<?php

    // 使用PDO链接
    $pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=postgres","postgres","");
    $statement = $pdo->prepare("select * from test where account::jsonb ? '111'");
    $statement->execute();
    var_dump($statement->errorInfo());
    $rs = $statement->fetch();
    var_dump($rs);
    
    // 原生链接 查询
    $p = pg_connect("host=127.0.0.1 port=5432 dbname=postgres user=yluchao password=''");
    $rs = pg_query($p, "select * from test where account::jsonb ? '111'");
    var_dump(pg_fetch_all($rs));



/*create table test
(
  id bigserial primary key,
  account jsonb not null default '{}',
  name varchar(255) not null default ''
);*/

图片描述

如图 使用pdo查询报错,使用原生的pgsql链接则可以查询

阅读 4.7k
2 个回答

在PHP中PDO::prepare里包含?就表示是占位符。直接使用PDO::query就不会有这个问题。

其实关于这个问题,官方早就有回复:https://bugs.php.net/bug.php?...

解决方案:关闭本地模拟预处理

$pdo = new PDO(...);
$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES ,false);

或者

$pdo->prepare($sql,[\PDO::ATTR_EMULATE_PREPARES=>false]);

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

PHP 默认开启本地模拟,关闭ATTR_EMULATE_PREPARES后会将prepare操作发送到数据库服务器由数据库服务器来进行操作。

    PDO 占位符写的有问题,不知道这个test 表数据结构是怎么样的
    // 使用PDO链接
    $pdo = new PDO("pgsql:host=127.0.0.1;port=5432;dbname=postgres","postgres","");
    $statement = $pdo->prepare("select * from test where account = ?");
    $statement->execute(array(111));
    var_dump($statement->errorInfo());
    $rs = $statement->fetch();
    var_dump($rs);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题