ON私はMySQLのテーブルを持って、入力配列からセルに追加し、val1
がUNIQUE
キーとして設定されているPHP、MySQLは - DUPLICATE KEY
sometable
id | val1 | val2 | val3
1 | ... | ... | ...
2 | ... | ... | ...
3 | ... | ... | ...
のようなもの。
複数の行を同時に挿入しています。数は可変であり、そしてそのクエリは、次のように構成されています
for(...building array earlier in code...){
$arr[] = array('val1' => $somVal[$i][0],
'val2' => $somVal[$i][1],
'val3' => $somVal[$i][2]);
}
$datafields = array('val1', 'val2', 'val3');
$insert_values = array();
$qms = array();
foreach($arr as $d){
$qms[] = '(' . dbplaceholders('?', sizeof($d)) . ')';
$insert_values = array_merge($insert_values, array_values($d));
}
$db = new PDO(...);
$db->beginTransaction();
$stmt = $db->prepare('INSERT INTO sometable (' . implode(',', $datafields) . ')
VALUES ' . implode(',', $qms) .
' ON DUPLICATE KEY UPDATE val3 = "New Val3 Value"');
if($stmt->execute($insert_values)){
$db->commit();
}
:
function dbplaceholders($text, $count=0, $separator=","){
$result = array();
if($count > 0){
for($x=0; $x<$count; $x++){
$result[] = $text;
}
}
return implode($separator, $result);
}
そして、これが正常に動作します。 val1
が重複している場合は、val3
の値が「New Val3 Value」に変更されます。
しかし、これは私が欲しいものではありません。私が望む何
は次のように現在の
何かの最後に追加される新しいval3
ためのものです:
ON DUPLICATE KEY UPDATE val3 = val3 + ";" + $newVal3Val
しかし、問題は$newVal3Val
が$insert_values
の内部に埋め込まれていることです。
重複が見つかった場合、どのように新しい値をセミコロン区切り文字で現在の値に追加することができますか? INSERTで
、あなたが名前付きのプレースホルダに向けて移動することができます'PDOStatement :: bindValue()'や 'PDOStatement :: bindParam()'メソッドを使います。 – Scuzzy
となり、その行は 'ON DUPLICATE KEY UPDATE val3 = val3 +"; +:newval3'? – Birrel
val3カラムを子テーブルにする方がいいかもしれないので、複数の値を1つのカラムに入れる必要はありません。 –