【问题标题】:How to properly quote an inet value in PDO::Execute?如何正确引用 PDO::Execute 中的 inet 值?
【发布时间】:2014-02-03 16:17:16
【问题描述】:

以下作品:

$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

我知道我可能遗漏了一些明显的东西,但是什么?

【问题讨论】:

    标签: php postgresql pdo


    【解决方案1】:

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

    一般的解决方案是使用显式的cast

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

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

    如果您觉得它更易读或更标准,也可以写成CAST(? AS inet)

    【讨论】:

    • 啊,好吧。谢谢你澄清,我开始怀疑我是不是疯了。 :)
    • 更新:?::inet 无效,CAST(? AS inet) 有效。现在接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2020-07-19
    相关资源
    最近更新 更多