2016-05-02 12 views
1

ON私はMySQLのテーブルを持って、入力配列からセルに追加し、val1UNIQUEキーとして設定されている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で

+0

、あなたが名前付きのプレースホルダに向けて移動することができます'PDOStatement :: bindValue()'や 'PDOStatement :: bindParam()'メソッドを使います。 – Scuzzy

+0

となり、その行は 'ON DUPLICATE KEY UPDATE val3 = val3 +"; +:newval3'? – Birrel

+0

val3カラムを子テーブルにする方がいいかもしれないので、複数の値を1つのカラムに入れる必要はありません。 –

答えて

1

http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values

... DUPLICATE KEY UPDATEステートメントに、次の文のINSERT部分から列の値を参照するためにUPDATE句でVALUES(COL_NAME)関数を使用することができます。つまり、UPDATE句のVALUES(col_name)は、挿入されるcol_nameの値を参照し、重複キーの競合が発生していないことを示します。この関数は、複数行の挿入に特に便利です。 VALUES()関数は、INSERT文のON DUPLICATE KEY UPDATE句でのみ意味を持ち、それ以外の場合はNULLを返します。

あなたはvalues()機能と$datafieldsであなたが使用した値を参照することができるはず

SQL:?位置 ``トークンよりもむしろON DUPLICATE KEY UPDATE val3 = CONCAT_WS(';',val3,VALUES(val3))

+0

Yessum、それはあなたがそれを書いたのとまったく同じです。 – Birrel

関連する問題