我不久前开始了一个PHP项目,最近开始清理所有的代码并更新它。其中一部分是开始使用PDO进行DB查询。在一个特定的查询中,我有一个WHERE
子句语句,它使用BETWEEN
子句和INET_ATON()
函数。到目前为止,我还没能让这个正常工作,如果有人能指出它是否会工作,我将不胜感激。
我发现这个问题使我相信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()
的查询设置有任何限制,我将非常感谢知道!
你的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查询的值是正确的,并且bindValue
操作工作成功。
对于那些在将来回顾这个问题的人,如果他们认为他们有类似的问题,如果设置正确,使用INET_ATON/NTOA()
函数和BETWEEN
应该没有问题。
我相信@MarcB留下的第一条评论可能是对这个问题最好的回答,"PDO绝对没有MySQL函数的知识。"只要MySQL解析器不拒绝查询字符串,PDO就会很高兴地把你想要的东西塞进你想要的任何地方。"