実現したいこと
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
回答2件
あなたの回答
tips
プレビュー