合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: bonbo
[URL]
ぴよぴよ(584 ポイント)
Date: 2017年9月07日(木) 13:27
No: 1
(OFFLINE)

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

たびたび失礼します.bonboと申します.
PHPMyAdminのデータベースに関して質問させていただきます.
PHPで,データベースにアカウントを作成するコードを組みました.
コード[PHP]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!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 [ 2017年9月08日(金) 09:06 ], 累計 1 回

Name: YuO
[URL]
ハッカー(153,404 ポイント)
Date: 2017年9月07日(木) 23:16
No: 2
(OFFLINE)

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

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公式のリポジトリから入れたのかソースをコンパイルしたのか,
などを書いた方が良いですよ。

Name: bonbo
[URL]
ぴよぴよ(584 ポイント)
Date: 2017年9月08日(金) 09:02
No: 3
(OFFLINE)

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

[解決!]

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

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

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

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

Name: Math
[URL]
Date: 2017年9月09日(土) 07:59
No: 4
(OFFLINE)

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

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[9人]