PHP PDO(带有libpq V 9.1.4)绑定以使用CITEXT的变通方法?
情景 两个系统(不是服务器)运行PHP和PostgreSQL,版本如下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扩展时
- 软呢帽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中的执行情况与预期不符(出现区分大小写的搜索)
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是无用的,因为我没有任何以当前用户命名的模式
明确的解除分配表明先前发布了一个PREPARE。这将获取一个类型化参数列表,因此可能正在那里设置文本类型
将角色用户设置搜索路径改为“$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: ...