【PHP, MySQL】日本語をデータベース格納する時に文字化けが起こる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bonbo
記事: 4
登録日時: 6年前
住所: 千葉県

【PHP, MySQL】日本語をデータベース格納する時に文字化けが起こる

#1

投稿記事 by bonbo » 6年前

たびたび失礼します.bonboと申します.
PHPMyAdminのデータベースに関して質問させていただきます.
PHPで,データベースにアカウントを作成するコードを組みました.

コード:

<!DOCTYPE html>
<?php
header('Content-Type: text/html; charset=UTF-8');
echo '文字化けしない';
?>
</br>
<?php
//mysqliクラスのオブジェクトを作成
$mysqli = new mysqli('xxx.xxx.xxx.xxx', '**********', '**********', '*********');
//エラーが発生したら
if ($mysqli->connect_error){
  print("接続失敗:" . $mysqli->connect_error);
  exit();
}
$flag_name=0;
?>
</br>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>テストページ</title>
  </head>
  <body>
    <?php
      //_pass_wordがPOSTされているなら
      if(isset($_POST["_pass_word"])&&$_POST["_pass_word"]!=NULL){
        //エスケープしてから表示
        $pen_name = htmlspecialchars($_POST["pen_name"]);
        $mail = htmlspecialchars($_POST["mail"]);
        $_pass_word = htmlspecialchars($_POST["_pass_word"]);
        print("登録名「 ${pen_name} 」");
        print("メールアドレス「 ${mail} 」");
        print("パスワード「 ${_pass_word} 」です。");
        
		//プリペアドステートメントを作成 ユーザ入力を使用する箇所は?にしておく
		$stmt = $mysqli->prepare("INSERT INTO datas (pen_name, mail_address, pass_word) VALUES (?, ?, ?)");
		//?の位置に値を割り当てる
		$stmt->bind_param('sss', $_POST["pen_name"], $_POST["mail"], $_POST["_pass_word"]);
		//実行
		$stmt->execute();
      } else {
    ?>
        <p>コメントしてください。</p>
		<form method="POST" action="post.php">
			なまえ  <input value="ほげhogeほげ" name="pen_name" /></br>
			登録アドレス<input name="mail" /></br>
			パスワード <input name="_pass_word" /></br>
			<input type="submit" value="送信" /></br>
		</form>
    <?php
      }
    ?>
  </body>
</html>
コードからPHPMyAdminに接続し,データベースに情報を保存することはできたのですが,
データベースに日本語を送信した際,文字化けが起こってしまいます.
例えば,
「ほげhogeほげ」

「ほげhogeほげ」
になってしまいます.

datesのpen_nameという要素は
text型
照合順序はutf8_general_ci
です.(utf8_unicode_ciにしても結果は同じでした)

この文字化けを解決したいです.

[知りたいこと]
・文字コードは何になっているのか
ほげ→ほげになる文字コードは何か
・どの段階でUTF-8じゃなくなってるか
post.php上での文字コードはUTF-8で
phpMyAdmin上の文字コードはUTF-8(のはず)
どの段階で文字コードが換わってしまったのか.
・my.iniの場所(そもそも在るのか?)
どうやらxamppでphpmyadminを動かしている方はxampp/mysql/bin/my.ini
などにあるmy.iniを書き換えることで解決しているようなのですが,
私はxamppを使っていないのでmy.iniがどこに在るのか,そもそも在るのかどうか
わかりません.

[ 環境 ]
OS:windows7(32bit)
サーバーはさくらVPSを利用しています.
コンソールの操作,アップロード等はRLogin(32bit)を使っています.
PHPファイルはサクラエディタで編集し、すべてUTF-8で保存しました.
ブラウザはInternet ExplororとGoogle Chlomeで試しました.
最後に編集したユーザー bonbo on 2017年9月08日(金) 09:06 [ 編集 1 回目 ]

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: 【PHP, MySQL】日本語をデータベース格納する時に文字化けが起こる

#2

投稿記事 by YuO » 6年前

mysqli::set_charsetを呼んでみてください。
対になる,mysqli::get_charsetで現在のキャラセットを取得できるようです。
# 普段PDOしか使わないので。
bonbo さんが書きました:・my.iniの場所(そもそも在るのか?)
とりあえず,CentOS 6や7にMySQLの公式Yum Repositoryのrpmを使ってMySQLを入れた場合,/etc/my.cnfが設定ファイルになります。
# CentOS 6のBaseに入っているMySQLでも同じ。
bonbo さんが書きました:サーバーはさくらVPSを利用しています.
さくらVPSとだけ書かれても,OSなどの情報がわかりません。
CentOSなどのLinuxなのかFreeBSDなのか,MySQLはOSのリポジトリから入れたのかMySQL公式のリポジトリから入れたのかソースをコンパイルしたのか,
などを書いた方が良いですよ。

bonbo
記事: 4
登録日時: 6年前
住所: 千葉県

Re: 【PHP, MySQL】日本語をデータベース格納する時に文字化けが起こる

#3

投稿記事 by bonbo » 6年前

Yuoさん
ありがとうございます.
環境について,記載が足りず申し訳ありません.
補足ですが,
OSはCentOS 6
です.
mysqlはコンソール上で
yum install mysql-server
でインストールしました.

my.cnfは見つかりました.

結果としてはphpMyAdmin上の表示は化けたままだったのですが,
データベース上からの読み込みをして,UTF-8で表示してみても
文字化けしないことがわかりました.
プログラムの動作には問題なかったため,ひとまずこのまま進行することとしました.

ありがとうございました.

Math

Re: 【PHP, MySQL】日本語をデータベース格納する時に文字化けが起こる

#4

投稿記事 by Math » 6年前

>ブラウザはInternet ExplororとGoogle Chlomeで試しました
表示ー>エンコードを
Unicode(UTF-8)から日本語(SHIFT-JIS)にすると正しく表示されました。(日本語自動選択を選ぶと変わる)

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: 【PHP, MySQL】日本語をデータベース格納する時に文字化けが起こる

#5

投稿記事 by naohiro19 » 6年前

htmlspecialchars関数はあくまで「HTMLに出力するための専用の関数」であり、
MySQLやPostgreSQLなどのリレーショナルデータベースの入力に対して使うものでありません
また明示されたプログラムはSQLインジェクションの対策になっていません。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 【PHP, MySQL】日本語をデータベース格納する時に文字化けが起こる

#6

投稿記事 by みけCAT » 6年前

naohiro19 さんが書きました:htmlspecialchars関数はあくまで「HTMLに出力するための専用の関数」であり、
MySQLやPostgreSQLなどのリレーショナルデータベースの入力に対して使うものでありません
ここに提示されているプログラムにはhtmlspecialchars関数をリレーショナルデータベースの入力に対して使っている部分は見当たらず、ここでわざわざ強調するのは混乱を招く気がします。
この投稿の意図は何でしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る