Between子句返回0条记录

时间:2016-08-03 12:50:33

标签: php mysql

我在符合条件的数据库中有3条记录但是当我使用between子句运行查询时,它获得了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

2 个答案:

答案 0 :(得分:3)

您应该将'用于$ current_date AND $ coming_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 :(得分: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之前出现了。但是在年底,事情就崩溃了。