2017-01-31 8 views
1

私はPrestashopで作業しています。注文用の出荷ラベルを生成するモジュールがあります。ラベルを作成すると、キャリアウェブサイトで使用できるトラッキングコードが生成されます。しかし問題は、荷送人が追跡コードを受け取るために、このコードをコピーしてプレstashopに貼り付ける必要があることです。このプロセスを自動化して、システム内の人間のエラーを最小限に抑えることが私の目標です。SQL Submittopicの正しい構文

私は、トラッキングコード(ps_order_carrier、tracking_number)を格納しているprestashopのデータベース内にテーブルとカラムを見つけました。データベースのこの値を変更すると、意図したとおりに順序が変わることが確認されました。 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を除外している人のみの間違った答え:)。 –

答えて

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(); 
0

insert文に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*/ 
    ) 
); 

intに、すべてのID値をキャストし、すべての文字列値でpSQLを使用することを忘れないでください。 必要な場合はupdate機能もあります。

幸運。

関連する問題