我正在尝试使用以下代码获取日期列值为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)=?
答案 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/