如何正确引用PDO :: Execute中的inet值?

时间:2014-02-03 16:17:16

标签: php postgresql pdo

以下作品:

$db=$this->database;


$query="SELECT blacklisted FROM userip_blacklist "
    . "WHERE ip_addr <<= inet "
    . $db->quote($IP);

$result=$db->query($query);

这不是:

$query='SELECT code FROM userip_greylist WHERE user_id = ? '
    . 'AND ip_addr <<= inet ? '
    . 'AND expires > now()' ;
$queryvars=array($id,$ip);
    $sth=$db->prepare($query); // This still works
$result=$sth->execute($queryvars); // This generates the error.

我在日志中看到了这个:

ERROR:  syntax error at or near "$2"
LINE 1: ...dr FROM trusted_ips WHERE user_id=$1 AND ip_addr <<= INET $2

我知道我可能错过了一些明显的东西,但又是什么?

1 个答案:

答案 0 :(得分:3)

此语法的类型名称后跟一个字符串值(例如inet '10.0.0.1'interval '10 days',在the manual中称为类型'字符串')不能在准备好的语句中细分,类型是查询的一部分,值是参数。这是这种特殊语法的限制。

通用解决方案是使用显式cast代替:

$query='SELECT code FROM userip_greylist WHERE user_id = ? '
    . 'AND ip_addr <<=  ?::inet '
    . 'AND expires > now()' ;

并将IP地址作为字符串文字参数传递。

如果您发现它更具可读性或更标准,也可以写成CAST(? AS inet)