2015-01-26 137 views
2

我試圖如下:PHP PDO聲明:引號中引號引起查詢失敗

$stmt = $db->prepare("SELECT * FROM table WHERE date 
         BETWEEN :year-:month-01 AND :year-:month-01 + 
         INTERVAL 1 MONTH"); 
$stmt->bindValue(':year', $year, PDO::PARAM_STR); 
$stmt->bindValue(':month', $_POST["month"], PDO::PARAM_STR); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

$year等於2015年和$_POST["month"]等於06,查詢應該給結果,但事實並非如此。我可以讓$year a PDO::PARAM_INT,但這仍然讓我,這是一個字符串(01 .. 12)。

然而,這種小的調整測試時,取出結合...

BETWEEN "2015-06-01" AND "2015-06-01" + 
INTERVAL 1 MONTH"); 

查詢成功,結果表明。我想這是因爲日期間,該服務器收到這個樣子:

'2015'-'06'-01 

所以,我的問題如下:

如何「逃離」或「刪除」備PDO內報價聲明? 應該有一個優雅的方法來解決這個問題。

+0

編輯,備案:我忘了引號添加到我的 '調整'。 2015-06-01的兩個實例都應該在引號中。我已經編輯了我的問題。 – Dave 2015-01-26 23:19:46

回答

1

我甚至不打擾試圖綁定參數的一部分。此外,您不能重新命名參數(在大多數情況下),見http://php.net/manual/pdo.prepare.php

在一份聲明中不能使用相同的名稱的命名參數標記超過一次,除非仿真模式上。

只需綁定

BETWEEN :start AND :end + INTERVAL 1 MONTH 

所需的全部價值,如與...

$date = sprintf('%04d-%02d-01', $year, $month); 
$stmt->bindParam(':start', $date); 
$stmt->bindParam(':end', $date); 
+0

TBH菲爾,我不完全確定我的答案。我刪除了它。 – 2015-01-26 23:04:30

+0

謝謝,這以比我想象的更爲優雅的方式解決了我的問題。 – Dave 2015-01-26 23:17:47