あーる学習帳

自分が勉強したことや気になることなど、99%自分用です。コードを書いてるのでPCから閲覧を推奨。

PHP実習:GETとMySQLを組み合わせたプロフィールページ

昨日はまたサボってしまった…。成果ゼロで寝るのも気持ち悪かったので、昨日は今回使うためのMySQL環境を整えるだけしました。

 

今回は、今まで作ったMySQLのデータベースと組み合わせて「登録されたプロフィールを表示するページ」を作る。

今回の流れは…

  1. クラブ情報を登録するテーブルを作り、userテーブルにclub_idのカラムを追加
  2. 会員データとその会員の所属するクラブの情報を取得
  3. 会員データが存在した場合は、それをHTMLで表示

となる。要件定義としては、

  • ユーザーIDを基にした会員データの表示システムを作成する
  • 2つのテーブルデータを結び付けて取得
  • 会員データが存在しない場合、「存在しない会員IDです」と表示する

では制作していこう。

まず、MySQLにテーブルを追加する。

create table club(

club_id int not null auto_increment primary key,

club_name varchar(100),

count tinyint,

overview text

); 

f:id:R_de_aru:20180630165337p:plain

いろいろスペルミスが多発して寝る前にイライラしてしまったのは内緒。

次に、既存のuserテーブルにカラムを追加する。

alter table user add club_id int not null default 0;

これでuserテーブルに規定値0の「club_id」というフィールドができた。

これと先ほどのclubテーブルを紐づけて使っていく。

ちなみに、clubテーブルのovervirwのデータ型をtextにしているので、改行が適用される。

f:id:R_de_aru:20180630165432p:plain

表示は崩れるけど…。

 

ここまで準備が出来たので、次はブラウザに表示するためのHTMLとPHPを作っていく。今回は1ページのみ。一気に書いていく。

<?php
 $id='';
 if (isset($_GET['id'])) {
  $id=(int)$_GET['id'];
 }

 $dsn='mysql:dbname=user;host=localhost;charset=utf8';
 $user='root';
 $password='';
 $data[]='';

 try{
  $dbh=new PDO($dsn,$user,$password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  $sql=<<<SQL
  SELECT x.name,
      x.age,
      y.club_name,
      y.count,
      y.overview
  FROM user as x
  INNER JOIN club as y ON x.club_id=y.club_id
  WHERE x.id= :id
  LIMIT 1
SQL;
  $stmt=$dbh->prepare($sql);
  $stmt->bindvalue(':id',$id,PDO::PARAM_INT);
  $stmt->execute();
  $row=$stmt->fetch(PDO::FETCH_ASSOC);
  //var_dump($row);
 } catch (PDOExeption $e) {
  echo('接続エラー:'.$e->getMessage());
  die();
 }
?>

<html>
 <head>
  <meta charset="utf-8">
  <style type="text/css">
   .search{float:right;}
  </style>
 </head>
 <body>
 <div class="search">
  <p>会員IDを入力してください</p>
  <form action="" method="GET">
   <input type="text" name="id">
   <input type="submit" value="確認する">
  </form>
 </div>
 <h1>会員データ</h1>
 <?php if ($row===false): ?>
  <p>存在しない会員IDです。</p>
 <?php else: ?>
  <table border="1">
   <tr>
    <th>お名前</th>
    <th>年齢</th>
    <th>クラブ</th>
    <th>月の活動回数</th>
    <th>概要</th>
   </tr>
   <tr>
    <td><?php echo $row['name']; ?></td>
    <td><?php echo $row['age']; ?></td>
    <td><?php echo $row['club_name']; ?></td>
    <td><?php echo $row['count']; ?>回</td>
    <td><?php echo nl2br($row['overview']); ?></td>
   </tr>
  </table>
 <?php endif; ?>
 </body>
</html>

f:id:R_de_aru:20180630170054p:plain

 

フォームやURLから取得した値は文字列として扱われるので、整数にキャスト(型変換)して$idに代入する。

$id=(int)$_GET['id']; 

 今回はSQL文が長いので、ヒアドキュメントという手法を使う。代入のタイミングで「<<<」とアルファベットを組み合わせることで、改行コードが反映された形での代入が可能となる。アルファベットは通例で大文字を使う(今回は「SQL」)。ヒアドキュメントの終了を表すコード(今回は「SQL;」)は必ず行頭に書かなければならない。

SQLについてはすでに知っている内容なので割愛。

存在しないIDを入れられた場合の処理も作成する。idに一致するデータがない場合は$rowには真偽値であるFalseが返ってくるので、「$row===false」を条件式として「存在しないIDです」と画面に出すようにする。

今回は練習用だから省略したが、実際に表示する前にはデータの無害化をしなければならない。その際には出力時に以下のように書く。

echo nl2br(htmlspecialchars($row['overview'],RNT_QUOTES,'UTF-8')) ;

これでは長すぎるため、もっと短く書く方法を次回から学んでいく。

第8章はこれで終了なので、この記事もここまで。