質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

phpでMariaDBからデータベースを取得して、日本語の表示が上手くいきません。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,160

前提・実現したいこと

MariaDBにあるデータベースをPHPで取得してブラウザで表示しようとしています。
データベースはサーバーにwindowsからTeraTermでssh接続してコマンドラインで作成しました。

発生している問題・エラーメッセージ

日本語で入力した部分だけが?????と表示されます。

該当のソースコード

<!DOCTYPE html>
<html>
    <head>
        <meta charset=”UTF-8">
        <title>Test Query</title>
    </head>
        <body>
            <?php
                require_once 'login.php';
                $db_server = mysql_connect($db_hostname, $db_username, $db_password);

                if(!$db_server) die("Unable to connect to MySQL: " . mysql_error());

                mysql_select_db($db_database)
                 or die("Unable to select database: " . mysql_error());

                $query = "SELECT * FROM classics";
                $result = mysql_query($query);

                if(!$result) die ("Database access failed: " . mysql_error());

                $rows = mysql_num_rows($result);

                for($j = 0; $j < $rows; ++$j){
                    echo 'Author: ' . mysql_result($result, $j, 'author') . '<br/>';
                    echo 'Title: ' . mysql_result($result, $j, 'title') . '<br/>';
                    echo 'Category: ' . mysql_result($result, $j, 'category') . '<br/>';
                    echo 'Year: ' . mysql_result($result, $j, 'year') . '<br/>';
                    echo 'ISBN: ' . mysql_result($result, $j, 'isbn') . '<br/>';
                }
            ?>
        </body>
</html>

試したこと

/etc/my.cnf.d/server.cnf
の[mysqld]に
character-set-server=utf8
を追加して、
show variables like 'char%';
でutf8になっていることを確認しました。
また、teratermの端末設定の「漢字-送信」もUTF-8になっていることを確認しました。

補足情報(言語/FW/ツール等のバージョンなど)

サーバーはCentOS7を使用
データベースは5.5.47-MariaDB

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/08/06 21:28

    コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。

    キャンセル

  • kei344

    2016/08/06 21:45

    PHPのコードに日本語を入れた場合、それも文字化けしますか?

    キャンセル

  • skill_heartnet

    2016/08/06 21:53

    PHPコードに直接日本語をechoで表示するときちんと日本語で出力されます。

    キャンセル

  • asahina_dev

    2016/08/06 22:32

    特に関係のないはずだからこちらへ。

    charset の形式は html5 にあわせよう。

    キャンセル

回答 3

+3

解決されたようですが、mysql_系関数は非推奨になっています。MySQLi か PDO をご利用ください。

【PHP: mysql_connect - Manual】
http://php.net/manual/ja/function.mysql-connect.php

警告 この拡張モジュールは PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除されました。 MySQLi あるいは PDO_MySQL を使うべきです。

【PHPでデータベースに接続するときのまとめ - Qiita】
http://qiita.com/mpyw/items/b00b72c5c95aac573b71


本件とは関係有りませんが、ダブルクオートが全角になっています。

<meta charset=”UTF-8">

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

require_once 'login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);

mysql_set_charset('utf8'); // <- 文字コード指定する

if (!$db_server) {
    $err = "Unable to connect to MySQL: " . mysql_error();
}

if (mysql_select_db($db_database)) {
    $err = "Unable to select database: " . mysql_error();
}
$query = "SELECT * FROM classics";
$result = mysql_query($query);

if (!$result) {
    $err = "Database access failed: " . mysql_error();
}
$rows = mysql_num_rows($result);
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Test Query</title>
    </head>
    <body>
        <?php
        if (isset($err)) {
            echo $err;
        }
        ?>
        <?php
        for ($j = 0; $j < $rows; ++$j) {
            echo 'Author: ' . mysql_result($result, $j, 'author') . '<br/>';
            echo 'Title: ' . mysql_result($result, $j, 'title') . '<br/>';
            echo 'Category: ' . mysql_result($result, $j, 'category') . '<br/>';
            echo 'Year: ' . mysql_result($result, $j, 'year') . '<br/>';
            echo 'ISBN: ' . mysql_result($result, $j, 'isbn') . '<br/>';
        }
        ?>
    </body>
</html>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/06 22:49

    解決しました!ありがとうございます!

    キャンセル

  • 2016/08/06 22:49

    mysql_* 関数はできるだけ使用は避けましょう。

    キャンセル

+1

MySQLの情報ですが、以下が参考になると思います。

mysqlで文字コードをutf8にセットする

mysqlの文字コードはチェックする場所が多いので原因を突き止めるのに毎回苦労します。

だそうです、一度確認されてみてはいかがですか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/06 22:20

    確認しましたが、全てutf8になっており問題ありませんでした…

    キャンセル

  • 2016/08/06 22:25

    なるほど、では、ファイルの文字コードは、UTF-8になっていますか?
    というのとphp.ini 関連かなぁ? そこは確認ずみですか?


    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る