2016-08-30 4 views
1

私は3つのテーブル、product、category、product_categoryを持っています。php mysql複数のチェックボックスの追加/削除オプションのチェックとデータベースの更新方法

表製品 - > PID、製品名

表のカテゴリ - > CID、カテゴリ名

表のPRODUCT_CATEGORY - > PID、CID

私の問題を処理しているPRODUCT_CATEGORY表。私はそれを詳細に説明しましょう。

私は新製品を追加する際に、2つのテーブル - > productとproduct_categoryを更新する必要があります。

product_categoryは、1つの製品を複数のカテゴリに割り当てることができるため、製品IDとカテゴリIDを格納するために使用されます。

新しい製品を追加するときは、1つの入力ボックスと1つのアレイを使用して、ユーザーが選択するカテゴリを表示します。例えば。

foreach($display->category_name as $iid => $name) { 

      echo ' 

       <div class="checkbox"> 
        <label><input type="checkbox" name="check_list[]" value="'.$iid.'">'.$name.'</label> 
       </div> 

       '; 
     } 

更新ボタンをクリックすると、以前にキー入力したレコードが表示されます。

enter image description here

だから私の質問は、ユーザーが1つのより多くのオプションを確認するか、1以上のオプションのチェックを外しORそれらのすべてを削除しているかどうかを確認する方法です。それに応じてproduct_categoryテーブルを更新します。 (この1つは簡単ですが、ちょうど1より多くのオプションを追加)

ビフォー>西洋料理とミックス食品がチェックされます

スクリーンショット

ケース1を参照してください。

アフター>西洋料理、ミックス食+中華料理

ケース2:(洋食を除く)

ビフォー>西洋料理とミックスフードがチェックされます。

アフターミックス食品はチェックされています。

ケース3:(洋食を削除して、中華料理を追加)

ビフォー>西洋料理とミックスフードがチェックされます。

アフター&ミックスフードと中華料理がチェックされています。

答えて

2

使用array_diff()未チェックの値のリストを取得するには:なるほど

$old_check_list = ['1', '2']; 
$new_check_list = ['2', '3']; 
$unchecked_values = array_values(array_diff($old_check_list, $new_check_list)); 
+0

ありがとうございました –

1

私は通常、以前の値をすべて削除してから、新しい値を再挿入します。これにより、合併症を防ぐことができます。

$mysqli->query("DELETE FROM product_category WHERE product = $id"); 

foreach ($_GET['check_list'] as $i => $category_id) { 
    $mysqli->query("INSERT INTO product_category 
      (product_id, category_id) 
     VALUES 
      ($id, $category_id)"); 
} 

入力をサニタイズすることを忘れないでください。この例はコピー/貼り付けしないでください。

+0

を...この方法は、データを扱うには良い方法ではありませんか?特にデータベースの挿入/更新/削除の場合その他の方法は? – gosulove

+0

データの整合性が気になる方は、トランザクション内ですべてをラップするだけです。 –

+0

@SamDufelだから、あなたもこのやり方をお勧めしますか? – gosulove

関連する問題