DockerでPHPとかMySQLとかいろいろ動かしてる状態で出会った不具合です。
検索しようにもどう調べたらいいのか、原因の切り分けをしようにもいまいちわからなかったので、忘備録的に載せます。
##不具合
####1.データが勝手に一律更新される
ストアドプロシージャ実行時に、Whereでidを指定しているにも関わらず、指定したテーブルのデータが全て変更されます。
→PHPからPDOでストアドプロシージャを呼び出し普通に実行します。するとデータが全て消えたり、全て書き変わったりします。MySQLで実行すると問題なく通ってしまうので、SQL文には問題はなさそうです。値をセットする箇所で問題が起きてるようでした。
また、phpMyadmin使用時限定で、MySQLコンテナに入って同じSQL文を実行しても正常に動作します。
####2.謎のシンタックスエラー
→クエリ文を見直しても渡すパラメーターを見直してもシンタックスエラーが消えません。しかもコーテーションをシングルからダブルに直すと通るようになりますが、今度はデータが取得できません。
##解決策
####1.データが勝手に一律更新される
実行時にデータが消えるのは、SQL文で使用する変数名は項目名と違う名前を使わなければならないのを守っていなかったからでした。
https://www.bnote.net/mysql/appendix/select_into.shtml
Where id=id を、 Where id=update_idに直すと正しく実行されるようになりました。
####2.謎のシンタックスエラー
デバッグログを仕込んでない箇所で落ちていたため、落ちている箇所を勘違いしていました。なんとも間抜けなオチ…。
PDOでDB操作を行なっていたので、try catchで囲んでエラーの箇所はちゃんとメッセージを出すようにしておいた方がいいです。私はメッセージをvar_dumpで表示させる箇所とさせない箇所とが混在していました。
##最後に
初めてのPDOにめちゃくちゃハマりました。
bindParamとか取得できなくなるとかストアドプロシージャを使ってSELECTを実行しようとしたらPDOでは結果が受け取れないとか…正直PDO関連は暫く見たくないです。
ただ次同じことをやるとしたら、今回のような引っかかり方はしませんし、したとしても早く抜け出せるようにはなったかと思っています。
##おまけ
後日、別の条件でも同じバグを出しました。SQL文直打ちでも、引数を追加するのを忘れて変数を指定しても出ます…。
なので、全体的にSQL文を見直すことをおすすめします。
こんな事例もあったよ、ということで…。