2015-02-06 202 views
2

現在,那麼現在。在日期變量的兩個日期之間選擇行

我有一個SELECT語句在PHP中,我需要選擇表中的所有行「日期」列之間的開始日期和結束日期將由變量定義。

我有這方面的工作完全正常,當我在SELECT語句直接定義的日期,如下圖所示:

date BETWEEN "2015-02-03" AND "2015-02-05" 

然而,當我試圖做同樣的事情,但與變量,它似乎並不工作:

date BETWEEN "$startdate" AND "$enddate" 

$startdate = "2015-02-03"; 
$enddate = "2015-02-05"; 

希望這一切是有道理的,乾杯提前。

完整的代碼片段是這裏的要求:

$startdate = "2015-02-03"; 
$enddate = "2015-02-05"; 

$sql = 'SELECT record_number, date, manmod, description, cal, serial, datein, dateout, retdate, refex, refexdate, sellersname, sellersaddress, buyersname, buyersaddress, rfddealer, del, warranty, months FROM record WHERE del="Live" AND date BETWEEN "$startdate" AND "$enddate" ORDER BY record_number DESC'; 
+0

由於第一個查詢(無變量日期)工作正常,問題可能在於PHP構建查詢。你可以驗證正在執行的查詢是否正確? – 2015-02-06 12:29:09

+1

你可以顯示你的完整片段嗎? – Mureinik 2015-02-06 12:29:40

+0

剛剛添加完整的代碼片段,謝謝 – 2015-02-06 12:32:47

回答

1

PHP website

注:與double-quotedheredoc語法不同,variables和escape se在單引號string s中,特殊字符的熄滅不會擴大。

換句話說,由於您的查詢使用單引號,因此$startdate$enddate變量不會被解釋爲變量。 SQL查詢被髮送到數據庫將包含字面上和$startdate$enddate,因此會是這個樣子:

'SELECT column1, column2 FROM table WHERE date BETWEEN "$startdate" AND "$enddate" ORDER BY record_number DESC'; 

(我已經簡化了查詢了一下爲了提高可讀性)

顯然,數據庫不知道如何解釋PHP變量,它會查找這兩個字符串之間的日期的記錄,找不到任何內容,因此返回0個記錄。

爲了貼在您的SQL查詢的變量的內容,你必須做兩件事情之一:

選項1:用雙引號

如果你選擇了這個替換單引號選項,確保你要麼逃避現有的雙引號,或者將它們轉換爲單引號:

$sql = "SELECT column1, column2 FROM table WHERE date BETWEEN '$startdate' AND '$enddate' ORDER BY record_number DESC"; 

選項2:手動在連接字符串

您也可以從多個部分手動構建查詢,並使用PHP的串聯運算符(點號(.))將它們粘合在一起。

$sql = 'SELECT column1, column2 FROM table WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate; 
+0

女士們,先生們,我們有一個贏家,拿弓先生。 – 2015-02-06 12:40:59

+0

樂於幫助。哦,如果'$ startdate'和'$ enddate'變量來自用戶輸入,請確保您知道SQL注入是什麼以及如何防止它。否則,您的應用程序/網站可能容易受到攻擊。 – 2015-02-06 13:04:52

0

你應該把它轉換爲一個大於和小於公式:

date > '$startdate' AND date < '$enddate' 
+0

嗨,我已經嘗試過這之前,它仍然無法正常工作,感謝您的輸入。 – 2015-02-06 12:29:00

0

問題不在於你的SQL,而在於你的PHP。

您需要詳細瞭解string concatenation的工作方式以及PHP如何處理使用'"時字符串纏繞的字符串。

$sql = 'SELECT * FROM record WHERE date BETWEEN "$startdate" AND "$enddate"'; 

應改爲下列之一:

$sql = 'SELECT * FROM record WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate . '"'; 

OR:

$sql = "SELECT * FROM record WHERE date BETWEEN '$startdate' AND '$enddate'"; 

我已經簡化了SQL凸顯真正的問題在眼前。

相關問題