こんにちはありんこです。
最近パーフェクトPHPをやっているのですが、mysqlでデータを保存した時に文字化けしてしまって困ったので書いておきます。
TL;DR
PDOをnewする時に、charsetをちゃんと設定しましょう。
$dbConnection = new PDO('mysql:host=db;dbname=online_bbs;charset=utf8', 'docker', 'docker');
どんな感じに困った?
Docker環境で進めているのですが、MySQLの文字コードはちゃんとutf8mb4にしているし、
PHPの文字コードもUTF−8(多分)だし、
HTMLも<meta charset="UTF-8">
ってしているしで詰んだって感じでした。
原因
パーフェクトPHPがPHP5系で書かれていて、自分がパーフェクトPHPをPHP8系のバージョンで進めているので使用できる関数に差があったのが原因。
というかPHP7系からmysql系のモジュールが、MySQLiかPDO_MYSQLに置き換わって、削除されたらしい。
例えば、mysql_connect()
はPDO_MySQL
だと、new PDO();
といった感じ。
で、ドキュメントをちゃんと見たら例のとこに書いてあった。
どんな感じになるの?
// DB接続
$dbConnection = new PDO('mysql:host=db;dbname=online_bbs;charset=utf8', 'docker', 'docker');
// ヒアドキュメントでSQL記述
$postIndexSql = <<<SQL
SELECT
*
FROM
posts
ORDER BY
created_at DESC
SQL;
// クエリ実行
$postIndexResult = $dbConnection->query($postIndexSql);
// クエリ成功かつ0以上結果が返ってきた場合
if ($postIndexResult !== false && $postIndexResult->rowCount() > 0){
// 一行ずつfetch
while ($post = $postIndexResult->fetch()) {
// プロパティ出力
echo $post['name'];
}
}
まとめ
古いバージョンで書かれているPHPも、しっかりとドキュメント見れば同じように書き換えられる!
困ったらドキュメントを見よう!
ちなみに
パーフェクトPHPは下記のような環境で進めています!