ラスボス・文字化けオバケを魔法の呪文で倒した話
今週ようやく会社HP作成が完了しました(*°ω°*)
最後の最後にとんでもないラスボスが現れて、てんてこ舞いに...笑
未来の自分のために、ラスボスとの戦いのここに記録をしておきます。
【問題】
・お問い合わせフォームから送ったデータが、MySQL上で文字化け(åがたくさん出てくる)してしまう。
なお、お問い合わせフォームを作り方はドットインストールさんを参考にしました。
お問合せ管理システムを作ろう (全21回) - プログラミングならドットインストール
【てこづったこと】
・なにも考えずググッて出てきたものを手当たり次第試したことが失敗でした。肝心な目線が抜けていたのです。それは、今使っているphpやMySQLのヴァージョンはいくつなのか?という視点です。会社サーバー内のphpが結構古いヴァージョンだったので、そこが盲点でした。どうやらphpは5.3.6を境に仕様がガラリと変わったみたいですね。
PHP 5.3.6より前のバージョンの PDO MySQL で charset を指定する - Qiita
php 5.3.3とにらめっこしていた私は、見事文字化けオバケの餌食になりました...とほほ。これからはちゃんとヴァージョン確認してググりたいと思います。
【魔法の呪文】
ラスボス退治に使った魔法の呪文はこちらに書いてありました。
skip-character-set-client-handshake
"クライアントがどういう形で要求してこようがUTF-8で返答する"
問答無用で叩き切る感じがすごいコマンドですね。こちらを追記したら無事MySQLが日本語になりました。
【具体的に書いたコード】
(注1: php 5.3.3, MySQL 5.1.73を使っています)
(注2: ドットインストールに則ってファイルを作っています)
function.php
<?php
function connectDb( ) {
try {
array(PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/my.cnf',
PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => 'php',
);
return new PDO(DSN, DB_USER, DB_PASSWORD);
} catch (PDOException $e) {
echo $e->getMessage();
exit;
}
}
(以下の関数は省略)
?>
PDOについてはこちらに書いてあります。
/etc/my.cnfのphpグループを読み込めという命令を、ドットインストールで書かれているプログラムに追加しました。
そして、my.cnfファイルを以下のように書きました。
/etc/my.cnf
[mysqld]
character-set-server = utf8
skip-character-set-client-handshake
を、「symbolic-links=0」の下に追記
[php]
default-character-set = utf8
connect-timeout = 1
の項目を最後に追加。
こうしたら日本語でMySQLにデータが入るようになりました。
大好きな漫画でテスト投稿してみました。
解決してとても嬉しかったです。
引き続きプログラミングの勉強頑張ります(`・ω・)