我正在将我的 MySQL 代码转换为 PDO 以利用准备好的语句。我最初遇到了这个问题中描述的致命错误。我已经解决了这个问题,但是在尝试添加参数时会带来更多问题。
我试图开始工作的代码是:
include ("foo/bar.php");
try {
$DBH = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
}
catch(PDOException $e) {
echo $e->getMessage();
}
$mydate=date("Y-m-d",strtotime("-3 months"));
$foo_query=$DBH->prepare("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = :postdate AND postdate > '$mydate' ORDER BY postdate DESC");
$foo_query->execute( array('postdate' => $_REQUEST['postdate']) );
$DBH=null;
在英语中,这意味着阅读“取当前日期并将其设置为 3 个月,称为 $mydate,然后从我的表中选择所有这些字段(也取正文的前 20 个单词并将其称为'preview_text')其中 postdate 等于参数 postdate 并且 postdate 大于 $mydate "。
然后我在下面显示结果(注意现在已经删节了):
$foo_query->setFetchMode(PDO::FETCH_ASSOC);
while($r=$foo_query->fetch()) {
echo $r["id"];
echo $r["title"];
echo date("d-M-Y",strtotime($r["postdate"]));
echo nl2br ($r["preview_text"]); }
现在,虽然 SELECT 查询写成:
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate > '$mydate' ORDER BY postdate DESC")
...它准确地显示了我需要的内容,但是当然,在准备好的时候,它不包含任何参数,因此只能实现 50% 的目标。
我的印象是,按照我已经获得的教程和建议,准备我最初概述的声明的方式会很好。
我试图打印我的错误,它没有带来任何错误。我手动发送查询如下,但没有得到任何回报。注意我已经尝试了各种排列方式的日期字符串:
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = 20121001 AND postdate > 20120701 ORDER BY postdate DESC")
编辑:以上内容被指出不正确,但我将其保留在这里以供参考,因为本节在下面的评论中进行了解释。
编辑:手动发送查询现在在键入时正确显示:
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = '2012-09-30 08:38:23' ORDER BY postdate DESC")
键入以下任何内容时,查询根本不显示:
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = :postdate ORDER BY postdate DESC")
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = :postdate AND postdate > '$mydate' ORDER BY postdate DESC")
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = '2012-09-30 08:38:23' AND postdate > '2012-07-01 00:01' ORDER BY postdate DESC")
我在想我应该以某种方式绑定参数,但我读过的教程并没有明确说我应该总是绑定它们——我不确定如何继续。
编辑:我希望将语句绑定如下,但没有成功。该查询似乎忽略了绑定,因此查询的状态充当上述所有没有绑定的排列:
$foo_query->bindParam (
":postdate", strtotime ( $_REQUEST['postdate']), PDO::PARAM_INT);
$foo_query->execute();
我做错了什么,当我不添加参数时不会发生这种情况?我应该在 SELECT 查询之外的其他地方声明 :postdate 参数吗?
为了防止 SQL 注入,我想使用命名参数以及准备语句,但如果我无法弄清楚,那么我将不得不不使用命名参数。