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

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

ただいまの
回答率

88.77%

foreachのデータを表示させたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 696

ariiiiiga

score 46

前提・実現したいこと

予約機能を作っています。店側の予約確認画面を作っているのですが、HTML内のforeachでデータを取得できません。
原因は$valueがNULLになっているからだと思うのですが、なぜNULLになっているのかがわからず苦戦しています。
*データベース接続確認済み
*reserve_shop_id = 2
データベースに2のデータは入っています、

$value
var_dump($value);
→NULL

$reserve_result
var_dump($reserve_result);
→string(47) "SELECT * FROM reserve WHERE reserve_shop_id = 2"

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

var_dump($value);実行時に
Notice: Undefined variable: value in C:\xampp\htdocs\shop_home.php on line 107

該当のソースコード

<?php
error_reporting(E_ALL);
ini_set("display_errors",1);
define('PAGE_LIMIT', 10);
session_start();
try {
$pdo = new PDO('mysql:host=localhost;dbname=reserve;charset=utf8','root','',
array(PDO::ATTR_EMULATE_PREPARES => false));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if(!isset($_SESSION['user'])) {
  header("Location: shop_index.php");
}

// ユーザーIDからユーザー名を取り出す
$query = "SELECT * FROM shop WHERE shop_id=".$_SESSION['user']."";
$result = $pdo->query($query);

if (!$result) {
  print('ユーザークエリーが失敗しました。' . $pdo->error);
  $pdo->close();
  exit();
}

//ユーザー情報の取り出し
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
  $shop_name = $row['shop_name'];
  $shop_id = $row['shop_id'];
}

// shopIDからshop名を取り出す
$reserve_query = "SELECT * FROM reserve WHERE reserve_shop_id = ".$shop_id;
$reserve_result = $pdo->query($reserve_query);

if (!$reserve_result) {
  print('予約クエリーが失敗しました。' . $pdo->error);
  $pdo->close();
  exit();
}

// ユーザー情報の取り出し
$arr_shop = [];
while ($rows = $reserve_result->fetch(PDO::FETCH_ASSOC)) {
  $arr_shop[] = [
    'reserve_shop_id' => $rows['reserve_shop_id'],
    'count' => $rows['count'],
    'time' => $rows['time'],
    'reserve_comment' => $rows['reserve_comment'],
    'reserve_time' => $rows['reserve_time'],
  ];
}
// Total件数
$totalRow = $pdo->query("SELECT FOUND_ROWS() as total");
$all = $totalRow->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
   var_dump($reserve_query);
   die();
 }
?>

<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>店舗側マイページ</title>
<link rel="stylesheet" href="style.css">
<!-- Bootstrap読み込み(スタイリングのため) -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
</head>
</head>
  <body>
    <div class="col-xs-6 col-xs-offset-3" style="text-align:center;">
      <div class="header-right">
        <p><?php echo $shop_name; ?>ログイン中</p>
        <a href="shop_logout.php?logout">ログアウト</a>
      </div>

      <div class="main">
        <div class="col-xs-12" >
          <p class="alert alert-success">予約数<?= number_format($all['total']) ?></p>
          <table class="table">
            <thead>
              <tr>
                <th>人数</th>
                <th>時間</th>
                <th>コメント</th>
                <th>予約時間</th>
              </tr>
            </thead>
            <tbody>

              <?php foreach($reserve_result as $key => $value) : ?> ←この$value
              <tr>
                <td><?= $value['count'] ?></td>
                <td><?= $value['time'] ?></td>
                <td><?= $value['reserve_comment'] ?></td>
                <td><?= $value['reserve_time'] ?></td>
              <tr>
              <?php endforeach; ?>
              <?php var_dump($value); ?>
            </tbody>
          </table>

        </div>
      </div>
    </div>
  </body>
