2015年2月28日土曜日

PHP5.4におけるhtmlspecialcharsの動作

こんばんは。
文章を書くのが苦手なので、練習するようにします。
今日の記事はPHP5.4以降におけるhtmlspecialcharsの動作です。 PHPの5.3までの動作と違いがありました。
でも一番言いたい事は、確認ってだいじだねです。

管理しているサイトのお問い合わせフォームの動作がおかしいと連絡があり対応したのですが、このときこの事を知りました。

現象

・送信者、内容などの入力項目が空欄のままお問い合わせメールを受信する。

現象の確認

早速現象を確認しようとローカル環境でお問い合わせフォームを動作させてみた。
すると、入力した内容が確認画面で表示されない。たしかにおかしい。

ソースの確認

ソースを確認すると一枚のファイルにPHPをべた書きで、しかも文字コードがSJISだったのに驚く。いまどきと思うが、結構以前から運用されていたサイトらしいので、こういうこともあるんですね。

お問い合わせの項目のソースを確認すると$_POSTに入っている項目を変数に代入して、htmlspecialcharsをあてて、代入し直してprintしていた。ざっくりこんな感じ

$name = $_POST['name'];
$name = htmlspecialchars($name, ENT_QUOTES);
print $name;

原因をツメル

echo $_POST['name'];
で、なんなくnameが表示された。とりあえずデータ渡って来ている。
htmlspecialcharsをあてた後に表示がさあれないことに気がついた。

htmlspecialcharsの仕様確認

とりあえずこちらで確認。
http://php.net/manual/ja/function.htmlspecialchars.php

phpのバージョンによって、第三引数のエンコーディングのデフォルト値が違う事が書かれていいたが釈然としない。しばらくググるとこちらのサイトにたどり着く
http://blog.tokumaru.org/2011/11/php54htmlspecialchars.html

htmlspecialcharsの第三引数を指定していないと、マルチバイト文字が表示されないことがあるとのこと。これですね。

htmlspecialcharsに第三引数を設定してなんなく修正完了。

根本的な原因を追求

htmlspecialcharsが悪さしたのは分かるが、いままで運用していたのになぜ急にこんな現象がでたのか?

サイトを運用していたサーバーのリプレースが行われ、PHPのバージョンも最新のバージョンがインストールされていた。
リプレース後にきちんとサイトの動作確認をしていなかったのですね。これが一番の原因でした。

まとめ

・PHPのバージョンが変わると、何かが起きる。 ・きちんとテストをしましょう。

0 件のコメント:

コメントを投稿