Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正在尝试将日期范围添加到查询_Php_Mysql_Opencart - Fatal编程技术网

Php 正在尝试将日期范围添加到查询

Php 正在尝试将日期范围添加到查询,php,mysql,opencart,Php,Mysql,Opencart,我在OpenCart中工作,正在尝试更改此查询。我需要更改它,以便它返回去年(1年后)的记录。这是我的查询 $query = $this->db->query("SELECT count(*) AS total, channel FROM `" . DB_PREFIX . "order` WHERE customer_id = '" . (int)$customer_id . "' && order_status_id IN(" . implode(",", $imp

我在OpenCart中工作,正在尝试更改此查询。我需要更改它,以便它返回去年(1年后)的记录。这是我的查询

$query = $this->db->query("SELECT count(*) AS total, channel FROM `" . DB_PREFIX . "order` WHERE customer_id = '" . (int)$customer_id . "' && order_status_id IN(" . implode(",", $implode) . ") AND YEAR(date_added) = YEAR(CURDATE()) GROUP BY channel");
我尝试将其更改为此,但无效:

$query = $this->db->query("SELECT count(*) AS total, channel FROM `" . DB_PREFIX . "order` WHERE customer_id = '" . (int)$customer_id . "' && order_status_id IN(" . implode(",", $implode) . ") AND date_added BETWEEN CURDATE() - INTERVAL 1 year AND CURDATE()) GROUP BY channel");

之前,考虑对输入数据进行消毒以保护您的查询不受SQL注入的影响。您可以找到有关此主题的一些内容

基于,我们可以将您的PHP代码改编为以下内容:

$query = $this->db->query("SELECT count(*) AS total, channel 
               FROM `" . DB_PREFIX . "order` 
               WHERE customer_id = '" . (int)$customer_id . "' 
                 AND order_status_id IN(" . implode(",", $implode) . ")
                 AND date_added >= DATE_SUB(NOW(),INTERVAL 1 YEAR)
               GROUP BY channel");

在计算去年的数据时,您使用了错误的语法

你可以用


“没用。”请更清楚一点。你得到了什么错误?没有错误,只是没有改变结果如果结果在添加额外的过滤器后没有改变,那么所有的记录都满足额外的标准。@在sql代码中,db前缀和表名之间没有点。另外,尽管冗长,但在CONCAT(年份)之间添加了类似于
date\u的内容(CURDATE())、'-01-01')和CONCAT(YEAR(CURDATE())、'-12-31')
可以使用索引,因此有可能更高效。不,问题中的语法是正确的。它是date_sub()的另一种语法,请参阅date_add()上的mysql文档Mysql确实理解&&运算符。真的吗?我不知道!感谢您提供的信息,我正在编辑答案!加上使用now()而不是curdate()可能会产生严重的副作用,具体取决于要求。此外,如果您认为当前问题已经在此处得到了回答,那么您不应该回答,而应该将问题标记为重复。好的,您可能还不能这样做,因为您的代表。是的,我无法将其标记为重复,这就是我将原始答案链接到答:谢谢你的评论,我试着在一个问题上提供帮助,我学到了比OP-hehe更多的东西
$query = $this->db->query("SELECT count(*) AS total, channel FROM `" . DB_PREFIX . "order` WHERE customer_id = '" . (int)$customer_id . "' && order_status_id IN(" . implode(",", $implode) . ") AND date_added BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AND CURDATE()) GROUP BY channel");