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

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

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

phpPgAdminは、PHPで作成された複数のPostgreSQLデータベースをブラウザから簡単に管理・操作できるツール。テーブルの作成や参照を始め、データのバックアップやリストアといった操作が可能になります。

PHP

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

Q&A

解決済

2回答

1526閲覧

php データベース情報を取得し、詳細ページから特定のデータを取得したい

nene023

総合スコア2

phpPgAdmin

phpPgAdminは、PHPで作成された複数のPostgreSQLデータベースをブラウザから簡単に管理・操作できるツール。テーブルの作成や参照を始め、データのバックアップやリストアといった操作が可能になります。

PHP

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

0グッド

0クリップ

投稿2023/04/20 14:24

実現したいこと

php言語を使ってmvcを作成し、データベースから
情報を取得(詳細ボタン付き)→詳細ボタンを押して
特定の詳細情報(テーブル二つ)を見れるようにしたいと思っています。

前提

phpの初学者で現在勉強中です。
情報を取得し、詳細ボタンから一つ目のテーブルは
表示ができているのですが、二つ目のデーブル表示がうまくいかない状況です。
一つ目はプレイヤー情報、
二つ目はプレイヤーの得点履歴を表示しようと思っています。

Goal.phpファイルのsql分のWHEREを
本当は獲得したい’’goals.player_id = id:''にすると
何も表示されず、他の’’pairing_id = id:’’ などにすると、
本当は選手IDとしてもらった値が試合の組み合わせIDとして、
表示してしまいます。
どなたかお力をお貸りいただきたいです。

エラーメッセージは、とくにありません。

データベース情報
index.php(全てのプレイヤー情報)

view.php (一人の選手のプレイヤー情報と得点履歴)

該当のソースコード

Goal.php

<?php require_once(dirname(__FILE__).'/Db.php'); if(isset($_GET['id'])){ $id = $_GET['id']; } class Goal extends Db { private $table = 'goals'; public function __construct($dbh = null) { parent::__construct($dbh); } public function goalPlayer($id):Array { $sql = 'SELECT goals.player_id AS id,  pairings.kickoff AS kickoff,  countries.name AS enemy_country,  goals.goal_time AS goal_time  FROM pairings  LEFT JOIN countries ON countries.id = pairings.enemy_country_id  LEFT JOIN goals ON goals.pairing_id = pairings.id   LEFT JOIN players ON players.id = goals.player_id  WHERE players.id = :id. //ここが問題の箇所です  ORDER BY pairings.kickoff ASC'; $sth = $this->dbh->prepare($sql); $sth->bindParam(':id', $id, PDO::PARAM_INT); $sth->execute(); $result = $sth->fetchAll(PDO::FETCH_ASSOC); return $result; } }

PlayerController.php

