2017-01-31 200 views
1

我正在使用Prestashop,並且我有一個模塊可以爲我的訂單生成裝運標籤。製作標籤後,會生成可在運營商網站上使用的跟蹤代碼。但問題是,我們的託運人必須將此代碼複製並粘貼到prestashop中,以便客戶收到跟蹤電子郵件。我的目標是使這一過程自動化,以最大限度地減少系統內的人爲錯誤。SQL Submit的正確語法

我在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

你確定你不想在這裏做一個更新? INSERT沒有WHERE子句;只有'INSERT ... SELECT'和'INSERT ... ON DUPLICATE KEY UPDATE'。 –

+0

不清楚的問題開始吸引不好的答案;你已經得到(好)答案和我的評論,所以? –

+0

只有考慮SQL標籤並且不包括Prestashop的人才能得到不好的答案:)。 –

回答

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對象並更改其跟蹤值,而不直接查詢數據庫。

$order = new Order($data['id_order']); 
$orderCarrier = new OrderCarrier($order->getIdOrderCarrier()); 
$orderCarrier->tracking_number = $data['tracking_code']; 
$orderCarrier->save(); 
0

插入語句中沒有where子句。

指定所有值 - 並且您將獲得一條新記錄。

$sql2 = 'INSERT INTO ps_order_carrier 
    (
     tracking_number 
     , id_order 
    ) 
    VALUES 
    (
     "'.pSQL($data['tracking_code']).'" 
     , "'.(int)$data['id_order'].'" 
    )'; 
  • 沒有測試 - 你可能仍然需要用引號撥弄...
+0

謝謝,只要我看到您的消息,就點擊了我使用了錯誤的條款。 – cyanoxide

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函數。

祝你好運。