【发布时间】: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