2017-01-31 29 views
1

Ich arbeite mit Prestashop und ich habe ein Modul, das Versandetiketten für meine Bestellungen generiert. Wenn ein Label erstellt wird, generiert es einen Tracking-Code, der auf der Website des Carrier verwendet werden kann. Das Problem ist jedoch, dass unsere Versender diesen Code kopieren und in prestashop einfügen müssen, damit Kunden eine Tracking-E-Mail erhalten. Mein Ziel ist es, diesen Prozess zu automatisieren, um menschliche Fehler in unserem System zu minimieren.Korrekte Syntax für SQL-Vorlage

Ich habe die Tabelle und Spalte innerhalb der Datenbank von Prestashop gefunden, die den Tracking-Code enthält (ps_order_carrier, tracking_number) und ich habe bestätigt, dass die Änderung dieses Wertes in der Datenbank die Reihenfolge in der von mir beabsichtigten Weise beeinflusst. Innerhalb des Prestashop-Moduls gibt es einen Codeabschnitt, der die Verfolgungsnummer und verschiedene Bestellinformationen wie die Bestell-ID, die ich wahrscheinlich an seine eigene Tabelle benötige, übergibt, sodass ich annehmen kann, dass ich diesen Teil des Codes kopieren und ändern kann meine Bedürfnisse. Im Folgenden ist der Code innerhalb des Moduls:

$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); 

Ich habe eine Kopie davon direkt unterhalb und geänderten es meine Bedürfnisse zu erfüllen, aber es scheint nicht zu tun, was ich will es. Ich habe das Gefühl, dass ich die Syntax durcheinander bringe. Ich habe ein paar verschiedene Varianten versucht, so ist es ein bisschen chaotisch ist, aber hier ist, was ich habe, da dies zu schreiben:

$sql2 = 'INSERT INTO `ps_order_carrier` WHERE `id_order` = '.(int)$data['id_order'].' 

    (
     tracking_number 
    ) 
    VALUES 
    (
     "'.pSQL($data['tracking_code']).'" 
    )'; 

    Db::getInstance()->Execute($sql2); 

Jede Hilfe wäre sehr, da dies uns würde sparen so viel Zeit geschätzt.

Danke!

+0

Sind Sie sicher, dass Sie hier kein UPDATE machen wollen? INSERT hat keine WHERE-Klausel; nur 'INSERT ... SELECT' und' INSERT ... ON DUPLICATE KEY UPDATE'. –

+0

unklare Fragen fangen an, schlechte Antworten zu bekommen; Du hast (gute) Antworten bekommen und meinen Kommentar, also ?? –

+0

Schlechte Antworten von Personen, die nur das SQL-Tag betrachten und das Prestashop ausschließen :). –

Antwort

1

Sie versuchen, eine Zeile mit einer "INSERT" -Abfrage zu aktualisieren.

$sql2 = 'UPDATE `ps_order_carrier` SET tracking_number = "'.pSQL($data['tracking_code']).'" WHERE `id_order` = '.(int)$data['id_order'].' 

Db::getInstance()->Execute($sql2); 

Aber der beste Weg, um zuerst das orderCarrier Objekt laden würde und seinen Tracking-Wert zu ändern, um eine direkte Abfrage an der DB, ohne dabei.

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

In der Anweisung insert gibt es keine where-Klausel.

Geben Sie alle Werte an - und Sie erhalten einen neuen Datensatz.

$sql2 = 'INSERT INTO ps_order_carrier 
    (
     tracking_number 
     , id_order 
    ) 
    VALUES 
    (
     "'.pSQL($data['tracking_code']).'" 
     , "'.(int)$data['id_order'].'" 
    )'; 
  • nicht getestet - Sie noch mit den Anführungszeichen Geige benötigen ...
+0

Vielen Dank, sobald ich Ihre Nachricht sah, klickte es, dass ich die falsche Klausel verwendete. – cyanoxide

1

Um alle Arten von Fehlern in MySQL Abfragesyntax Prestashop einige Klassen zu vermeiden und Funktionen, die Sie verwenden können:

Db::getInstance()->insert($this->name.'_labels', 
    array(
      'id_order' => (int)$data['id_order'], 
      'id_shipment' => pSQL($data['id_shipment']), 
      /*and so on*/ 
    ) 
); 

Denken Sie daran, alle ID-Werte zu int und verwenden pSQL in allen String-Werte zu werfen. Es gibt eine update Funktion, wenn Sie es auch brauchen.

Viel Glück.

Verwandte Themen