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

时间:2015-02-06 12:24:59

标签: php sql date select rows

我在php中有一个SELECT语句,我需要选择表中" date"的所有行。列位于将由变量定义的开始日期和结束日期之间。

当我直接在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';

3 个答案:

答案 0 :(得分:1)

来自PHP website

  

注意:与double-quotedheredoc语法不同,variables和特殊字符的转义序列在单引号string中出现时不会展开。

换句话说,由于您的查询是单引号,$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;

答案 1 :(得分:0)

您应该将其转换为大于和小于等式:

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

答案 2 :(得分: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以突出显示当前的真正问题。