PHPの関数htmlspecialcharsの利用にあたって

htmlspecialcharsは便利な関数で、HTML表示において誤表示を招くような文字(たとえば< > ” など)を特殊文字として変換してくれる関数だ。

$message=htmlspecialchars($_POST[‘message’], ENT_QUOTES);

こんな感じで利用する。ところが、PHPのバージョンのせいなのか、この関数を利用すると正常に表示されない事態になっている。

具体的に見ていきたい。

http://www.amazon.co.jp/%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E8%A6%9A%E3%81%88%E3%82%8BPHP%E5%85%A5%E9%96%80-%E3%82%AA%E3%83%95%E3%82%A3%E3%82%B9%E5%8A%A0%E6%B8%9B-%E8%91%97/dp/4048701134

今回、PHPの学習は「つくって覚えるPHP入門」(アスキー・メディアワークス)を利用した。

きちんと、コードが書かれていて、初心者でも確実に動作が可能な学習用に適した書籍だ。

ところが、こちらの本のとおり作っても動かない。

原因は、htmlspecialcharsのようだ。

PHPの流れとしては以下のとおり。

紹介されているPHPのコード 

(1) inquiry.html

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=Shift_JIS”>

<title>お問い合せフォーム</title>

</head>

<body>

<h2>お問い合わせ内容を入力してください</h2>

<form action=”check_inquiry.php” method=”POST”>

<p><span style=”color:brown;font-size:10px”>■ </span>お問い合せタイトル</p>

<br>

<input type=”text” name=”title” size=”50″>

<br>

<br>

<p><span style=”color:brown;font-size:10px”>■ </span>お問い合せ内容</p>

<br>

<textarea name=”message” cols=”40″ rows=”5″>

お問い合わせ内容をできるだけ具体的に記述してください。

</textarea>

<br>

<br>

<input type=”submit” value=”お問い合わせ内容の確認”>

</form>

</body>

</html>

(2) check_inquiry.php

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=Shift_JIS”>

<title>お問い合せフォーム</title>

</head>

<body>

<?php

//お問い合せタイトル、詳細のセット

$title=htmlspecialchars($_POST[‘title’], ENT_QUOTES);

$message=htmlspecialchars($_POST[‘message’], ENT_QUOTES);

?>

<h2>お問い合わせ内容を<span style=”color:red”>確認</span>してください</h2>

<br>

<form action=”send_inquiry.php” method=”POST”><!–Getにしたら?–>

<input type=”hidden” name=”title” value=”<?php echo $title; ?>”>

<input type=”hidden” name=”message” value=”<?php echo $message; ?>”>

■ お問い合せタイトル:

<br>

<br>

<?php echo $title; ?><!–POSTは大文字でなければならない–>

<br>

<br>

■ お問い合せ内容:

<br>

<?php

//改行部分にBRタグを埋め込む

echo nl2br($message); ?><!–POSTは大文字でなければならない–>

<br>

<br>

<input type=”submit” value=”お問い合わせ内容を送信”>

</form>

</body>

</html>

このコードだと、表示が以下の画像のようになる。

入力フォームに入力をする。
なにも、表示されない。

 


コードを確かめてみた。

 


ネットで調べていたら親切なWebサイトが出てきた。

「徳丸浩の日記」内のPHP5.4のhtmlspecialcharsに非互換問題

こちらで、

PHP5.4.0から、htmlspecialchars関数のデフォルト文字エンコーディングがISO-8859-1(Latin-1)からUTF-8に変更されます。これに伴い、従来動いていたアプリケーションが動かなくなるケースが出てきます。典型的には、以下の両方の条件に該当するアプリケーションは、マルチバイト文字が表示されなくなります。

  • 内部文字エンコーディングとしてEUC-JPまたはShift_JISを用いている
  • htmlspecialcharsの第3引数を指定していない
以上のような案内がある。
またここでは、htmlspecialcharsを自作の関数に組み込む方法を指導している。

function hx($str, $flags = ENT_COMPAT, $charset = ‘EUC-JP’) {

return htmlspecialchars($str, $flags, $charset);

}

この方法を利用する前に、文字コードを修正して確認することにした。

コードを修正した。

ポイントは、metaタグ内のcharsetをUTF-8に変更、それにともなって、保存もUTF-8で保存。
(1) inquiry.html

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8“>

<title>お問い合せフォーム</title>

</head>

<body>

<h2>お問い合わせ内容を入力してください</h2>

<form action=”check_inquiryutf.php” method=”POST”>

<p><span style=”color:darkred;font-size:10px”>■ </span>お問い合せタイトル</p>

<br>

<input type=”text” name=”title” size=”50″>

<br>

<br>

<p><span style=”color:darkred;font-size:10px”>■ </span>お問い合せ内容</p>

<br>

<textarea name=”message” cols=”40″ rows=”5″>

お問い合わせ内容をできるだけ具体的に記述してください。

</textarea>

<br>

<br>

<input type=”submit” value=”お問い合わせ内容の確認”>

</form>

</body>

</html>

(2) check_inquiry.php

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8“>

<title>お問い合せフォーム</title>

</head>

<body>

<h2>お問い合わせ内容を入力してください</h2>

<form action=”check_inquiryutf.php” method=”POST”>

<p><span style=”color:darkred;font-size:10px”>■ </span>お問い合せタイトル</p>

<br>

<input type=”text” name=”title” size=”50″>

<br>

<br>

<p><span style=”color:darkred;font-size:10px”>■ </span>お問い合せ内容</p>

<br>

<textarea name=”message” cols=”40″ rows=”5″>

お問い合わせ内容をできるだけ具体的に記述してください。

</textarea>

<br>

<br>

<input type=”submit” value=”お問い合わせ内容の確認”>

</form>

</body>

</html>

正常に表示された。

Webサーバーには、Shift-JISのままアップした見た。

http://takesawa.jp/validate/inquiry/inquiry.html

正常に表示されている。

サーバーによっては(PHPのバージョンだと思うのだが)、文字コードを気にしなくても良いようだ。

http://takesawa.jp/validate/

このページで文字コードの違いをテストしている。