簡體   English   中英

為什么帶有命名參數的查詢返回空白結果?

[英]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

取決於數據類型:

  • MySQL時間戳數據類型:相同,您將其作為字符串傳遞
  • PHP Unix時間戳,它是一個整數:您將為它傳遞一個int值。

我建議您像這樣更改代碼:

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM