PHP,MySQL 間の文字化け問題

この記事は約3分で読めます。
記事内に広告が含まれています

サーバ管理って難しい(3)

こんにちは、さちです!

前回の PHP と MySQL の連携について書きましたが、今回はその続編を書こうと思います。要するに自分の失敗談の続きです。

もし、この記事を書くことで他の方のお役に立てられれば幸いです!

前回のプログラムをもう一度見てみましょう。

<?php
$con = mysql_connect(サーバ名, ユーザ名, パスワード) ;
mysql_select_db(データベース名);

mysql_query("SET NAMES eucjpms;");
$re = mysql_query("SQL",$con);

echo("<table border=¥"1¥">");

while($array = mysql_fetch_array($re)) {
echo("<tr><td>".$array[0]."</td><td>".$array[1]."</td></tr>¥");
}

echo("</table>");
?>

今回は5行目に注目です。

「MySQL」から データを取り出すクエリを実行する前に、SET NAMES eucjpms; というクエリが実行されています。実は、前回は触れていませんでしたが、この行はこっそりと付けていました。

このクエリはデータベース「MySQL」で使用している「文字コード」を、コンピュータに教えてあげているものなんです。

実際に私の使っているサーバでこの一行がないと、test.php の実行結果は次のようになってしまいます。

?? ???
?? ????
?? ???

文字化けしてますね。

コンピュータが処理する文字コードと MySQL の文字コードが一致しないために、このようなことが起きてしまいます。(ちなみに、半角英数は文字化けしません。日本語のみ文字化けします)

この test.php の場合だと、MySQL は EUC-JP で動いているという仮定になっているので、文字化けを回避するために 「ujis」 と記述しています。

文字コードと記述方法をまとめてみます(完全に私の備忘記録ですがw)。

文字コード 記述方法
SHIFT-JIS sjis
EUC-JP ujis
UTF-8 utf8

使っている文字コードを ujis のところに代わりに記述してください。これで文字化けは解消です。

ただ、インターネットで検索をしてみたところ、どうも SET NAMES **** ; はセキュリティ的に危険という次のような記述を
ちらほら見かけました。

文字コードの指定にSET NAMESを使うとSQLインジェクションに脆弱になる場合があります。DBMSをアプリケーションから利用する場合、文字エンコーディング設定はSET NAMES(SET CLIENT_ENCODING等も)を使わずに必ずAPIを利用しましょう。

うーん、わからん……。まず、APIって何だろうというところからすでに疑問です。セキュリティのことはないがしろにはできないし、早いうちに勉強しなくてはいけませんね…。


<< 前へ | サーバ管理って難しい(3) | 次へ >>
サーバ管理って難しいTOPへ

コメント

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