PHP実習:GETとMySQLを組み合わせたプロフィールページ
昨日はまたサボってしまった…。成果ゼロで寝るのも気持ち悪かったので、昨日は今回使うためのMySQL環境を整えるだけしました。
今回は、今まで作ったMySQLのデータベースと組み合わせて「登録されたプロフィールを表示するページ」を作る。
今回の流れは…
- クラブ情報を登録するテーブルを作り、userテーブルにclub_idのカラムを追加
- 会員データとその会員の所属するクラブの情報を取得
- 会員データが存在した場合は、それを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
);
いろいろスペルミスが多発して寝る前にイライラしてしまったのは内緒。
次に、既存のuserテーブルにカラムを追加する。
alter table user add club_id int not null default 0;
これでuserテーブルに規定値0の「club_id」というフィールドができた。
これと先ほどのclubテーブルを紐づけて使っていく。
ちなみに、clubテーブルのovervirwのデータ型をtextにしているので、改行が適用される。
表示は崩れるけど…。
ここまで準備が出来たので、次はブラウザに表示するための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>
フォームや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章はこれで終了なので、この記事もここまで。