</html>

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • ockeghem

    2019/04/20 19:24

    var_dump($value) が含まれたソースコードを見せてください

    キャンセル

  • ariiiiiga

    2019/04/20 19:28

    endforeachの下に追加しました。

    キャンセル

  • m.ts10806

    2019/04/20 19:29

    各SQLがphpからではなくDBに直接実行した場合に正しく情報とれてるか確認してください。DB定義やデータが提示されてない以上、確認できるのは質問者さんだけです

    キャンセル

  • m.ts10806

    2019/04/20 20:25

    catchで$reserve_queryをvar_dumpしても本来確認すべき情報は何も得られないので$eをvar_dumpしてください(詳しくはphpマニュアル参照)

    キャンセル

回答 3

+4

PDOStatement::fetch
は上記説明通り「 結果セットから次の行を取得する 」です。
fetchを1度だけ実行すると「次の行」にPDOStatementが持つ情報がうつります。

もうちょっと簡潔に説明すると「1回実行すると1行目のデータが取得できて1行目のデータはなくなる」
ことになります。

コードを見ますと$reserve_resultは既に下記が実行されてますね。

// ユーザー情報の取り出し
$arr_shop = [];
while ($rows = $reserve_result->fetch(PDO::FETCH_ASSOC)) {

whileを利用すると「データが取得できなくなるまで」実行し続けます。

ということは、whileを抜けた時点で$reserve_resultが持っていたデータは全てなくなっています

html内に$reserve_resultをforeachが実行されていますが、その時点ではwhileにfetchにて取り出された後なので、データは空っぽです。
空っぽなのでforeachに入りません。入らないということはforeachで受け取っている$valueは一回も定義される機会がありません。

whileで$arr_shopという配列変数にデータ入れられてますが、こちらを後で使いたいがために準備したのではないですか?
whileでループしているデータとその中で詰め込んでそのあとループさせるデータが同じ取得先なので2回ループするのは無駄でしかないですが、そこはそういう仕様(別で使いたい理由がある?)と勝手に理解してあえて突っ込みませんが、自身で用意した$arr_shopを使ったら良いかと。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+3

var_dump($value);を置く場所がおかしいです。示して頂いたソースはこれですが、これだと $reserve_result が空の場合、$valueには何も代入されないので、$valueが未定義だというエラーになります。

              <?php foreach($reserve_result as $key => $value) : ?> ←この$value
              <tr>
                <td><?= $value['count'] ?></td>
                <td><?= $value['time'] ?></td>
                <td><?= $value['reserve_comment'] ?></td>
                <td><?= $value['reserve_time'] ?></td>
              <tr>
              <?php endforeach; ?>
              <?php var_dump($value); ?>

var_dump($value);を置くなら foreach(... の直下ですが、おそらく$reserve_resultが空なので何も表示されないでしょう。なので、foreachの前に $reserve_result の値を表示させるべきですね。

              <?php var_dump($reserve_result); // これを追加 ?>
              <?php foreach($reserve_result as $key => $value) : ?> ←この$value
         // 以下略

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/20 20:53

    var_dump($reserve_result);の結果ですよね?
    上記通りやっていますが、
    object(PDOStatement)#3 (1) { ["queryString"]=> string(47) "SELECT * FROM reserve WHERE reserve_shop_id = 2" }
    が入っています。

    キャンセル

  • 2019/04/20 21:16

    その結果は初めて示されたものですよね。質問文にある内容は、String型のSQL文のみですし。結果を見せていただかないと判断ができません。
    それはともかく、mts10806さんが回答された内容が正解ではないですか?

    キャンセル

  • 2019/04/21 05:29

    >~が入っています。
    それが欲しい結果かどうかは一考いただきたく。
    ただなんでもかんでも入ってればいいというわけではないですよ。インスタンス化したオブジェクトなので明示的に空にしなければobjectで実行したqueryStringが保持されているのは当たり前と言えば当たり前です。

    キャンセル

checkベストアンサー

0

mts10806さんの回答のように$arr_shopから出力すればokかと。

<?php foreach($reserve_result as $key => $value) : ?><?php foreach($arr_shop as $key => $value) : ?>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/23 17:23

    ありがとうございます!

    キャンセル

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

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

関連した質問

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