2017-07-19 63 views
0

我最近已經學會了準備語句的重要性,因此我正在着手將所有現有的mysqli查詢改爲PDO查詢。使用PDO準備好的語句和特定年份的佔位符,我無法迴應任何結果

我有一個表稱爲「民」與字段:namedob(DATETIME),其中有這樣的數據:

name: Johnny 
dob: 2016-12-06 18:30:00 

我在一個PHP變量提供一年第一,例如:

$theyear=2016; 

然後,使用這個例子,我試圖在2016年爲所有帶dob的人拉出所有名字並回顯它們,如下所示,但它沒有顯示任何結果(並且有很多):

$stmt = $pdo->prepare("SELECT * FROM people WHERE `dob` BETWEEN ':theyear-01-01' AND ':theyear-12-31'"); 
$stmt->execute(['theyear' => $theyear]); 
while ($row = $stmt->fetch()) { 
    echo $row['name'] . "<br/>"; 
} 

作爲PDO的新手,我確信我做了一些愚蠢/不合邏輯的事情。

任何人都可以看到我的錯誤/幫助我在正確的方向?

+0

https://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double-quotes-and-backticks-in-mysql從技術上來說 –

+1

和你的查詢沒有任何意義雖然。如果未設置仿真,則需要使用不同的名稱 –

+1

需要在查詢前設置變量的值*,然後在*之後將查詢*中的值傳遞給它,簡而言之。實際上有很多方法可以做到這一點。 –

回答

4

如果你要來連接,這樣做在陣列中,而不是查詢,並使用每個變量單獨佔位符:

$stmt = $pdo->prepare("SELECT * FROM people WHERE `dob` BETWEEN :theyearbegin AND :theyearend"); 
$stmt->execute([':theyearbegin' => $theyear.'-01-01', ':theyearend' => $theyear.'-12-31']); 

注意,我已刪除從查詢中的佔位符引號。您在準備好的查詢的佔位符中進行的任何級聯應該在查詢本身之外完成,包括使用LIKE的查詢。

+0

提到的CONCAT方式@ MVG1984工作,但它聽起來像我不應該在查詢本身做到這一點,所以我想要你的工作方式,但不是因爲某種原因。沒有錯誤,只是回聲沒有。也許我有一個錯字或什麼的,但我直接從這裏複製它,所以有點困惑。我不停地玩弄,謝謝! – user3304303

+0

您是否檢查過服務器的錯誤日誌? –

+0

找到了。你的「12-31」之前缺少連字符。添加它,現在它可以工作,再次感謝您的知識! – user3304303

2

試圖改變

':theyear-01-01' 

CONCAT(:theyear, '-01-01') 

如果仿真未設置,則需要兩個不同的變量,:theyear1和:theyear2 F.E.

+4

做或不​​做,沒有「嘗試」。一個好的答案***將總是解釋所做的事情以及爲什麼這樣做,不僅是爲了OP,還是爲了將來訪問SO。 –

+0

這種方式的工作,但我將不得不閱讀有關仿真,以確定是否應該設置或不,謝謝 – user3304303

相關問題