php PDOで”ON DUPLICATE KEY UPDATE”が失敗するので調べたら同じパラメーターは使いまわせなかった

この記事の所要時間: 231

っていう覚書

table構造

説明用にこんな感じにしてみました。

[🔑] id name bpm
1 Elemental Creation 212
2 HAELEQUIN 172
3 秋風に靡く追憶は彼女なのか 190

ON DUPLICATE KEY UPDATEは便利!

特定の配列をforeachして更新/追加作業をするときにはとても便利です。
上の表の場合だとidが同じならupdate なければinsertする感じです。

最初に書いたのが以下のコードです。3曲目のデータを修正するってシチュエーションです。

この内容だと以下のエラーが発生します。
PDOException: SQLSTATE[HY093]: Invalid parameter number in C:\path\to\music.php on line 4

マニュアルをしっかり読んでみるとこんなことが書いてありました。

PDOStatement::execute() をコールする際には、 文に渡すパラメータにはそれぞれ固有のパラメータマークを設定する必要があります。 エミュレーションモードが有効になっていない限り、 ひとつのプリペアドステートメントの中で、同じ名前のパラメータマークを 複数使用することはできません。

http://php.net/manual/ja/pdo.prepare.php

要するにinsertで使った:nameは、updateでもう一度使うことはできないってことらしいです。(同じパラメータを複数回定義できないってことだと勘違いしていました)

上の例だとnameは VALUES(name)で呼び出せます。

[🔑] id name bpm
1 Elemental Creation 212
2 HAELEQUIN 172
3 秋風に靡く追憶は彼女なのか? 192

しっかりとupdateできました。
これにて完了です。

因みに秋風に靡く追憶は彼女なのか?はオススメなんで聞いてみてください。譜面も楽しいですがHARDつきません。