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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

1447閲覧

配列に値をいれて結果を出力したい

ariiiiiga

総合スコア66

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/06/03 06:30

編集2019/06/04 09:37

前提・実現したいこと

ログイン機能がある予約サイトを作っています。
予約データを新しいものから順に表示させ、2個以上ある場合はページングで次へのようにページを移動して出力させたいのですが、現状$arr_reserveがNULLになってしまい出力ができていません。

色々調べましたが原因がわかりませんでした。
何が原因なのか教えて頂きたいです。
よろしくお願いいたします。
イメージ説明

該当のソースコード

エラーコード Notice: Undefined index: count in C:\xampp\htdocs\reserve\shop\shop_home.php on line 40
<?php error_reporting(E_ALL); ini_set("display_errors",1); define('PAGE_LIMIT', 2); try { session_start(); $pdo = new PDO('mysql:host=localhost;dbname=reserve;charset=utf8','root','',); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if(!isset($_SESSION["user"])) { header("Location: login.php"); } // ①ユーザーIDからユーザー名を取り出す $query = "SELECT * FROM shop WHERE shop_id=:shop_id"; $shop_stmt = $pdo->prepare($query); $shop_stmt->bindValue(':shop_id', $_SESSION['user'], PDO::PARAM_INT); $shop_stmt->execute(); // ショップ情報の取り出し $row = $shop_stmt->fetch(PDO::FETCH_ASSOC); $shop_id = $row['shop_id']; $shop_name = $row['shop_name']; $yesno = $row['yesno']; $shop_comment = $row['shop_comment']; // reserveテーブルのreserve_shop_idからshop名を取り出す $reserve_query = "SELECT * FROM reserve WHERE reserve_shop_id=:shop_id"; $reserve_stmt = $pdo->prepare($reserve_query); $reserve_stmt->bindValue(':shop_id', $shop_id, PDO::PARAM_INT); $reserve_stmt->execute(); $reserve_stmt->debugDumpParams(); //結果->SQL: [52] SELECT * FROM reserve WHERE reserve_shop_id=:shop_id Params: 1 Key: Name: [8] :shop_id paramno=0 name=[8] ":shop_id" is_param=1 param_type=1 //var_dump($shop_id); ->int(4) // reserveテーブルから予約情報の取り出し $arr_reserve = []; while ($row = $reserve_stmt->fetchAll(PDO::FETCH_ASSOC)) { $arr_reserve[] = [ 'count' => $row['count'],    <-エラー箇所 ]; } //var_dump($arr_reserve);->array(1) { [0]=> array(6) { ["count"]=> NULL ["time"]=> NULL} } // リクエストパラメータの取得 $search = filter_input(INPUT_GET, 'search'); $p = !is_numeric(filter_input(INPUT_GET, 'p')) ? 0 : filter_input(INPUT_GET, 'p'); $time = filter_input(INPUT_GET, 'time', FILTER_SANITIZE_SPECIAL_CHARS); $count = filter_input(INPUT_GET, 'count', FILTER_SANITIZE_SPECIAL_CHARS); // 取得開始位置 $offset = $p * PAGE_LIMIT; $sql = $pdo->prepare('select SQL_CALC_FOUND_ROWS * from reserve where reserve_shop_id=:shop_id order by reserve_time desc limit :limit offset :offset'); $sql->bindValue(':shop_id', $_SESSION["user"], PDO::PARAM_INT); $sql->bindValue(":offset", $offset, PDO::PARAM_INT); $sql->bindValue(":limit", PAGE_LIMIT, PDO::PARAM_INT); $sql->execute(); $result = $sql->fetchAll(); // Total件数 $totalRow = $pdo->query("SELECT FOUND_ROWS() as total"); $all = $totalRow->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { var_dump($e); die(); } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>店舗トップ</title> </head> <body> <div class="main"> <div class="container" style=""> <div class="row"> <div class="col-xl-8" style="margin-bottom:200px;"> <div class="main-left"> <?php if ( $all['total'] > 0 ) : ?> <p class="alert alert-success" style="text-align:center;">登録店舗数<?=htmlspecialchars(number_format($all['total']),ENT_QUOTES,'utf-8'); ?>件</p> <table class="table table-striped"> <thead> <tr> <th>人数</th> </tr> </thead> <tbody> <?php foreach($arr_reserve as $key => $value): ?> <tr> <td><?= htmlspecialchars($value['count'], ENT_QUOTES, 'UTF-8'); ?></td> <tr> <?php endforeach; ?> </tbody> </table> <!-- ページネーション --> <div class="paging_left" style="float:left;"> <?php if ( $p > 0 ) : ?> <a href="shop_home.php?shop_id=<?= $shop_id ?>search=1&count=<?= $count ?>&p=<?= $p-1 ?>" class="pull-left">戻る</a> <?php else : ?> <span class="pull-left" >最新</span> <?php endif; ?> </div> <div class="paging_right" style="float:right;"> <?php if ( $all['total'] - (PAGE_LIMIT * $p ) > PAGE_LIMIT ) : ?> <a href="shop_home.php?shop_id=<?= $shop_id ?>search=1&count=<?= $count ?>&p=<?= $p+1 ?>" class="pull-right">次へ</a> <?php else : ?> <span class="pull-right" >末尾</span> <?php endif; ?> </div> <?php else : ?> <p class="alert alert-danger">まだ予約がありません</p> <?php endif; ?> </div> </div> <div class="col-xl-4" style=""> <div class="main-right"> <div class="container" > <div class="yesno" style="background-color:;border-radius:10px;border:1px solid black;padding:20px 0;text-align:center;"> <p style=""><?php echo htmlspecialchars($shop_name, ENT_QUOTES, 'UTF-8'); ?> ログイン中</p> </div> </div> </div> </div> </div> </div> </div> </body> </html>

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/03 06:43

このままだとただのデバッグ依頼(作業依頼)です。なにがどうわからないのか、こういう仕組みだろうとコードを書いてみたものの期待と違ってこうなってしまった、などと詳しく説明したほうがよろしいかと。
m.ts10806

2019/06/03 09:59

おそらくご理解されていないかと思いますが、今の姿勢を続ける限り今ついている以上の回答は望めないですよ。
guest

回答4

0

ずっと同じところを回っているので参考まで。

ログイン機能がある予約サイトを作っています。

このコード思想の延長線上に実用に足る会員制サイトはありません。
やりたいことがあるのであれば、要件定義とプロジェクトマネジメントを学んで、委託したほうが良いです。

php の学習用途として書かれているのであれば、
・インプット処理の定石を学習(パラメータの受け取り)
・データベース処理の定石を学習
・アウトプット処理の定石を学習(html 出力)
して下さい。体系的な学習が圧倒的に足りていません。

それらの基本ができるようになって、初めて「データの加工法」に対して適切に質問できるようになります。現状ではノイズが多すぎて、まともな回答が付きません。

体系的な知識は、初学者向けの学習本で用語を学び、php のオンラインマニュアルを読み、実コードをステップ実行できる環境で動かしてみて学習すると手っ取り早く理解できます。

投稿2019/06/04 10:07

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/04 10:18

まんまコピペコード以外回答と認めない質問者のようなので、たぶんスルーされそうですけど そこを度外視すると絶対におさえて欲しい内容なので+1
退会済みユーザー

退会済みユーザー

2019/06/04 10:45

このコード前提にコピペコードもらっても無駄でしか無いでしょ。。。^^;
m.ts10806

2019/06/04 12:32

「作り直した方が早く確実」って言っても一切聞く耳もたないのでどんな回答も無駄かなと(私もこの質問者には向けた回答はしてません) まさか前の質問(未解決)より劣化したコードを次の質問に持ってくるとは思わなかったです。
guest

0

ご自身の前の質問の回答(現時点で未解決)で既にその原因も対応策も言及されています。

データを表示するforeachで使われている$arr_reserveはshop_idでのみ絞り込まれたデータだからというだけのことです。

未解決の質問についた回答をきちんと理解して解決にすれば自ずと今回の質問も解決します(というか重複質問なので)

投稿2019/06/03 06:45

編集2019/06/03 06:50
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

php

1 // reserveテーブルのreserve_shop_idからshop名を取り出す 2 $reserve_query = "SELECT * FROM reserve WHERE reserve_shop_id=:shop_id"; 3 $reserve_stmt = $pdo->prepare($reserve_query); 4 $reserve_stmt->bindValue(':shop_id', $shop_id, PDO::PARAM_INT); 5 $reserve_stmt->execute(); 6 $reserve_stmt->debugDumpParams(); 7 //結果->SQL: [52] SELECT * FROM reserve WHERE reserve_shop_id=:shop_id Params: 1 Key: Name: [8] :shop_id paramno=0 name=[8] ":shop_id" is_param=1 param_type=1 8 //var_dump($shop_id); ->int(4) 9 10 // reserveテーブルから予約情報の取り出し 11 $arr_reserve = []; 12 while ($row = $reserve_stmt->fetchAll(PDO::FETCH_ASSOC)) { 13 $arr_reserve[] = [ 14 'count' => $row['count'],    <-エラー箇所 15 ]; 16 } 17 //var_dump($arr_reserve);->array(1) { [0]=> array(6) { ["count"]=> NULL ["time"]=> NULL} }

countやtimeといった、SQLの予約語をそのままカラム名に使うのは混乱の元なので、
間に合うならカラム名を変えてテーブルを作り直したほうが良いです。
それが出来かねるのであれば、例えば

$reserve_query = <<<EOT SELECT `reserve_id`, `reserve_shop_id`, `count`, `time`, `reserve_comment`, `reserve_time`, `reserve_tel`, `reserve_push_id` FROM reserve WHERE reserve_shop_id = :shop_id EOT;

を試したり

$reserve_query = <<<EOT SELECT `reserve_id`, `reserve_shop_id`, `count` AS "CNT", `time` AS "TM", `reserve_comment`, `reserve_time`, `reserve_tel`, `reserve_push_id` FROM reserve WHERE reserve_shop_id = :shop_id EOT;

とか試すといいかも。

投稿2019/06/03 07:01

編集2019/06/04 09:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ariiiiiga

2019/06/04 08:59

どれが足りてませんか?
退会済みユーザー

退会済みユーザー

2019/06/04 09:22

回答を全面書き直しました。
ariiiiiga

2019/06/04 09:38

DBのスクショを追加しましたがあります。 あと、countは件数ではなく予約の人数です。
退会済みユーザー

退会済みユーザー

2019/06/04 09:48

countとかtimeとか、SQLでの予約語をそのまま使っているのは混乱しやすいので、 カラム名をSQLの予約後にならないよう変更したほうがデバッグしやすいですよ。
guest

0

ベストアンサー

Notice: Undefined index: count
$row['count']⇒$rowにcountと言うインデックスが無いという意味です。

fetchAllしているので
$rowを確認してみてください。
$row[0][カラム名]などの様になっていると思います。

もし、件数を取得したいのであれば

php

1'count' => count($row)

ですかね。

php

1while ($row = $reserve_stmt->fetch(PDO::FETCH_ASSOC)) { 2 $arr_reserve[] = [ 3 'count' => $row['count'] 4 ]; 5 }

これで良いのではないでしょうか。

投稿2019/06/04 05:18

編集2019/06/04 09:48
hide0128

総合スコア245

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ariiiiiga

2019/06/04 08:57

countは件数ではなく予約人数のことです。
hide0128

2019/06/04 09:33

なるほど、1件ずつ取得してるイメージですか? であればfetchAllではなくfetchですね。
ariiiiiga

2019/06/04 09:37

全ての予約が表示されるようになっています!
hide0128

2019/06/04 09:41

本件に関係ないですが、カラム名にcountは使わない方が良いですね。
hide0128

2019/06/04 09:45

1件ずつ取得してcount予約人数を取得しているようですので、fetchAllのループではなくfetchAllで取得した配列をループさせるか fetchのループに変更するかです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問