我正在为Prestashop中的SQL Manager编写一些查询 我想按月分组:
SELECT AVG(total_products)
FROM ps_order_invoice
GROUP BY YEAR(delivery_date), MONTH(delivery_date)
但是SQL Manager拒绝保存它,只显示消息“Error”。
除了只接受SELECT
个查询外,我找不到有关SQL Manager限制的更多信息
但是,如果我删除YEAR
和MONTH
函数,我可以保存查询。
注意:不幸的是,我无法访问phpmyadmin
答案 0 :(得分:2)
我安装了一个新的prestashop-1.6.0.6并且能够得到你的错误。 检查代码后,我发现问题来自RequestSql类。
cutAttribute方法无法解析“YEAR(delivery_date)”之类的属性。它返回一个字符串,如“YEARdelivery_date”而不是“delivery_date”。
要解决此问题,您可以覆盖此类并使用上一个prestashop版本中的cutAttribute方法。
使用以下内容创建位于“override / classes”中的名为“RequestSql.php”的文件:
class RequestSql extends RequestSqlCore
{
/**
* Cut an attribute with or without the alias
*
* @param $attr
* @param $from
* @return array|bool
*/
public function cutAttribute($attr, $from)
{
$matches = array();
if (preg_match('/((`(\()?([a-z0-9_])+`(\))?)|((\()?([a-z0-9_])+(\))?))\.((`(\()?([a-z0-9_])+`(\))?)|((\()?([a-z0-9_])+(\))?))$/i', $attr, $matches, PREG_OFFSET_CAPTURE)) {
$tab = explode('.', str_replace(array('`', '(', ')'), '', $matches[0][0]));
if ($table = $this->returnNameTable($tab[0], $from)) {
return array(
'table' => $table,
'alias' => $tab[0],
'attribut' => $tab[1],
'string' => $attr
);
}
} elseif (preg_match('/((`(\()?([a-z0-9_])+`(\))?)|((\()?([a-z0-9_])+(\))?))$/i', $attr, $matches, PREG_OFFSET_CAPTURE)) {
$attribut = str_replace(array('`', '(', ')'), '', $matches[0][0]);
if ($table = $this->returnNameTable(false, $from, $attr)) {
return array(
'table' => $table,
'attribut' => $attribut,
'string' => $attr
);
}
}
return false;
}
}
删除文件“cache / class_index.php”,否则将无法找到覆盖。