2016-08-03 90 views
0

我有3條記錄匹配條件的數據庫中,但是當我運行查詢與條款之間它獲得0條記錄。之間的條款是返回0條記錄

$current_date = date('m-d-Y', strtotime('monday this week')); 
$upcoming_date = date('m-d-Y', strtotime('monday next week')); 
$sql = mysqli_query($connection, "SELECT * FROM result WHERE test_date BETWEEN $current_date AND $upcoming_date AND login = '".$_SESSION['uid'] ."'"); 
$total_check = mysqli_num_rows($sql); 

這裏是我的數據庫

result_id`, `login`, `test_id`, `test_date`, 
(1,   '2',  6,  '08-03-2016', 
(2,   '2',  5,  '08-03-2016', 
(3,   '2',  3,  '08-03-2016', 

請讓我知道和我在做什麼錯了,因爲我得到0的結果和$ _SESSION [ 'UID']爲2

+1

我想你是缺少在日期報價!更好地使用準備聲明! – Saty

+1

在mysql控制檯中複製粘貼生成的查詢並查看它爲您提供了什麼。 – e4c5

+0

執行SQL-statemens後檢查錯誤。 (提示:mysqli_error()) – Jens

回答

1

您不正確存儲日期,如果你想使用它們在範圍搜索像BETWEEN。您必須將它們存儲在DATE列中。將它們存儲在VARCHAR()列中是一個壞主意。

你可以使用類似的東西,使用STR_TO_DATE()來解決你錯誤設計的表格。

$current_date = date('Y-m-d', strtotime('monday this week')); 
$upcoming_date = date('Y-m-d', strtotime('monday next week')); 
$sql = mysqli_query($connection, "SELECT * FROM result WHERE STR_TO_DATE(test_date,'%d-%m-%Y') BETWEEN '$current_date' AND '$upcoming_date' AND login = '".$_SESSION['uid'] ."'"); 

要問的MySQL比較字符串01-01-201612-31-2015,並確定後者到來之前,前者是不合理的。字符串比較是詞法。但是,2015-12-31顯然在2016-01-01之前。

這是一個有點棘手得到正確的,因爲文字字符串08-08-2016確實出現在08-15-2016之前,意外。但在年底,事情崩潰了。

+0

謝謝你提供有見識的答案 –

3

你應使用'爲$ CURRENT_DATE和$ upcoming_date

"SELECT * FROM result WHERE test_date BETWEEN '$current_date' AND '$upcoming_date' AND login = '".$_SESSION['uid'] ."'"

使用準備語句像下面以避免SQL Injection

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); 
$stmt->bind_param('s', $name); 

$stmt->execute(); 

$result = $stmt->get_result(); 
while ($row = $result->fetch_assoc()) { 
    // do something with $row 
} 
+1

確切地說,否則查詢變成「BETWEEN 2016-01-01 AND 2016-01-10」,MySQL不會在字符串處理它們 - 它可能將它們視爲整數來減去。 – SolarBear

+0

@泰米爾我很愚蠢爲什麼我忘記了單引號你的想法爲我工作,我也改變它準備的聲明感謝人 –

+1

這工作,直到你有一個星期跨越一個月的結束。然後它破裂。 –