php - OpenCart - 添加新模块时 MySQL 错误

标签 php mysql opencart

OpenCart 1.5.6,默认主题。

我创建了一个名为“seller”的新模块,由“manufacturer”克隆。卖家模块在管理员端工作正常,意味着添加/编辑卖家的详细信息;与单个产品的链接工作正常。但是当我在前端调用它时,产品页面给了我一个错误。我不喜欢 MySQL 语法,可能会添加错误的语法。以下是文件名的更改:\catalog\model\catalog\product.php

旧语法:

$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, s.name AS seller, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");

新增(更改)为,基本上复制制造商代码并向卖家“添加+替换”:

$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, s.name AS seller, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "seller s ON (p.seller_id = s.seller_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");

添加了以下代码:

'seller_id'  => $query->row['seller_id'],
'seller'     => $query->row['seller'],

在此代码之后:

'manufacturer_id'  => $query->row['manufacturer_id'],
'manufacturer'     => $query->row['manufacturer'],

还添加了以下代码:

if (!empty($data['filter_seller_id'])) {
        $sql .= " AND p.seller_id = '" . (int)$data['filter_seller_id'] . "'";
    }

之后

if (!empty($data['filter_manufacturer_id'])) {
        $sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
    }

最后添加了以下代码:

if (!empty($data['filter_seller_id'])) {
        $sql .= " AND p.seller_id = '" . (int)$data['filter_seller_id'] . "'";
    }

之后:

if (!empty($data['filter_manufacturer_id'])) {
        $sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
    }

现在,当我尝试打开任何产品页面时遇到以下错误:

Notice: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '43' AND pd.language_id = '1' AND p.status = '1' AND p2s.store_id = '0'' at line 3
Error No: 1064
SELECT DISTINCT *, pd.name AS name, p.image, s.name AS seller, m.name AS manufacturer, m.image AS man_img, (SELECT price FROM product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '1') AS reward, (SELECT ss.name FROM stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '1') AS stock_status, (SELECT wcd.unit FROM weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '1') AS weight_class, (SELECT lcd.unit FROM length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '1') AS length_class, (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '43' AND pd.language_id = 'seller s ON (p.seller_id = s.seller_id) WHERE p.product_id = '43' AND pd.language_id = '1' AND p.status = '1' AND p2s.store_id = '0' in /x/x/x/x/system/database/mysql.php on line 50

任何帮助将不胜感激。

最佳答案

重新排列 sql 代码后,您遇到了串联问题,有两个 where 子句。提示始终缩进你的代码,这样会更容易发现这些错误。

这是错误的部分:

     ON (p.manufacturer_id = m.manufacturer_id) 
WHERE p.product_id = '43' 
  AND pd.language_id = 'seller s ON (p.seller_id = s.seller_id) 
WHERE p.product_id = '43' 
  AND pd.language_id = '1' 
  AND p.status = '1' 
  AND p2s.store_id = '0'

这是完整的 sql 格式。

SELECT DISTINCT *, pd.name AS name, 
p.image, s.name AS seller, 
m.name AS manufacturer, m.image AS man_img, 
(SELECT price 
   FROM product_discount pd2 
  WHERE pd2.product_id = p.product_id 
    AND pd2.customer_group_id = '1' 
    AND pd2.quantity = '1' 
    AND (     (pd2.date_start = '0000-00-00' OR pd2.date_start < NOW() ) 
          AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())
        ) 
  ORDER BY pd2.priority ASC, 
           pd2.price ASC LIMIT 1) AS discount, 
(SELECT price 
   FROM product_special ps 
  WHERE ps.product_id = p.product_id 
    AND ps.customer_group_id = '1' 
    AND (     (ps.date_start = '0000-00-00' OR ps.date_start < NOW()) 
          AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())
        ) 
   ORDER BY ps.priority ASC, 
            ps.price ASC LIMIT 1
) AS special, 
(SELECT points 
   FROM product_reward pr 
  WHERE pr.product_id = p.product_id 
    AND customer_group_id = '1') AS reward, 
(SELECT ss.name 
   FROM stock_status ss 
  WHERE ss.stock_status_id = p.stock_status_id 
    AND ss.language_id = '1') AS stock_status, 
(SELECT wcd.unit 
   FROM weight_class_description wcd 
  WHERE p.weight_class_id = wcd.weight_class_id 
    AND wcd.language_id = '1') AS weight_class, 
(SELECT lcd.unit 
   FROM length_class_description lcd 
  WHERE p.length_class_id = lcd.length_class_id 
    AND lcd.language_id = '1') AS length_class, 
(SELECT AVG(rating) AS total 
   FROM review r1 
  WHERE r1.product_id = p.product_id 
    AND r1.status = '1' 
  GROUP BY r1.product_id) AS rating, 
(SELECT COUNT(*) AS total 
   FROM review r2 
  WHERE r2.product_id = p.product_id 
    AND r2.status = '1' 
  GROUP BY r2.product_id) AS reviews, 
   p.sort_order 
FROM product p LEFT JOIN product_description pd 
     ON (p.product_id = pd.product_id) 
     LEFT JOIN product_to_store p2s 
     ON (p.product_id = p2s.product_id) 
     LEFT JOIN manufacturer m 
     ON (p.manufacturer_id = m.manufacturer_id) 
WHERE p.product_id = '43' 
  AND pd.language_id = 'seller s ON (p.seller_id = s.seller_id) 
WHERE p.product_id = '43' 
  AND pd.language_id = '1' 
  AND p.status = '1' 
  AND p2s.store_id = '0'

关于php - OpenCart - 添加新模块时 MySQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19944447/

相关文章:

opencart - 在结帐页面的新选项卡中打开 "Terms & Conditions"链接

OpenCart 3 订单状态作为缺失状态出现

php - 从价格数据集中移除异常值的算法

mysql - SQL:比较不同表中的两个计数

不使用 having 的 mysql 计数

php - sql语法中的奇怪错误

php - 获取最近两周的 SQL

PHP while 语句问题

php - 在 PHP 中,将配置参数加载到应用程序变量中的正确方法是什么?

php - 根据图像路径和名称更新列