2016-03-30 1 views
2

J'ai une table dynamique nommée 'produits' avec plusieurs langues. Les colonnes de la table ressemble à ceci:Mysql mettre à jour toutes les colonnes commençant par le même nom

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

Les langues peuvent être plus ou moins.

Maintenant, je veux mettre à jour ce tableau et définir toutes les colonnes commençant par "store_" à la valeur 1.

J'ai essayé les éléments suivants:

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

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

Je reçois le message suivant d'erreur:

SQLSTATE [42S22]: Colonne non trouvée: 1054 Colonne inconnue 'store%' dans 'Liste des champs'

Existe-t-il un moyen de mettre à jour toutes les colonnes commençant par 'store_' ou dois-je énumérer toutes les colonnes?


Sur la base de la réponse de jekaby est ici la solution complète qui a fonctionné pour moi:

$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

Vous pouvez entrer dans INFORMATION_SCHEMA, obtenir tous les noms de colonnes désirés à partir de là et construire les requêtes avec cette information. Mais c'est encore plus compliqué que de le faire manuellement. – Mihai

+0

Le problème est, que les langues sont générées par l'utilisateur. Donc, si l'utilisateur ajoute une langue, la requête doit changer automatiquement lorsque la table change. – Jaycaponex

Répondre

3

Vous ne pouvez pas faire comme ce store_% - c'est une colonne inexistante dans le tableau tel qu'il est écrit dans votre erreur

Vous devriez obtenir toutes les colonnes avec des noms comme /^store_/ (regexp). Et que de mettre à jour tous ces champs les ayant répertoriés.

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

Que recueillir tous les champs de « champ » ... Vous pouvez en savoir plus comment obtenir toutes les colonnes here.

+0

Ça sonne bien je vais essayer celui-ci :) – Jaycaponex

+0

Celui-ci a bien fonctionné pour moi. Je vous remercie! – Jaycaponex

5

Vous devez définir explicitement chaque colonne. SQL ne prend pas en charge les caractères génériques pour les noms de colonnes (à l'exception de * pour SELECT *):

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

Votre structure de données suggère que vous voulez vraiment une table ProductStores. Cela aurait une ligne par langue (?) Et par produit. Il aurait au moins trois colonnes:

  • ProductId
  • Language
  • Value

Ensuite, vous simplement faire:

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

Le tableau ci-dessus est seulement pour l'état du produit. Il gère l'état du produit actif ou inactif dans les magasins. Mais j'ai une «table de langues» pour que je puisse construire la requête à partir de cette table? Donc, deux façons sont possibles, je construis de manière dynamique une chaîne comme: $ culumns = "store_de = 1, store_en = 1, etc"; "Mettre à jour les produits SET' $ columns' WHERE product_id =? " Ou je peux mettre à jour chaque langue avec une boucle foreach ou while? – Jaycaponex

+0

Merci pour la réponse. :) Ce n'était pas la solution qui m'a aidé mais c'était la bonne réponse à ma question. – Jaycaponex