3

配列内のデータベースに挿入される一連のラジオボタンがあります。これは、最初から正常に機能します。

$query="INSERT INTO `notes_value` ( `style_color`, `note_id`, `value`, `created_at` ) VALUES ";
        foreach ($params AS $key => $value) {       
            if (( $key != "form_key" ) && ( $key != "stylecolor" ) && ( $key != "key" )){           
                $values[] = "('$sku', '$key', '$value', NOW()) ";       
                }
            }
        $query .= implode(', ', $values) . ';';

ラジオボタンの状態が変更されたときにこれらの列を更新するようにしようとしているので、これを変更します:

$values[] = "('$sku', '$key', '$value', NOW()) ON DUPLICATE KEY UPDATE value = '$value'";   

このクエリで選択された配列にラジオボタンが1つしかない場合は、機能して更新されます。

 INSERT INTO `notes_value` ( `style_color`, `note_id`, `value`, `created_at` )
 VALUES ('1893240720', '1', 'no', NOW()) 
 ON DUPLICATE KEY UPDATE value = 'yes';

ただし、複数のボタンを選択すると、クエリが壊れます。

INSERT INTO `notes_value` ( `style_color`, `note_id`, `value`, `created_at` )
VALUES ('1893300667', '1', 'yes', NOW())
ON DUPLICATE KEY UPDATE value = 'no',
('1893300667', '2', 'yes', NOW()) 
ON DUPLICATE KEY UPDATE value = 'maybe';

個別に作成する必要がありますか、それとも重複をチェックしてからそれぞれをINSERT更新するにはどうすればよいですか?これは単に構文が悪い場合ですか?valuenote_id

編集

これまでの回答から、一度に複数の値を更新できる必要があるかどうかは明確ではなかったようです。ON DUPLICATE異なる変数で複数の値を更新する必要がある場合、最後にどうすればよいかわかりません。

4

3 に答える 3

3

Zac、はい、ステートメントを1回(最後に)指定することで、このアクションを実行できます。

$query = "INSERT INTO `notes_value` ( `style_color`, `note_id`, `value`, `created_at` ) VALUES ";

foreach ($params AS $key => $value) {       
    if (( $key != "form_key" ) && ( $key != "stylecolor" ) && ( $key != "key" )){           
        $values[] = "('$sku', '$key', '$value', NOW()) ";       
    }
}
$query .= implode(', ', $values) . 'ON DUPLICATE KEY UPDATE value = VALUES(value);';

見る:

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

于 2012-04-18T21:00:07.947 に答える
1

主キーがnote_idの場合、

INSERT INTO `notes_value` ( `style_color`, `note_id`, `value`, `created_at` )
VALUES ('1893300667', '1', 'yes', NOW())
ON DUPLICATE KEY UPDATE
`value` = 'no',
style_color = VALUES(style_color),
created_at = VALUES(created_at);
于 2012-04-18T20:56:47.680 に答える
0

ON DUPLICATEKEYUPDATEを指定するのは1回だけだと思います。このような..

INSERT INTO `notes_value` ( `style_color`, `note_id`, `value`, `created_at` ) 
VALUES ('1893300667', '1', 'yes', NOW()), 
       ('1893300667', '2', 'yes', NOW()) 
ON DUPLICATE KEY UPDATE value = values(`value`); 

編集:私が追加した最初のNOW()を忘れました。編集:列の値を取得するための値関数を追加しました。

私がこれを行ってからしばらく経ちましたが、そうだと思います。

于 2012-04-18T20:51:14.123 に答える