[php]pdoで重複するカラムに意図しない値が入っている…select文のカラム指定は必須!

System trouble徒然草2.0

phpでシステム開発をしている時にデータ取得するSQLクエリにてselect * (セレクトアスター)を使って横着することがあります(そもそも横着することがダメであり面倒くさくてもすべてカラムに定義をする!というのがシステム開発の常識だと言えるでしょう)が、それでも早々に結果を得たい時に横着をすることはあります。しかし、これではバグを生み、セキュリティリスクを生みます(例えばユーザテーブルをselect *引いてしまった場合は、意図せずパスワードハッシュのカラムやメールアドレスなどをWeb画面へ出力してしまったりすること等が考えられます)

外部結合する時にシステムIDとしてIDなどを付与していると…後で連結したIDが取得されることがあるようです。これは、fetchした時に常に後のIDが常に優先されればテストの時に誤りに気がつくのですが…必ずしもそういうルールなわけではないようです。

具体的にSQLを書くと…

select * from table1 left outer join table2 where table1.id = table2.id;

を実行した場合のidはtable1のidかもしれないしtable2のidかもしれないということです。fetchして配列データとして格納するPHPコードを書いてみたのですが、SQLに変更をしていないにも関わらずPHPで取得されるIDが変化しました。このへんはPDOなのかPHPのハッシュの仕組みなんかが関わってきており、単純に外部結合した場合は後から追加したIDが取得されるというわけではなさそうです(PHP 7.2.17 PDO等のバージョンは確認していない)

結論。pdoを使用する際というよりは、テーブルの結合をした場合のSELECT文はカラム名を*で書かないこと、と思っていたほうがよさそうです。*を使ってはいけない!という人もいますが、それはいくらなんでも厳しすぎます。*となんとかは結局のところ使いようかなと思います。

コメント

タイトルとURLをコピーしました