2016-03-30 10 views
2

Ich habe eine dynamische Tabelle namens "Produkte" mit mehreren Sprachen. Die Spalten der Tabelle sieht wie folgt aus:Mysql Update alle Spalten beginnend mit dem gleichen Name

id, product_id, store_de, store_en, store_fr, store_es... etc 

Die Sprachen mehr oder weniger.

Jetzt möchte ich diese Tabelle aktualisieren und alle Spalten gesetzt mit „store_“ beginnen zu schätzen 1.

Ich habe versucht, die folgenden:

$stmt = $dbh->prepare("UPDATE products SET `store_%` = ? WHERE product_id = ?"); 

$stmt->execute(array(1, $lastID)); 

erhalte ich folgende Fehlermeldung:

SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 'Speichern%' in 'Feldliste'

Gibt es eine Möglichkeit, alle Spalten zu aktualisieren, die mit 'store_' beginnen, oder muss ich alle Spalten auflisten?


Basierend auf der Antwort von jekaby hier ist die vollständige Lösung, die für mich gearbeitet:

$get_stores = $dbh->prepare("SHOW COLUMNS FROM products_active WHERE field REGEXP '^store'"); 
    $get_stores->execute(); 
    $stores = $get_stores->fetchAll(); 

    $update_string = ""; 
    $first_store = true; 
    foreach($stores as $store) { 
     if(!$first_store) { 

      $update_string .= ", "; 

     } else { 

      $first_store = false; 

     } 
     $update_string .= $store['Field']." = '".$status."'"; 

    } 

    $update_activity = $dbh->prepare("UPDATE products_active SET $update_string WHERE product_id = ?"); 
    $update_activity->execute(array($product_id)); 
+1

Sie können in INFORMATION_SCHEMA gehen, alle gewünschten Spaltennamen von dort abrufen und die Abfragen mit diesen Informationen erstellen. Aber das ist noch komplizierter, als es manuell zu tun. – Mihai

+0

Das Problem ist, dass die Sprachen vom Benutzer generiert werden. Wenn der Benutzer also eine Sprache hinzufügt, muss die Abfrage automatisch geändert werden, wenn sich die Tabelle ändert. – Jaycaponex

Antwort

3

Sie können nicht wie diese store_% tun - es ist keine existierende Spalte in der Tabelle, wie sie geschrieben ist dein Fehler.

Sie sollten alle Spalten mit Namen wie /^store_/ (Wildcards) erhalten. Und dann aktualisieren Sie alle diese Felder, die sie aufgelistet haben.

mysql> SHOW COLUMNS FROM products where field REGEXP '^store_' 

als alle Felder von ‚Field‘ sammeln ... können Sie mehr lesen, wie alle Spalten bekommen here.

+0

Hört sich gut an, ich werde es versuchen :) – Jaycaponex

+0

Das hat gut für mich funktioniert. Vielen Dank! – Jaycaponex

5

Sie müssen explizit jede Spalte setzen. SQL unterstützt keine Platzhalter für Spaltennamen (mit Ausnahme von * für SELECT *):

update products 
    set store_de = 1, 
     store_en = 1, 
     store_fr = 1, 
     store_es = 1, 
     . . . 
    where product_id = ?; 

Ihre Datenstruktur zeigt, dass Sie wirklich eine ProductStores Tabelle wollen. Dies würde eine Zeile pro Sprache (?) Und pro Produkt haben. Es würde mindestens drei Spalten:

  • ProductId
  • Language
  • Value

Dann würden Sie einfach tun:

update ProductStores 
    set Value = 1 
    where ProductId = ?; 
+0

Die obige Tabelle bezieht sich nur auf den Produktstatus. Es verarbeitet den aktiven oder inaktiven Produktstatus in Geschäften. Aber ich habe eine 'Sprachen-Tabelle', also könnte ich die Abfrage aus dieser Tabelle erstellen? So sind zwei Möglichkeiten möglich Ich baue dynamisch einen String wie: $ culumns = "store_de = 1, store_en = 1, etc"; "UPDATE Produkte SET' $ Spalten' WHERE product_id =? " Oder ich kann jede Sprache mit einer foreach oder while-Schleife aktualisieren? – Jaycaponex

+0

Danke für die Antwort. :) Es war nicht die Lösung, die mir geholfen hat, aber es war die richtige Antwort auf meine Frage. – Jaycaponex

Verwandte Themen