ブログやECサイトで記事や商品の一覧から一つをクリックすると、そのアイテム専用の詳細ページに移動します。このとき、Webアプリケーションはどのようにして「どのアイテムの詳細ページを表示すべきか」を判断しているのでしょうか。
その鍵を握るのが、URLを使ってデータをPHPスクリプトに渡す「GET送信」という仕組みです。
この記事では、GET送信の基本である「クエリ文字列」を理解し、PHPの$_GET
を使って値を受け取り、動的な詳細ページを作成する準備をする方法を解説します。
1. URLでデータを渡す仕組み「クエリ文字列」
GET送信では、URLの末尾に「クエリ文字列(Query String)」と呼ばれる特別な形式のテキストを追加して、データを送ります。
URLの構造: http://example.com/detail.php?id=5
このURLは、detail.php
というファイルに対して、「id
という名前(キー)で5
という値(バリュー)を渡します」という意味になります。
?
(クエスチョンマーク): URLのパス部分とクエリ文字列を区切る記号です。id=5
(キーと値のペア):キー=値
の形式でデータを指定します。&
(アンパサンド): 複数のデータを渡したい場合に、ペアとペアの間を&
で繋ぎます。(例:detail.php?id=5&page=1
)
この方法は、主にページの内容を特定するための情報(商品ID、記事IDなど)を渡すのに使われます。URLにデータが表示されるため、パスワードなどの機密情報を送るのには適していません。
2. 一覧ページから詳細ページへのリンクを作成する
GET送信は、一覧表示ページで各項目に詳細ページへのリンクを設置する際によく利用されます。データベースから取得した各レコードのユニークなIDをURLに含めることで、リンク先を動的に生成します。
list.php
のforeach
ループ内のサンプルコード:
<tbody>
<?php foreach ($reviews as $review): ?>
<tr>
<td>
<a href="detail.php?id=<?php echo htmlspecialchars($review['id'], ENT_QUOTES, 'UTF-8'); ?>">
<?php echo htmlspecialchars($review['book_title'], ENT_QUOTES, 'UTF-8'); ?>
</a>
</td>
<td><?php echo htmlspecialchars($review['rating'], ENT_QUOTES, 'UTF-8'); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
このコードでは、reviews
テーブルの各レコードのid
をhref
属性の中に埋め込んでいます。もしid
が1
のレコードならリンクはdetail.php?id=1
に、id
が2
ならdetail.php?id=2
というように、レコードごとに異なるリンクが自動的に生成されます。
3. PHPでURLの値を受け取る$_GET
リンク先のPHPファイル(この例ではdetail.php
)では、URL経由で渡されたデータを$_GET
という特別な変数を使って受け取ります。
$_GET
は、PHPが自動的に用意してくれる連想配列で、クエリ文字列のキーがそのまま配列のキーになります。
detail.php
の基本的なコード:
<?php
// $_GET の中身をデバッグ目的で確認したい場合
// print_r($_GET);
// URLから'id'というキーで渡された値を取得
$id = $_GET['id'];
echo "あなたがクリックしたレビューのIDは、「" . htmlspecialchars($id, ENT_QUOTES, 'UTF-8') . "」です。";
// この後、このIDを使ってデータベースを検索し、詳細情報を取得する処理に続く
?>
http://example.com/detail.php?id=5
というURLにアクセスすると、$_GET['id']
の中には5
という値が格納されています。
【重要】GETパラメータのバリデーション
$_GET
で受け取る値は、URLを直接書き換えることで誰でも簡単に変更できてしまいます。そのため、$_GET
から受け取った値は絶対に信用せず、必ずチェック(バリデーション)を行う必要があります。
例えば、id
として数字を期待しているのに、?id=abc
のように不正な値を渡されると、データベース検索時にエラーが発生する可能性があります。
安全な値の受け取り方:
<?php
// 1. 'id'がURLに含まれているか、空でないかを確認
if (!isset($_GET['id']) || $_GET['id'] === '') {
echo "IDが指定されていません。";
exit(); // 処理を中断
}
// 2. 'id'が本当に数字であるかを確認
if (!ctype_digit($_GET['id'])) {
echo "IDは半角数字で指定してください。";
exit(); // 処理を中断
}
// バリデーションを通過した、安全なID
$id = (int)$_GET['id']; // 念のため整数型に変換
echo "ID: " . $id . " のレビュー詳細を表示します。";
// この$idを使ってデータベースを検索する
?>
このように、「①存在チェック」と「②形式チェック」を行うことで、予期せぬエラーやセキュリティリスクを大幅に減らすことができます。
まとめ
- URLの
?
以降にキー=値
の形式でデータを付加し、PHPに値を渡す方法をGET送信という。 - 一覧ページの各項目から詳細ページへリンクする際に、レコードのIDをGETで渡すのが一般的な手法。
- PHP側では、**
$_GET
**という連想配列でURLのデータを受け取る。 $_GET
で受け取った値は、必ずバリデーションを行ってから利用する。
この仕組みをマスターすれば、特定の情報だけを動的に表示する「詳細ページ」を自由に作成できるようになり、Webアプリケーション開発の幅が大きく広がります。