在日期变量的两个日期之间选择行

问题描述:

现在,那么现在。在日期变量的两个日期之间选择行

我有一个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

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

你应该把它转换为一个大于和小于公式:

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

嗨,我已经尝试过这之前,它仍然无法正常工作,感谢您的输入。 – 2015-02-06 12:29:00

问题不在于你的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凸显真正的问题在眼前。