OpenCart订单邮件添加供应商字段失败:数据未存入数据库
oc_order_product表的问题 我来帮你梳理下代码里的问题,以及需要调整的地方:
首先,先看你在catalog/model/checkout/order.php里的代码,有几个明显的错误会导致数据无法正确存入:
1. 拼写错误
你写的$product['cupplier_comments']是拼写错误,应该是$product['supplier_comments'](多了一个字母u),这个错误会导致该字段取到空值,甚至触发报错。
2. 错误的数据类型转换
- 你把
supplier_id用(int)强制转换,但之前在cart.php里你是从$product['supplier']解码得到的,如果supplier是字符串类型(比如供应商名称),转成int会直接变成0,完全不符合预期;就算是供应商ID,也应该确认这个值本身是数字类型再转,而且存入数据库时如果字段是字符串类型,应该用$this->db->escape()处理。 - 同样,
Suppliercomments字段你也用了(int)转换,这会把文本内容直接转成0,肯定无法正确存储供应商备注。
3. 数据库字段名匹配问题
你的INSERT语句里用了Suppliername和Suppliercomments作为字段名,要确保oc_order_product表中确实存在这两个字段,并且大小写和数据库里的一致(MySQL默认不区分大小写,但最好保持统一,比如用小写加下划线的命名规范:supplier_name、supplier_comments)。如果表中还没有这两个字段,需要先执行SQL添加:
ALTER TABLE `oc_order_product` ADD `supplier_name` VARCHAR(255) NOT NULL AFTER `name`; ALTER TABLE `oc_order_product` ADD `supplier_comments` TEXT NOT NULL AFTER `supplier_name`;
修复后的order.php代码示例
if (isset($data['products'])) { foreach ($data['products'] as $product) { $this->db->query("INSERT INTO " . DB_PREFIX . "order_product SET order_id = '" . (int)$order_id . "', product_id = '" . (int)$product['product_id'] . "', name = '" . $this->db->escape($product['name']) . "', supplier_name = '" . $this->db->escape($product['supplier_id']) . "', supplier_comments = '" . $this->db->escape($product['supplier_comments']) . "', model = '" . $this->db->escape($product['model']) . "', quantity = '" . (int)$product['quantity'] . "', price = '" . (float)$product['price'] . "', total = '" . (float)$product['total'] . "', tax = '" . (float)$product['tax'] . "', reward = '" . (int)$product['reward'] . "'"); } }
额外检查点
确认
cart.php中的数据是否存在:在cart.php里添加临时调试代码,确认$product['supplier']和$product['suppliercomments']是否真的有值:// 在$data['products'][] = array(...); 之前添加 var_dump($product['supplier'], $product['suppliercomments']); exit;如果输出是空值,说明你在获取购物车产品数据时没有从数据库中取出供应商相关字段,需要修改查询逻辑,比如在获取购物车产品的SQL中JOIN供应商表,把这两个字段查出来。
查看Opencart错误日志:开启错误日志(在
system/config/default.php中设置error_reporting(E_ALL);),然后查看system/logs/error.log,里面会记录数据库查询的具体错误,比如字段不存在、语法错误等,这是定位问题最快的方式。
内容的提问来源于stack exchange,提问作者user2161434

