SQL Submittion

时间:2017-01-31 15:17:13

标签: php mysql sql syntax prestashop

我正在与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);

任何帮助都会非常感激,因为这会为我们节省很多时间。

谢谢!

3 个答案:

答案 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'].'"
    )';
  • 未经测试 - 您可能仍需要摆弄引号......