[英]Why does my query with named parameters return a blank result?
我將我的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注入,我想使用命名參數以及准備語句,但是如果我無法弄清楚,那么我將不得不不使用命名參數。
通過數組使用參數時,將綁定默認參數類型PDO::PARAM_STR
取決於數據類型:
我建議您像這樣更改代碼:
$foo_query=$DBH->prepare(
"SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body
FROM BarTable WHERE postdate = :postdate
ORDER BY postdate DESC");
$foo_query->bindParam (
":postdate", strtotime ( $_REQUEST['postdate']), PDO::PARAM_INT);
// ^^^ bind as integer
$foo_query->execute();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.