2020年のブログ最終更新は12/23(水)の予定です

PHP,MySQL 間の文字化け問題

この記事は約3分で読めます。

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

こんにちは、さちです!

前回の PHP と MySQL の連携について書きましたが
今回はその続編を書こうと思います。
続きを書くというよりは自分の失敗談の続きです(笑)
もし、この記事を書くことで他の方のお役に立てられれば幸いです!(^^)

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

ファイル名: test.php

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

<?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>¥n");
}

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って何だろうというところからすでに疑問です…
Googleマップ API の API とは関係あるのかなぁ?

セキュリティのことはないがしろにはできないし
早いうちに勉強しなくてはいけませんね…。


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

コメント

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