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

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

ただいまの
回答率

88.92%

MySQLから取得してきた値が文字化けしてしまいます

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,004

newyee

score 155

※すみません。 ご質問させていただいた後、var_dumpを消してみて、実行してみましたら文字化けせずにできていました。。。
ですが、なぜ$drink_name =  htmlspecialchars($row['drink_name'],ENT_QUOTES, 'UTF-8');の後にvar_dumpしたら文字化けしてしまうかが分からないです...

現在phpの勉強で自動販売機作成ツールというのを作成しているのですが、phpMyAdminに接続し、MySQLから取得してきた値が文字化けしてしまいます。
自動販売機作成ツールに関しましては、3つのファイル(管理ページ,購入ページ,購入結果ページ)に分けて作成しています。
問題の文字化けが起きてしまっている部分に関しましては、購入結果ページになります。
以下が現在作成途中の購入結果ページ(result.php)になります

<?php
date_default_timezone_set('Asia/Tokyo');
const HOST = '';
const DB_NAME = '';
const USER_NAME = '';
const PASSWORD = '';
$err_msg = array();
$change = 0;
$drink_name = '';
$date = date('Y/m/d H:i:s');
$drink_info_list = array();

if(($link = mysqli_connect(HOST,USER_NAME,PASSWORD,DB_NAME)) !== FALSE){
    mysqli_set_charset($link,'UTF8');

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $stock_numbers = (int)$_POST['stock_numbers'];
        $amount_money = $_POST['amount_money'];  

        //入力値チェック
        if($_POST['selected_drink'] === ''){
            $err_msg[] = 'ドリンクを指定して下さい';
        }
        if(ctype_digit($amount_money) === FALSE){  //ctype_digit:string型以外はfalseになる。
            $err_msg[] = '金額は整数で入力してください';
        }

        if($price > $amount_money){
            $err_msg[] = '金額が足りません';
        }
        $amount_money = (int)$amount_money;


        //エラーがなかった場合
        if (count($err_msg) === 0){
            $drink_id = (int)$_POST['drink_id'];

            $sql = 'SELECT drink_name,price FROM drink_info_table WHERE drink_id = ' . $drink_id;

            if($result = mysqli_query($link,$sql)){
                while($row = mysqli_fetch_assoc($result)){ //while文について質問。

                    $price =  htmlspecialchars($row['price'],ENT_QUOTES, 'UTF-8');
                    $drink_name =  htmlspecialchars($row['drink_name'],ENT_QUOTES, 'UTF-8');
                    var_dump($drink_name);exit();
                }
            }else{
                $err_msg[] = 'drink_info_table:SELECTエラー:'.$sql;
            }



            if($amount_money > $price){
                $change = $amount_money - $price;
            }

            $sql = 'UPDATE drink_stock_table SET stock_number = ' . $stock_numbers . '- 1 WHERE drink_id = ' . $drink_id;
            if(mysqli_query($link,$sql) === FALSE){
                $err_msg[] = 'drink_stock_table: UPDATEエラー' . $sql; 
            }

            $sql = 'INSERT INTO drink_history_table(drink_id,bought_date) VALUES (' . $drink_id . ',\''. $date .'\')';
            if(mysqli_query($link,$sql) === FALSE){
                $err_msg[] = 'drink_history_table: insertエラー' . $sql;
            }
            //var_dump($stock_numbers);exit();


        }

    }
}else{
    $err_msg[] = 'DB接続失敗';
}



?>


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>自動販売機結果</h1>
    <?php foreach($err_msg as $value){ ?>
        <p><?php echo $value; ?></p>
    <?php } ?>
    <?php if(count($err_msg) === 0){?>
        <p>がしゃん!【<?php echo $drink_name; ?>】が買えました! </p>
    <?php } ?>
    <?php if($change >= 1){ ?>
        <p>おつりは【<?php echo $change; ?>円】です</p>
    <?php } ?>
    <footer>
        <a href="index.php">戻る</a>
    </footer>
</body>
</html>


以下は購入ページ(index.php)となります。

<?php 
const HOST = '';
const DB_NAME = '';
const USER_NAME = '';
const PASSWORD = '';
$drink_info_list = array();

//DB接続
if(($link = mysqli_connect(HOST,USER_NAME,PASSWORD,DB_NAME)) !== FALSE){
    mysqli_set_charset($link,'UTF8');
    // sql where にて 以下の条件を追加すること。
    // 1.ステータスが公開になっているもののみを表示。
    // 2.在庫数が1以上の商品のみ。
    $sql = 'SELECT drink_info_table.drink_id,drink_name,price,status,stock_number
            FROM drink_info_table
            JOIN drink_stock_table
            ON drink_info_table.drink_id = drink_stock_table.drink_id
            WHERE status = 1 AND stock_number >= 1;'; 


    if($result = mysqli_query($link,$sql)){
        $i = 0;
        while($row = mysqli_fetch_assoc($result)){
            $drink_info_list[$i]['drink_id'] =  htmlspecialchars($row['drink_id'],ENT_QUOTES, 'UTF-8');
            $drink_info_list[$i]['drink_name'] =  htmlspecialchars($row['drink_name'],ENT_QUOTES, 'UTF-8');
            $drink_info_list[$i]['price'] =  htmlspecialchars($row['price'],ENT_QUOTES, 'UTF-8');
            $drink_info_list[$i]['status'] =  htmlspecialchars($row['status'],ENT_QUOTES, 'UTF-8');
            $drink_info_list[$i]['stock_number'] = htmlspecialchars($row['stock_number'],ENT_QUOTES, 'UTF-8');

            $i++;
        }

        // var_dump($drink_info_list);exit();
    }



}   

?>


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>自動販売機</h1>

        <form action="result.php" method="post">
            <div>金額<input type="text" name="amount_money"></div>
            <!--画像を表示すること-->
            <?php foreach($drink_info_list as $values){ ?>
                <img src="img/<?php echo $values['drink_id'] ;?>.pic">
                <?php echo $values['drink_name']; ?>
                <?php echo $values['price']; ?>

                <?php if((int)$values['stock_number'] === 0){ ?>
                    <p>売り切れ</p>
                <?php } else { ?>
                    <input type="radio" name="selected_drink">
                <?php } ?>

            <?php } ?>        

            <p><input type="submit" value="■□■□■購入■□■□■"></p>
            <input type="hidden" name="stock_numbers" value="<?php echo $values['stock_number']; ?>">
            <input type="hidden" name="drink_id" value="<?php echo $values['drink_id'];?>">

        </form>

</body>
</html>


result.phpにおきまして、 mysqli_set_charset($link,'UTF8');←を書き忘れたままvar_dump($drink_name)とした所、中身が???となっていたので、mysqli_set_charset($link,'UTF8')を付け足したら今度は文字化けしてしまいました...
どなたか教えて下さる方いましたら、ご教授下さい。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • aro10

    2017/08/24 22:03

    phpMyAdminはPHP製のWebベースのMySQL用のGUI管理ツールの事ですので、質問内容はmysqli_connect関数を利用している関係からMySQLから取得してきた値とした方がより適切な回答を得られるかと思います。

    キャンセル

  • newyee

    2017/08/24 22:11

    ご指摘感謝します。早速修正させていただきます。

    キャンセル

回答 1

-1

質問させていただいたタイトルの問題は解決できたのですが、説明欄に追記させていただきましたvar_dumpしたら何故文字化けしてしまうのかが分からない状態です...

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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