2017-09-13 14 views
0

私の$ _POST配列は次のようになります(特に「child_address」)のMySQL/PHP更新多対多のテーブル

Array ( 
    [0] => Array ( 
     [child_address] => 123 Street 1 
    ) 
    [1] => Array ( 
     [child_address] => 123 Street 2 
    ) 
) 

するとMySQLの多対多のテーブルに挿入するそれらの上Iループ私のテーブルの同じIDを持つすべてのフィールドに対して、配列の最後の値が入力されます。ここ

foreach ($child as $value) { 
    $query = "UPDATE M_children 
     SET child_address = ?, 
     WHERE personal_id = ?"; 
    $statement = $db->prepare($query); 
    $statement->bind_param('si', $value['child_address'], $_SESSION['mysqlID']); 
    $statement->execute(); 
} 

enter image description here

答えて

2

いくつかのものは:

  1. forループ内のクエリを定義する必要はありません、それは変更されません。
  2. forループ内でステートメントを準備する必要はなく、変更もされません。
  3. bindParamはパラメータをバインドします。パラメータが変更されたときに実行を再実行すると、新しいパラメータ値でクエリが実行されます。

  4. これはバグで、その人IDですべての行を更新します。 1つの行のみを更新する場合は、更新クエリでさらに選択する必要があります。

1

「SET child_address =?WHERE personal_id =?」と答えると、両方の子供のpersonal_idが同じです(スクリーンショットでは127)、これにより両方の子供が同じ住所に設定されます。

クエリを変更するか、渡している最後のパラメータを変更します。

+0

良いキャッチ!しかし、 '何かにクエリを変更する?または最後のparamは何に?説明の少しは非常に役立つだろう! – kaza

+1

WHERE句を使用して更新を絞り込んで、単一の子の行のみを変更するようにします。 'personal_id'が子供の一意の識別子でない場合、それはあなたが使いたいものではありません。 'id'はユニークなように見えるので、おそらく代わりにそれを使うべきです。 – MorbidGnome

+0

答えにコメントを付けることはできますか? – kaza

関連する問題