本日、就職先(現状:内定)の同期からWEBのことでたたき起こされた。
内容はMySQLからPHPに値引っ張ってきたときに文字化けが生じるとのこと。
過去に数100回ほど頭を悩まされていて解決策をしっていたので紹介
SQLのSELECT文で値を引っ張る前にデータベース側のエンコードをいじる。
SET NAMES utf8
これで解決
と思ったら
「Unknown system variable ‘NAMES’」って言われたらしい
んなばかなとおもってMySQLのバージョンを聞いてみると「mysql-4.0.20c-win」を利用しているとのこと。
調べてみるとMySQL4.0以前と4.1以降ではエンコードの仕様に断絶があるらしく4.0以前はサーバー全体での文字コード定義しかできないらしい。
というわけでSET NAMESは当然使えない。
ならばPHP側でmb_convert_encoding()を使ってSQLをEUC-JPに、返された値を同様に今度はUTF8に変換すればいい。
つまり
$sql = "SELECT `field1` from `Table`"; $sql = mb_convert_encoding($sql, 'EUC-JP'); $res = mysql_query($sql);
こんな感じでSQLを発行し、
while($data = mysql_fetch_array($res,MYSQL_ASSOC)){
$field1 = mb_convert_encoding($data['field1'], 'UTF8');
//処理
}
という風にする。
しかし、ここまでもまた問題が。
「Fatal error: Call to undefined function: mb_convert_encoding()」
mb_convert_encoding()が未定義の関数とかほざいてくるんですね。
そんなバカなことがあるかーっておもってPHPのバージョンを聞くとPHP4.3だとか。
なんでこうも古いのばっか使ってるのかと思ったら古い参考書についてた古いCDを使って開発環境を整えてしまったのが原因らしい。
まぁよくありそうな現象やなぁと思いながらも私、堪忍袋の緒がきれてしまいました。
Apache,MySQL,PHPをアンスコしてXAMPPで開発環境整えさせました。
強引ですいません。
アンスコウィザードのあるApacheと違ってMySQLの削除が曲者なので紹介しておきます。
まずCドライブ直下にMySQLフォルダがあると過程します。
MySQLは事前に停止しておいてください。
停止方法(cmd)
# net stop mysql
削除方法(cmd)
# CD C:\mysql\bin # mysqld –remove MySQL
これでサクシードほにゃららってのが出たら一応アンスコに成功してます。
ただ、my.iniというmysqlの設定ファイルがサーバー内に残ってる可能性があるから
スタート→検索→[my.ini]でWINDOWSファイルやSYSTEMファイル以外の場所でmy.iniが見つかったら削除しといてください。
これでアンスコ完了です。
PHPに関しては別に設置ディレクトリさえ違えば競合するものではないので適当に削除してくれていいです。
