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

a64a0gku  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(386)

我正在尝试使用以下代码获取日期列的值为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();

第一种情况,我得到以下错误:
致命错误:未捕获异常“pdoexception”,消息为“sqlstate[hy093]:无效的参数号:第35行file.php中绑定变量的数量与令牌的数量不匹配
我假设我得到这个错误是因为我不能在单括号之间的查询中使用“?”。
第二种情况,我一无所获。
解决方法如下:

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

jtoj6r0c1#

查询1失败,因为您不能引用占位符。
查询2失败,因为单引号被驱动程序转义,然后整个转义的字符串被 Package 在引号中。粗略地

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();
bjp0bcyl

bjp0bcyl2#

第一种情况的错误是因为您将两个变量传递给了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/

相关问题