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