2016-03-30 6 views
2

私は複数の言語で 'products'という名前の動的テーブルを持っています。 表の列は次のようになります。Mysqlは同じ名前で始まるすべての列を更新します

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

言語は、多かれ少なかれことができます。

今、私は次のことを試してみました。この表を更新したいと1

を評価するために、「STORE_」で始まるすべての列を設定します。

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

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

私はエラーメッセージを以下の取得:

SQLSTATE [42S22]:列が見つかりません:1054不明な列 'store%' in 'フィールドリスト'

'store_'で始まるすべての列を更新する方法はありますか、すべての列をリストする必要はありますか?ここjekabyからの回答をもとに


私のために働いた完全なソリューションです:あなたは、明示的に各列を設定する必要が

$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

あなたはINFORMATION_SCHEMAに行き、そこからすべての希望の列名を取得し、その情報でクエリを構築することができます。しかし、これは手動で行うよりもさらに複雑です。 – Mihai

+0

問題は、言語がユーザーによって生成されたことです。したがって、ユーザーが言語を追加すると、テーブルが変更されたときにクエリが自動的に変更される必要があります。 – Jaycaponex

答えて

3

あなたはこのstore_%のように行うことはできません - それが書かれているように、テーブル内に存在しない列ですあなたのエラー。

/^store_/(regexp)のような名前の列をすべて取得する必要があります。そして、これらのフィールドをすべて更新してください。

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

「フィールド」からすべてのフィールドを集めたより...あなたはすべての列hereを取得する方法の詳細を読むことができます。

+0

いい音私はこれを試してみましょう:) – Jaycaponex

+0

これは私のためにうまくいった。ありがとうございました! – Jaycaponex

5

。 SQLは、(SELECT *ため*を除く)のカラム名のワイルドカードをサポートしていません:

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

あなたのデータ構造は、あなたが本当にProductStoresテーブルを望んでいることを示唆しています。これは言語(?)と製品ごとに1つの行を持ちます。そして、あなたは、単にだろう

  • ProductId
  • Language
  • Value
  • :それは、少なくとも3つの列を持っているでしょう

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

上記の表は、製品のステータスのみです。店舗内のアクティブまたは非アクティブの製品ステータスを処理します。しかし、私は '言語テーブル'を持っているので、このテーブルからクエリを構築できますか? 2つの方法が可能です。 $ culumns = "store_de = 1、store_en = 1など"のように動的にストリングを作成できます。 "UPDATE製品SET' $ columns' WHERE product_id =? " または、各言語をforeachまたはwhileループで更新できますか? – Jaycaponex

+0

答えをありがとう。 :)それは私を助けた解決策ではありませんでしたが、私の質問に対する正解でした。 – Jaycaponex

関連する問題