Reputation: 1
OpenCart 1.5.6, Default theme.
I've created a new module named 'seller' cloned by 'manufacturer'. Seller module is working okay at Admin side, means adding/editing Seller's details; and linking with individual product is working fine. But when I call it at front-end, product page is giving me an error. I'm not okay with MySQL syntax and may be added wrong syntax. Here are the changes done in file name: \catalog\model\catalog\product.php
Old syntax:
$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') . "'");
and new (changed) to, basically copied manufacturer code and 'added+replaced' to seller:
$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') . "'");
Added following code:
'seller_id' => $query->row['seller_id'],
'seller' => $query->row['seller'],
after this code:
'manufacturer_id' => $query->row['manufacturer_id'],
'manufacturer' => $query->row['manufacturer'],
also added following code:
if (!empty($data['filter_seller_id'])) {
$sql .= " AND p.seller_id = '" . (int)$data['filter_seller_id'] . "'";
}
after
if (!empty($data['filter_manufacturer_id'])) {
$sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
}
and at last added following code:
if (!empty($data['filter_seller_id'])) {
$sql .= " AND p.seller_id = '" . (int)$data['filter_seller_id'] . "'";
}
after:
if (!empty($data['filter_manufacturer_id'])) {
$sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
}
Now, I'm getting following error while I try to open any product page:
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
Any help will be appreciated.
Upvotes: 0
Views: 812
Reputation: 23361
You have a concatenation problem after rearange your sql code there is a peace that have two where clauses. Hint ALWAYS indent your code it will be a lot easier to find theese mistakes.
this is the part that is wrong:
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'
This is entire sql formatted.
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'
Upvotes: 1