【问题标题】:PHP PDO usage with MySQL BETWEEN and INET_ATON()PHP PDO 在 MySQL BETWEEN 和 INET_ATON() 中的使用
【发布时间】:2013-01-11 15:58:20
【问题描述】:

不久前我开始了一个 PHP 端项目,最近开始清理所有代码并更新它。部分原因是开始使用 PDO 进行 DB 查询。在一个特定的查询中,我有一个WHERE 子句语句,它使用BETWEEN 子句和INET_ATON() 函数。到目前为止,我还不能让它正常工作,如果有人能指出它是否能正常工作,我将不胜感激。

我发现this 问题让我相信BETWEEN 语句没有任何问题,但我担心这可能是与导致问题的函数的组合。

这是我的查询部分的样子:

SELECT foo, bar FROM table JOIN more_table 
WHERE item1 = :value AND ip_address BETWEEN INET_ATON(:ipstart) AND INET_ATON(:ipend)

实际的查询比这要大得多,但对于基础来说,这是可行的。为了用实际值替换标记,我设置了以下 foreach 循环(var_dump 就在那里,所以我可以验证正确的值是否正在传入,它们是):

foreach($p as $k=>$v) {
    echo var_dump($k, $v);
    if(is_int($v)){
        $querySubmit->bindValue($k, $v, PDO::PARAM_INT);
    } else {
        $querySubmit->bindValue($k, $v, PDO::PARAM_STR);
    }
}

如果有人知道PDO::PreparePDO::bindValue 是否对设置为使用BETWEENINET_ATON() 的查询有任何限制,我将不胜感激!

【问题讨论】:

  • pdo 对 mysql 函数有绝对的NO知识。只要 mysql 解析器不拒绝查询字符串,PDO 就会很高兴地推入任何你想要的东西,无论你想要它。
  • 我不确定是什么导致这个失败。如果我对单个 IP 地址运行查询(即: AND ip_address = INET_ATON(:ip); ),我可以让它运行得非常好。只有当我将 BETWEEN 子句与函数一起使用时,它才不会返回任何结果。
  • 那么...错误信息是什么?
  • 您以 IP 形式发送什么?请记住,inet_ntoa/aton 只做 IPv4。
  • 离开键盘一段时间后,经过一天的调试,我终于解决了这个问题。这实际上是代码的不同部分的问题,而不是向 SQL 查询传递值的部分。感谢大家的回复! @MarcB 我正在通过 IPv4,还没有通过 IPv6,所以这将是下次解决问题的野兽。

标签: php mysql pdo


【解决方案1】:

bindValue() 的参数是 $k 它应该是 :value

foreach($p as $k=>$v) {
    echo var_dump($k, $v);
    if(is_int($v)){
        $querySubmit->bindValue(:value, $v, PDO::PARAM_INT);
    } else {
        $querySubmit->bindValue(:value, $v, PDO::PARAM_STR);
    }
}

你也绑定:ipstart:ipend吗?

【讨论】:

  • 感谢您提供答案,但是我解决了这个问题,它最终成为一个单独的代码部分,而不是将值传递给 SQL 查询并绑定它们。此外,存储为$k 的值相当于:value
【解决方案2】:

问题最终出在单独的代码部分。传递给 SQL 查询的值是正确的,bindValue 操作成功。

对于将来查看此问题并认为自己遇到类似问题的任何人,如果设置正确,将INET_ATON/NTOA() 函数与BETWEEN 一起使用应该没有问题。

我相信@MarcB 留下的第一条评论实际上可能是最好的答案,“PDO 完全不了解 MySQL 函数。只要 MySQL 解析器不拒绝查询字符串,PDO 就会很高兴随心所欲,随心所欲。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多