こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
PHPエンジニアとして9年~の経験があります。
PHPのPOSTが何やらうまくいかない…
自分の開発環境では動作したのに、別の環境だと動かない、正しい内容で送信されない!といったときには「自動エンコーティング設定」と「formのenctype」を疑ってみてください。
POSTしたものが環境によって文字化けする
自分のローカル環境で作ったフォームが、テストしても特に問題なくPOSTできたのに、稼働中のサーバーにあげたらでPOSTしたものが文字化けしてしまいました。
「自動エンコーティング」の設定を確認
php.iniの設定で、「mbstring.encoding_translation」が「on」になっていると、自動でエンコーディング変換が走ります。
単純な話、これを「off」にしてやれば解決ですが、他人様のサーバーの場合は勝手にいじれるわけもありません…
他にもこの現象に嵌った方はいるようです。
mbstring.encoding_translation 邪魔なだけ、と思うのは私だけなのか?|ぼらこみゅ
すごい状況下もあるものです…
ただ、内部文字エンコードはUTF-8だったので、完全に上記の例に当てはまっていたわけではありませんでした。
じゃあ一体なんなのか?と更に調べていきます…
※php.iniはphpinfo();を書いたPHPファイルを確認したいサーバーに置いて、ブラウザで実行するとその内容を見れるようになります。
最終的な解決の糸口
enctype=”multipart/form-data”を指定するとHTTP入力の自動エンコーディング変換で失敗してしまう
PHPのマルチバイトにおけるトラブルシューティング
私が陥ったケースでは、画像等の添付送信がないのにこの記述をしていました。そのため、この記述を削除して解決することができました。
画像などの添付送信もないのになんでenctype=”multipart/form-data”なんて書いていたのよ、と言いますと、このときはWordPressプラグインによるフォーム機能を使っていたので自分で記述していたわけではなく、プログラム側で自動生成する際にこの記述が必ず入るようになっていました。
ちなみに上記サイトではonにしておきましょう、ですが最近は「mbstring.encoding_translation」の設定はoffにしておきましょうっていう流れのようですね。
だって文字コードが自動変換かけられたらこっちはたまらないよ…こっちではどうにもならないってことでしょう?
まとめ
- フォームが環境によって正常に動かないときは、サーバーの自動エンコーディング設定を疑ってみよう
- formのenctypeが要望に一致したものになっているか、確認しよう
Webで動くものを作っていて、欠かせない処理が「POST」。ユーザー登録やお問い合わせで日々使うものですね。
一見基本で簡単なようですが、これには大きな落とし穴が潜んでいることもあります…。
開発環境では動いていたのに、本番環境に適用したらうまくいかない、というのはよくある話です。もし遭遇してしまったら、サーバーの環境やソースに不要な記述をしていないかを確認してみてください。