以下作品:
$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
我知道我可能错过了一些明显的东西,但又是什么?
答案 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)
。