【问题标题】:BETWEEN clause breaking with PDO and MySQLBETWEEN 子句与 PDO 和 MySQL 中断
【发布时间】:2016-02-28 22:55:59
【问题描述】:

我将它从 mysql 迁移到 PDO。

当我通过将 2 和 19 放入 WHERE 子句中代替 :id3 和 :id4 来测试此查询时,它工作得很好。但是当我使用 :ids '正确' 执行它时,它会中断并且我无法发现我的错误。

更奇怪的是,当值的范围(即 2-19)超过 10 时,它会中断。

当我将它限制在 2 到 6 之间时,它几乎可以工作,但是,它还包括 21。我无法在这个问题上摸不着头脑。

请您重新审视一下这个问题并告诉我哪里可能出错了?

<input name="Between1" id="Between1" type="text" size="5" maxlength="2"  
onKeyPress="if ( isNaN(this.value + String.fromCharCode(event.keyCode) )) 
return false;"  class="tac" />

<input name="Between2" id="Between2" type="text" size="5" maxlength="2" 
onKeyPress="if ( isNaN(this.value + String.fromCharCode(event.keyCode) )) 
return false;"  class="tac" />


$stmtAuthorBetween = $con->prepare("SELECT Author, AuthorLN, AuthorNotes 
FROM Authors USE INDEX (XLess) WHERE bookX=:id AND Level=:id2 AND 
(book_NumberX BETWEEN :id3 AND :id4) LIMIT 50"); 
$stmtAuthorBetween->bindParam(':id', $_POST['bookX'], PDO::PARAM_STR);
$stmtAuthorBetween->bindParam(':id2', $_POST['Level'], PDO::PARAM_STR); 
$stmtAuthorBetween->bindParam(':id3', $_POST['Between1'],PDO::PARAM_STR);
$stmtAuthorBetween->bindParam(':id4', $_POST['Between2'],PDO::PARAM_STR);
try {$stmtAuthorBetween->execute();} catch(PDOException $e){ echo 
errorHandle($e);}
$numRowsAuthorBetween = $stmtAuthorBetween->rowCount();

POST 数组没问题。

我已经以各种可以想象的方式重新排列了括号。

我将 bindParam 更改为 bindValue。

我用 _INT 移除/替换了 PDO::PARAM_STR。

我将 $_POST['Between1'] 和 2 换成 $one = $_POST['Between1'],然后将 $one 卡在绑定语句中。

我删除了 LIMIT 和 INDEX。

我试过 book_NumberX >= :id3 AND book_NumberX

我把所有无关的东西都从原始形式中提取出来了,nada。

我将表单更改为 GET 方法,参数完美地出现在查询字符串中,2 和 6,所以表单也不是问题。

但是在POST方法中,当21不应该出现时,它仍然显示包括2、21、4、5、6的记录。

为什么这个查询只需要 2 和 6 之间的记录时包含 21? 如果我将其更改为 1 和 6,它包括记录 15、16 等。

【问题讨论】:

  • 当您尝试执行查询时是否显示任何错误或异常?
  • 您能否显示您用于提交的表单的html。我认为问题可能出在那儿
  • 嗯,你的号码应该是PDO::PARAM_INT 而不是PDO::PARAM_STR? (啊,不是这个 - 有一个已删除的答案说同样的话。我会留下评论,因为它可能对看不到已删除答案的用户有所帮助)。
  • @halfer - 感谢您的建议。我会在早上看看他们。您的建议需要我做一些研究,以了解如何贯彻执行。
  • 我也很高兴你把它修好了。但是,我们不鼓励批量替换原始问题 - 请添加自我回答,并在系统允许时勾选(接受)。

标签: mysql pdo prepared-statement between


【解决方案1】:

最终答案很简单。数据表已有多年历史,并且查询在表字段设置为 varchar 时运行良好。但是当记录集升级到 PDO 时,我应该将表字段从 varchar 更改为 INT。马上就解决了。

希望这可以帮助遇到类似问题的其他人节省一些时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2011-02-17
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多