はじめに
前にPHPでSQL文を変数に代入して実行しようとしていると、SQL文はあっているはずなのになぜかHTTP ERROR 500
が返ってきていました。
原因のコード
$sql = "INSERT INTO sample_table (id,name,age,birthday) VALUES ({$_POST['id']},"{$_POST['name']}",{$_POST['age']},"{$_POST['birthday']}")";
原因
原因はおそらく、"{$_POST['name']}"
のダブルクォーテーションがあることで、この時点で変数の値が終了しているという判定になったからだと考えられます。
解決方法
"{$_POST['name']}"
や、"{$_POST['birthday']}"
のダブルクォーテーションをシングルクォーテーションに置き換えることで解決しました。
$sql = "INSERT INTO sample_table (id,name,age,birthday) VALUES ({$_POST['id']},'{$_POST['name']}',{$_POST['age']},'{$_POST['birthday']}')";
まとめ
この作業をしているとき、私はVIエディタで編集をしていたので初歩的なミスかもしれませんが、気づくのが遅れました。VSCodeなどの高度なエディタだと赤文字で知らせてくれるかもしれないので、VSCodeなどを使うようにすることでもエラーを減らせるかもしれないです。
おまけ
このエラーについて調べていると、シングルクォーテーションとダブルクォーテーションで意味合いが少し異なるらしいのでまとめます。
' '
だとくくってある文字はすべて文字列として認識されるので変数があってもそれは文字列として認識されます。
対して" "
だと文字列の中に変数があるとそれは変数内の値が認識されます。
つまり、変数を扱いたい場合は" "
でくくらないといけないらしいですね。
いままであまり考えずにしていたので勉強になりました。
追記
このコードを書いているときはSQLインジェクションなどのセキュリティについては一切考えていないのでブレースホルダーを使用するなどの対策をするようにしましょう。