PHP PDO(带有libpq V 9.1.4)绑定以使用CITEXT的变通方法?

PHP PDO(带有libpq V 9.1.4)绑定以使用CITEXT的变通方法?,php,postgresql,postgresql-9.1,Php,Postgresql,Postgresql 9.1,情景 两个系统(不是服务器)运行PHP和PostgreSQL,版本如下 软呢帽15: PHP PHP 5.3.13(cli)(构建时间:2012年5月9日14:38:35) 版权所有(c)1997-2012 PHP集团 Zend Engine v2.3.0版权所有(c)1998-2012 Zend Technologies pdo_pgsql PostgreSQL(libpq)9.0.7版 模块版本1.0.2 PostgreSQL PostgreSQL 9.1.4 启用CITEXT扩展时

情景

两个系统(不是服务器)运行PHP和PostgreSQL,版本如下

  • 软呢帽15: PHP PHP 5.3.13(cli)(构建时间:2012年5月9日14:38:35)
    版权所有(c)1997-2012 PHP集团
    Zend Engine v2.3.0版权所有(c)1998-2012 Zend Technologies
    pdo_pgsql
    PostgreSQL(libpq)9.0.7版
    模块版本1.0.2


    PostgreSQL
    PostgreSQL 9.1.4
    启用CITEXT扩展时

  • ArchLinux: PHP PHP 5.4.6(cli)(构建日期:2012年8月16日12:50:09)
    版权所有(c)1997-2012 PHP集团
    Zend Engine v2.4.0版权所有(c)1998-2012 Zend Technologies
    pdo_pgsql
    PostgreSQL(libpq)9.1.4版
    模块版本1.0.2


    PostgreSQL
    PostgreSQL 9.1.4
    启用CITEXT扩展时


当一个简单的查询,如

select column1 from schema1.table1 where column1= ? 
其中column1的类型为CITEXT,通过PHP PDO执行

  • 在带有PHP5.3.13、libpq 9.0.7的Fedora上,查询在CITEXT中的执行与预期的一样(出现不区分大小写的搜索)
  • 在具有PHP5.4.6、libpq 9.1.4的ArchLinux上,查询在CITEXT中的执行情况与预期不符(出现区分大小写的搜索)
我猜较新版本的PHP PDO libs正在做类似的事情:

select column1 from schema1.table1 where column1= 'value'::text;
在装订过程中

  • 我说得对吗
  • 有解决办法吗?否则,在使用较新版本的PDO时,使用CITEXT作为列数据类型以获得不区分大小写搜索的优势是无用的

更新 打开语句级日志后,在使用PHP 5.4.6、libpq 9.1.4的ArchLinux上: 其中,
column1
列的实际值为
value

仍然返回0个元素

声明什么时候发表

select column1 from schema1.table1 where column1 = 'value';
直接在
PSQL
提示符上执行,返回一行

 column1  
---------
  VALUE
 (1 row)
因此,类型转换不会发生!我仍然无法理解
PDO
/
postgresql
的行为


更新2012-08-27 16:15:43.669142+00(城市轨道交通+0) 在尝试直接执行查询而不准备语句之后。 以下是用于测试的代码:

try {
    $db = new PDO('pgsql:dbname=database1;user=user;password=pass;host=localhost');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT column1 from schema1.column1 where column1 = 'value'::citext ";
    $retval=$db->query($sql);
    foreach ($retval as $row) {
        print $row['uname'] . '<br>';
    }
}catch (PDOException $PDOerr) {
    echo 'An error occured : <br>';
    var_dump($PDOerr);
    exit;
    //some thing went wrong while performing the action on db.
    }
我不明白为什么没有检测到
citext
! 当直接在
PSQL
提示符上执行该语句时,如上所述,一切正常


最后更新
这是我试图登录的用户的搜索路径问题。我猜我是在对其他模式执行会话智能
设置搜索路径时创建了该用户,并将其设置为其他模式,而不是默认的“$user”,public。用户根本没有访问公共架构的权限。感谢Daniel Vérité
为我指明了正确的方向


顺便说一句,使用
将角色用户设置搜索路径改为“$user”,public
设置搜索路径。虽然,$user是无用的,因为我没有任何以当前用户命名的模式

  • 为什么猜测?打开语句日志记录并了解
  • 如果您认为这是一个bug,请在PDO项目中提交一个bug报告,或者至少检查一下归档列表,看看是否有充分的理由
  • 尝试以下方法作为解决方法

    c=(?)::citext

  • 我猜你会运气不好,因为看起来所有数据库都共享了类型常量

    祝贺PDO团队做出了设计选择,使您的文件系统库只支持大写8.3,以保持与ms dos 6.22的兼容性


    明确的解除分配表明先前发布了一个PREPARE。这将获取一个类型化参数列表,因此可能正在那里设置文本类型


    请原谅延迟回复。。我在postgresql世界大约15天了,感谢您指示语句级日志记录。请在打开日志记录后检查有问题的更新。现在正在尝试合并解决方法。这是我尝试登录的用户的搜索路径问题。我猜我是在对其他模式执行会话方式的set search_path时创建了该用户,并将其设置为其他模式,而不是默认的“$user”,public。用户根本没有访问公共架构的权限。感谢Daniel Vérité为我指明了正确的方向。顺便说一句,使用
    将角色用户设置搜索路径改为“$user”,public
    设置搜索路径。虽然,$user是无用的,因为我没有任何以当前用户命名的模式。(前面的注释已删除)。一个想法:因为您使用的是非公共模式,所以请确保“citext”类型在您使用的模式中可见。请明确说明执行此查询的搜索路径。最糟糕的情况是,尝试在类型名称前加上其模式前缀(public?)
    try {
        $db = new PDO('pgsql:dbname=database1;user=user;password=pass;host=localhost');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT column1 from schema1.column1 where column1 = 'value'::citext ";
        $retval=$db->query($sql);
        foreach ($retval as $row) {
            print $row['uname'] . '<br>';
        }
    }catch (PDOException $PDOerr) {
        echo 'An error occured : <br>';
        var_dump($PDOerr);
        exit;
        //some thing went wrong while performing the action on db.
        }
    
    object(PDOException)#10 (8) { ["message":protected]=> string(211) "SQLSTATE[42704]: \
    Undefined object: 7 ERROR: type "citext" does not exist LINE 1: ...