<?php require_once(dirname(__FILE__).'/../Models/Player.php'); require_once(dirname(__FILE__).'/../Models/Goal.php'); class PlayerController { public $request; //リクエストパラメータ(GET,POST) public $Player; // Playerモデル public $Goal; // Goalモデル public function __construct() { //リクエストパラメータの取得 $this->request['get'] = $_GET; $this->request['post'] = $_POST; // モデルオブジェクトの生成 $this->Player = new Player(); //別モデルと連帯 $dbh = $this->Player->get_db_handler(); $this->Goal = new Goal($dbh); } public function index() { $page = 0; if(isset($this->request['get']['page'])) { $page = $this->request['get']['page']; } $players = $this->Player->findAll(); $players_count = $this->Player->countAll(); $params = [ 'players' => $players, 'pages' => $players_count / 20 ]; return $params; } public function view() { if(empty($this->request['get']['id'])) { echo '指定のパラメータが不正です。このページを表示できません。'; exit; } $player = $this->Player->findById($this->request['get']['id']); $params = [ 'player' => $player ]; return $params; } public function goal(){ if (empty($this->request['get']['id'])) { echo '指定のパラメータが不正です。このページを表示できません。'; exit; } $goal = $this->Goal->goalPlayer($this->request['get']['id']); $params2 = [ 'goals' => $goal ]; return $params2; } }

index.php

<?php require_once('../../Controllers/PlayerController.php'); $player = new PlayerController(); $params = $player->index(); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>オブジェクト指向 - 選手一覧</title> <link rel="stylesheet" type="text/css" href="/css/base.css"> <link rel="stylesheet" type="text/css" href="/css/style.css"> </head> </html> <body> <h2>■選手一覧</h2> <table> <tr> <th>No</th> <th>背番号</th> <th>ポジション</th> <th>名前</th> <th>所属</th> <th>誕生日</th> <th>身長</th> <th>体重</th> <th>国</th> <th></th> </tr> <?php foreach($params['players'] as $player): ?> <tr> <td><?=$player['id'] ?></td> <td><?=$player['uniform_num'] ?></td> <td><?=$player['position'] ?></td> <td><?=$player['name'] ?></td> <td><?=$player['club'] ?></td> <td><?=$player['birth'] ?></td> <td><?=$player['height'] ?>cm</td> <td><?=$player['weight'] ?>kg</td> <td><?=$player['country'] ?></td> <td><a href="view.php?id=<?php echo $player['id']; ?>">詳細</a></td> </tr> <?php endforeach; ?> </table> <div class='paging'> <?php for($i=0; $i<=$params['pages']; $i++) { if(isset($_GET['page']) && $_GET['page'] == $i) { echo $i+1; } else { echo "<a href='?page=".$i."'>".($i+1)."</a>"; } } ?> </div> </body>

view.php

<?php include('../../Controllers/PlayerController.php'); $player = new PlayerController(); $params = $player->view(); $params2 = $player->goal(); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>オブジェクト指向 - 選手一覧</title> <link rel="stylesheet" type="text/css" href="/css/base.css"> <link rel="stylesheet" type="text/css" href="/css/style.css"> </head> </html> <?php <body> <h2>■選手詳細</h2> <table> <tr> <td class="title">No</td> <td><?=$params['player']['id'] ?></td> </tr> <tr> <td class="title">背番号</td> <td><?=$params['player']['uniform_num'] ?></td> </tr> <tr> <td class="title">ポジション</td> <td><?=$params['player']['position'] ?></td> </tr> <tr> <td class="title">名前</td> <td><?=$params['player']['name'] ?></td> </tr> <tr> <td class="title">所属</td> <td><?=$params['player']['club'] ?></td> </tr> <tr> <td class="title">誕生日</td> <td><?=$params['player']['birth'] ?></td> </tr> <tr> <td class="title">身長</td> <td><?=$params['player']['height'] ?></td> </tr> <tr> <td class="title">体重</td> <td><?=$params['player']['weight'] ?></td> </tr> <tr> <td class="title">国</td> <td><?=$params['player']['country'] ?></td> </tr> <tr> <td class="title"><a href="#">編集</a> <a href="#">削除</a></td> <td></td> </tr> </table> <h2>■得点履歴</h2> <table> <tr> <th>得点</th> <th>試合日時</th> <th>対戦相手</th> <th>ゴールタイム</th> </tr> <?php $i = 1; foreach ($params2['goals'] as $goal) : ?> <tr> <td><?= $i . "点目"; $i++; ?></td> <td><?= $goal['kickoff'] ?></td> <td><?= $goal['enemy_country'] ?></td> <td><?= $goal['goal_time'] ?></td> </tr> <?php endforeach; ?> </table> <p class="top-back"><a href="./index.php">トップへ戻る</a><p> </body>

試したこと

sql文はデータベースのインライン編集をして、実際に
データの取得は確認がとれる構文であること、
他に可能なsql文をいくつか試しました。
また、$idの値も確認したところ、選手IDとしてindex.phpから
もらえていました。

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

php 7.3.44
phpMyAdmin

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

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

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

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

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

m.ts10806

2023/04/20 22:38

:id.  ←この . は何でしょう。 ちなみにそのSQLは、DB直実行で想定の値が取れることは確認できているものなのでしょうか。 テーブル定義提示されてないので見えないことが多いですが(DDL提示してください)、 必ず絞り込むテーブルに対してLEFT JOINしているのがちょっと怪しい気はします。
FKM

2023/04/21 00:22

:idのプリペアードステートメントに代入される$idの値をechoしてみて、期待どおりの値を検出しているか確認してみてください。またphpmyadminを使って、SQLが本当に値を取得しているか確認してみてください。 それで、次調べる道筋が見えてくると思います。
nene023

2023/04/21 01:22

皆様、ご指摘いただきありがとうございました。 id. ← コピーした際に間違えてついてしまったようです。 ご指摘いただいていたsqlやデータベースを確認したところ 解決することができました。 コードに問題はなく、欲しい情報の際にデータがなかったのは、 そもそもデータがなかっただけでした。 ゴールの決めた選手は全員ではないので、 データがないのはうなずけました。 皆様ありがとうございました。
guest

回答2

0

こういったSQLでのクエリを用いたデバッグは順序があります。

関数に代入される変数を見直す

:idプレースホルダのプリペアードステートメントに代入される$idの値をechoしてみて、期待どおりの値を検出しているか確認してみてください。問題がなければ、SQL上で問題が発生していることがわかります。

DBで発行するクエリを見直す

phpmyadminを使って、SQLが本当に値を取得しているかクエリを発行して確認してみてください。それで、次調べる道筋が見えてくると思います。

クエリを実行できない

SQLのクエリ発行エラーなら、SQLの構造上のミスです。ところが、SQL上の構造ミスは、関数の戻り値にnullを返してしまうので、isset判定を素通りしてしまう(issetはNULLもtrueを返すので)ので、PHPでは案外気づかない部分があります。なので、極力adminを使ってDMBS上でクエリ発行することを勧めます。

クエリを実行できるが、返される値が存在しない

id同士の紐付けに不備(不完全結合の指定がおかしい)ことがわかってきます。本当にそのLEFT JOINの結合条件で合っているか確認してみてください。

投稿2023/04/21 01:24

編集2023/04/21 01:26
FKM

総合スコア3647

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

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

nene023

2023/04/21 02:11

ご教授いただきありがとうございます。 大変助かります。再度sql文の確認も行ってみます。
guest

0

自己解決

sql文のmyadminにて表示されない原因は、
データが存在してない、というものでした。

他の’’pairing_id = id:’’などで表示されるので、sql構文に問題はなく、
ただ指示した箇所のデータはない、という意味でした。

欲しかったデータは選手の得点履歴であり、
全ての選手がゴールを決めてはいないので、
詳細ページに詳報が表示されない、というものでした。

些細な内容にて失礼いたしました。
皆様、ご指摘いただきありがとうございました。

投稿2023/04/21 01:34

nene023

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問