使用PHP通过变量选择日期之间的行

时间:2018-07-12 23:40:40

标签: php mysql pdo

我正在尝试使用以下代码获取日期列值为7月中一天的所有行:

$july="07";
$query=$conn->prepare("SELECT * FROM table WHERE date BETWEEN '2018-?-01' AND '2018-?-31'");
$query->execute($july,$july);
$row=$query->setFetchMode();

我也尝试过这样:

$july="07";
$month_1="'2018-".$july."-01'";
$month_2="'2018-".$july."-31'";

$query=$conn->prepare("SELECT * FROM table WHERE date BETWEEN ? AND ?");
$query->execute(array($month_1,$month_2));
$row=$query->setFetchMode();

第一种情况,出现以下错误:

严重错误:消息'SQLSTATE [HY093]:未捕获的异常'PDOException':无效的参数号:绑定变量数与令牌数不符,位于第35行的file.php中

我认为我得到了这个错误,因为我不能有'?'在单括号之间的查询中。

第二种情况,我什么也没得到。

解决了这个问题:

SELECT * FROM table WHERE YEAR(date)=2018 AND MONTH(date)=?

2 个答案:

答案 0 :(得分:2)

查询1失败,因为您无法引用占位符。

查询2失败,因为驱动程序将单引号转义,然后将整个转义的字符串包裹在引号中。大概

date BETWEEN '\'2018-07-01\''

有几种方法可以完成此操作。

获取日期列的前7个值,并将其与您的字符串进行比较。

$date = '2018-07';
...then execute the query like ...
WHERE substr(date, 1, 7) = ?

您还可以使用concat方法,以防止引用占位符。

$july="07";
$query=$conn->prepare("SELECT * FROM table WHERE date BETWEEN concat('2018-', ?, '-01') AND concat('2018-', ?, '-31')");
$query->execute(array($july, $july));
$row=$query->setFetchMode();

答案 1 :(得分:-2)

第一种情况错误是因为您将两个变量传递给PDO :: execute()及其那里的期望数组。

建议阅读...

http://php.net/manual/en/pdostatement.execute.php

第二种情况..嗯..你确定它什么都不做?

Select * from mytable where date <= '2018-07-31' and date >= '2018-07-01'  

或其他...也许...

select * from mytable where date between UNIX_TIMESTAMP(STR_TO_DATE('Jul 01 2018 12:00AM', '%M %d %Y %h:%i%p')) and UNIX_TIMESTAMP(STR_TO_DATE('Jul 31 2018 11:59PM', '%M %d %Y %h:%i%p'))

从不使用*返回表中的所有列,这是很懒的。您只应提取所需的数据。即使您需要每个字段,表也将不可避免地发生变化。 -https://www.sitepoint.com/mysql-mistakes-php-developers/