我在php中有一个SELECT语句,我需要选择表中"日期"列位于开始日期和结束日期之间的所有行,这些行将由变量定义。
当我直接在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';
来自PHP网站:
注意:与双引号和heredoc语法不同,特殊字符的变量和转义序列出现在单引号字符串中时不会展开。
换句话说,由于查询使用单引号,因此$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:手动连接字符串
您还可以从多个部分手动构建op查询,并使用PHP的串联运算符dot(.
)将它们粘合在一起。
$sql = 'SELECT column1, column2 FROM table WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate;
您应该将其转换为大于和小于等式:
date > '$startdate' AND date < '$enddate'
问题不在于SQL,而在于PHP。
您需要了解字符串串联是如何工作的,以及PHP在将使用'
和"
的字符串封装在字符串周围时如何以不同的方式处理这些字符串。
$sql = 'SELECT * FROM record WHERE date BETWEEN "$startdate" AND "$enddate"';
应更改为以下内容之一:
$sql = 'SELECT * FROM record WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate . '"';
或:
$sql = "SELECT * FROM record WHERE date BETWEEN '$startdate' AND '$enddate'";
我简化了SQL,以突出当前的实际问题