##解決したいこと
データベースから任意のデータを抽出したい
##背景
以下の選手のデータ詳細を表示させるために、取り組み中です。
「点数(何点目か)」「試合日時」「対戦相手」「ゴールタイム」
以下のように与えられたデータベースからどのようにデータを抽出すればよろしいでしょうか?
leftjoinとかinnerjoinとか勉強してみましたが、複雑にデータが絡み合ってよくわからなくなりました。
データベース
countriesテーブル
goalsテーブル
goals_tmpテーブル
pairingsテーブル
pairings_tmpテーブル
playersテーブル
##完成予想図
ここに選手の得点履歴として、「点数(何点目か)」「試合日時」「対戦相手」「ゴールタイム」を追加したい。
このsql文で上記画像が実装できている
Player.php
public function findById($id = 0):Array { $sql = 'SELECT c.name AS c_name, p.id, p.uniform_num, p.position, p.name, p.club, p.birth, p.height, p.weight FROM players p INNER JOIN countries c ON c.id = p.country_id WHERE p.id = :id'; $sql_score = 'SELECT ( SELECT COUNT(1) + 1 FROM goals g INNER JOIN pairings p ON g.pairing_id = p.id WHERE goals.player_id = g.player_id AND ( ( goals.goal_time > g.goal_time AND pairings.kickoff = p.kickoff ) OR ( pairings.kickoff > p.kickoff ) ) ) AS 点数 , pairings.kickoff AS 試合日時 , countries.name AS 対戦相手 , goals.goal_time AS ゴールタイム FROM players INNER JOIN goals ON players.id = goals.player_id INNER JOIN pairings ON goals.pairing_id = pairings.id INNER JOIN countries ON pairings.enemy_country_id = countries.id WHERE players.id = :id ORDER BY pairings.kickoff , goals.goal_time'; $sth = $this->dbh->prepare($sql); $sth_score = $this->dbh->prepare($sql_score); $sth->bindParam(':id', $id, PDO::PARAM_INT); $sth_score->bindParam(':id', $id, PDO::PARAM_INT); $sth->execute(); $sth_score->execute(); $result = $sth->fetch(PDO::FETCH_ASSOC); $result_score = $sth_score->fetch(PDO::FETCH_ASSOC); return array($result,$result_score); }
PlayerControler.php
<?php require_once(ROOT_PATH .'/Models/Player.php'); class PlayerController { private $request; private $player; public function __construct() { $this->request['get'] = $_GET; $this->request['post'] = $_POST; $this->Player = new Player(); } public function index() { $page = 0; if(isset($this->request['get']['page'])) { $page = $this->request['get']['page']; } $players = $this->Player->findAll($page); $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; } }
show.php
<?php ini_set('display_errors', "On"); require_once(ROOT_PATH .'Controllers/PlayerController.php'); require_once(ROOT_PATH .'/Models/Player.php'); $player = new PlayerController(); $params = $player->view(); var_dump($params); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="/css/base.css"> <title>worldcup</title> </head> <body> <h2>選手詳細</h2> <table class="show-table"> <?php foreach($params['player'] as $player): ?> <tr> <th>No</th> <td><?=$player['id'] ?></td> </tr> <tr> <th>背番号</th> <td><?=$player['uniform_num'] ?></td> </tr> <tr> <th>ポジション</th> <td><?=$player['position'] ?></td> </tr> <tr> <th>名前</th> <td><?=$player['name'] ?></td> </tr> <tr> <th>所属</th> <td><?=$player['club'] ?></td> </tr> <tr> <th>誕生日</th> <td><?=$player['birth'] ?></td> </tr> <tr> <th>身長</th> <td><?=$player['height'] ?>cm</td> </tr> <tr> <th>体重</th> <td><?=$player['weight'] ?>kg</td> </tr> <tr> <th>所属国</th> <td><?=$player['c_name'] ?></td> </tr> <tr> <th>得点</th> <td><?=$player['点数'] ?></td> </tr> <?php endforeach; ?> </table> <div class="ed-btn"> <div class="edit"><a href="show.php?id=<?php echo $player['id'] ?>">編集</a></div> <div class="delete"><a href="show.php?id=<?php echo $player['id'] ?>">削除</a></div> </div> <br> <div class="top"> <a href="index.php">トップへ戻る</a> </div> </body> </html>
選手詳細はうまく表示できるのですが、得点が表示できずに困っています。
var_dumpでも得点部分がbool(false)返ってきます。
回答1件
あなたの回答
tips
プレビュー