我正在与Prestashop合作,并且我有一个模块可以为我的订单生成送货标签。制作标签时,会生成可在运营商网站上使用的跟踪代码。但问题是我们的托运人必须将此代码复制并粘贴到prestashop中,以便客户接收跟踪电子邮件。我的目标是自动化此过程,以最大限度地减少系统中的人为错误。
我在prestashop数据库中找到了包含跟踪代码(ps_order_carrier,tracking_number)的表格和列,我已经确认在数据库中更改此值会影响我的预期方式。在prestashop模块中有一段代码提交了跟踪号和各种订单信息,例如我可能需要它的订单ID,所以我假设我可以复制这部分代码并修改它以满足我的需求。以下是模块中的代码:
$sql = 'INSERT INTO '._DB_PREFIX_.$this->name.'_labels
(
id_order,
id_shipment,
postage_label_ref_id,
postage_label_object,
postage_label_updated_at,
postage_label_label_url,
tracking_code,
selected_rate_ref_id,
selected_rate_object,
selected_rate_updated_at,
selected_rate_service,
selected_rate_carrier,
selected_rate_shipment_ref_id,
tracker_ref_id,
tracker_object
)
VALUES
(
"'.(int)$data['id_order'].'",
"'.pSQL($data['id_shipment']).'",
"'.pSQL($data['postage_label']['ref_id']).'",
"'.pSQL($data['postage_label']['object']).'",
"'.pSQL($data['postage_label']['updated_at']).'",
"'.pSQL($data['postage_label']['label_url']).'",
"'.pSQL($data['tracking_code']).'",
"'.pSQL($data['selected_rate']['ref_id']).'",
"'.pSQL($data['selected_rate']['object']).'",
"'.pSQL($data['selected_rate']['updated_at']).'",
"'.pSQL($data['selected_rate']['service']).'",
"'.pSQL($data['selected_rate']['carrier']).'",
"'.pSQL($data['selected_rate']['shipment_ref_id']).'",
"'.pSQL($data['tracker']['ref_id']).'",
"'.pSQL($data['tracker']['object']).'"
)';
Db::getInstance()->Execute($sql);
我直接在下面制作了这个副本,并对其进行了修改以满足我的需求,但它似乎没有做我想要的。我有一种感觉,我搞砸了语法。我尝试了一些不同的变体,所以它有点乱,但这就是我写这篇文章的时候:
$sql2 = 'INSERT INTO `ps_order_carrier` WHERE `id_order` = '.(int)$data['id_order'].'
(
tracking_number
)
VALUES
(
"'.pSQL($data['tracking_code']).'"
)';
Db::getInstance()->Execute($sql2);
任何帮助都会非常感激,因为这会为我们节省很多时间。
谢谢!
答案 0 :(得分:1)
为了避免MySQL查询语法中的所有错误,Prestashop有一些可以使用的类和函数:
Db::getInstance()->insert($this->name.'_labels',
array(
'id_order' => (int)$data['id_order'],
'id_shipment' => pSQL($data['id_shipment']),
/*and so on*/
)
);
请记住将所有ID值强制转换为int
,并在所有字符串值中使用pSQL
。
如果您需要,还有一个update
功能。
答案 1 :(得分:1)
您正在尝试使用“INSERT”查询更新行。
$sql2 = 'UPDATE `ps_order_carrier` SET tracking_number = "'.pSQL($data['tracking_code']).'" WHERE `id_order` = '.(int)$data['id_order'].'
Db::getInstance()->Execute($sql2);
但最好的方法是首先加载orderCarrier对象并更改其跟踪值,而不直接查询DB。
$order = new Order($data['id_order']);
$orderCarrier = new OrderCarrier($order->getIdOrderCarrier());
$orderCarrier->tracking_number = $data['tracking_code'];
$orderCarrier->save();
答案 2 :(得分:0)
insert语句中没有where子句。
指定所有值 - 并获得新记录。
$sql2 = 'INSERT INTO ps_order_carrier
(
tracking_number
, id_order
)
VALUES
(
"'.pSQL($data['tracking_code']).'"
, "'.(int)$data['id_order'].'"
)';