PHPでGETリクエストを処理する方法:$_GETの使い方を徹底解説

PHPでGETリクエストを処理する方法は、Web開発において基本的かつ重要なスキルです。GETリクエストは、Webページへのアクセスやデータの取得に広く使用されるHTTPリクエストの一種であり、URLにクエリパラメータを含めることで、ユーザーからの情報を受け取ることができます。PHPのスーパーグローバル変数である$_GETを使用することで、これらのクエリパラメータを簡単に取得し、処理することが可能です。本記事では、$_GETの基本的な使い方から応用的な利用方法、セキュリティ対策まで、GETリクエストを効果的に扱うための知識を詳細に解説します。

目次

GETリクエストとは

GETリクエストは、HTTPプロトコルにおけるリクエストメソッドの一つで、クライアントがサーバーからデータを取得するために使用されます。WebブラウザでURLを入力してページを開く際に送信されるリクエストが典型的な例です。GETリクエストの特徴は、送信するデータがURLに含まれることです。クエリパラメータとしてキーと値のペアが「?」の後に続き、複数のパラメータは「&」で区切られます。

GETリクエストの用途

GETリクエストは、以下のような場面でよく利用されます。

  • Webページの読み込み:特定のページやリソースの取得
  • 検索クエリの送信:検索エンジンにクエリを送信する際など
  • パラメータを伴うリンク:ユーザーのクリックによりデータを送信

GETリクエストはサーバーに対してデータを変更する要求をしないため、データの取得目的に適しています。

PHPでの$_GETの使い方

PHPでは、GETリクエストによって送信されたクエリパラメータを取得するために、スーパーグローバル変数である$_GETを使用します。$_GETは連想配列として動作し、クエリパラメータのキーを使用して対応する値を取得することができます。例えば、URLがexample.com?name=Johnの場合、$_GET['name']で”John”という値を取得できます。

基本的な$_GETの使い方

$_GETの基本的な使い方は以下の通りです。

<?php
$name = $_GET['name'];
echo "こんにちは、" . htmlspecialchars($name) . "さん!";
?>

上記のコードでは、URLのクエリパラメータからnameの値を取得し、それを表示しています。htmlspecialchars()関数を使用することで、HTML特殊文字をエスケープし、セキュリティリスクを軽減しています。

存在しないキーに対する対策

クエリパラメータが存在しない場合にエラーが発生するのを防ぐため、isset()関数で値が設定されているかを確認することが重要です。

<?php
if (isset($_GET['name'])) {
    $name = $_GET['name'];
    echo "こんにちは、" . htmlspecialchars($name) . "さん!";
} else {
    echo "名前が指定されていません。";
}
?>

このようにすることで、GETリクエストに指定されたキーが存在しない場合でも、プログラムが正常に動作するようになります。

クエリパラメータの取得と検証方法

GETリクエストに含まれるクエリパラメータを取得する際には、ユーザーからの入力が適切かどうかを検証することが重要です。不正なデータが含まれている場合、そのまま処理するとセキュリティ上のリスクが高まるため、データの取得と検証を慎重に行う必要があります。

クエリパラメータの取得方法

PHPでは、$_GETを使ってクエリパラメータを取得します。以下の例では、URLがexample.com?page=2のときに、pageパラメータの値を取得します。

<?php
$page = isset($_GET['page']) ? $_GET['page'] : 1;
echo "現在のページ: " . htmlspecialchars($page);
?>

ここでは、isset()関数を用いてパラメータの存在を確認し、存在しない場合にはデフォルト値(ここでは1)を使用しています。

入力の検証方法

クエリパラメータを取得した後、値が期待される形式であるかを検証することが必要です。数値が必要な場合はis_numeric()、文字列の長さを制限する場合はstrlen()などを使用します。

<?php
if (isset($_GET['age']) && is_numeric($_GET['age'])) {
    $age = (int)$_GET['age'];
    echo "年齢: " . $age;
} else {
    echo "年齢が無効です。";
}
?>

この例では、ageが数値であるかどうかを確認し、数値でない場合はエラーメッセージを表示します。

ホワイトリストを使用した検証

特定の値のみ許可する場合は、ホワイトリストを使用することが推奨されます。例えば、statusパラメータがactiveまたはinactiveのみ許可される場合は以下のようにします。

<?php
$status = isset($_GET['status']) ? $_GET['status'] : '';
$allowed_statuses = ['active', 'inactive'];

if (in_array($status, $allowed_statuses, true)) {
    echo "ステータス: " . htmlspecialchars($status);
} else {
    echo "無効なステータスです。";
}
?>

このように、入力を適切に検証することで、システムのセキュリティと安定性を向上させることができます。

複数のクエリパラメータを扱う際の注意点

複数のクエリパラメータを同時に処理する場合、各パラメータの取り扱い方やエラーハンドリングに注意が必要です。すべてのパラメータが適切に取得できるとは限らず、入力データが不完全または不正な場合もあるため、それに対応する工夫が求められます。

複数パラメータの取得と検証

複数のパラメータを同時に処理する際には、各パラメータを個別に検証し、必要なデフォルト値を設定することが推奨されます。以下の例では、nameageのパラメータを処理します。

<?php
$name = isset($_GET['name']) ? $_GET['name'] : 'ゲスト';
$age = isset($_GET['age']) && is_numeric($_GET['age']) ? (int)$_GET['age'] : 0;

echo "こんにちは、" . htmlspecialchars($name) . "さん。年齢は" . $age . "歳ですね。";
?>

この例では、nameが指定されていない場合は「ゲスト」、ageが数値でない場合は0をデフォルト値として使用します。

エラーハンドリングの実装

複数のパラメータを扱う場合、どのパラメータが欠落しているか、不正な値であるかをユーザーに明確に伝えることが重要です。これにより、入力ミスの修正が容易になります。

<?php
$errors = [];

if (!isset($_GET['name']) || empty($_GET['name'])) {
    $errors[] = '名前が指定されていません。';
}

if (!isset($_GET['age']) || !is_numeric($_GET['age'])) {
    $errors[] = '年齢が無効です。';
}

if (empty($errors)) {
    $name = $_GET['name'];
    $age = (int)$_GET['age'];
    echo "こんにちは、" . htmlspecialchars($name) . "さん。年齢は" . $age . "歳ですね。";
} else {
    foreach ($errors as $error) {
        echo htmlspecialchars($error) . "<br>";
    }
}
?>

ここでは、エラーのリストを作成して表示することで、複数のエラーが同時に発生した場合でも対応可能です。

パラメータ依存関係の考慮

複数のパラメータが互いに依存する場合、それらの関係性を考慮する必要があります。たとえば、特定のパラメータが指定された場合にのみ他のパラメータが有効である、といったケースです。

<?php
if (isset($_GET['action']) && $_GET['action'] === 'register') {
    if (!isset($_GET['email'])) {
        echo "登録にはメールアドレスが必要です。";
    } else {
        echo "メールアドレス: " . htmlspecialchars($_GET['email']) . "で登録します。";
    }
} else {
    echo "有効なアクションが指定されていません。";
}
?>

この例では、actionregisterの場合にのみemailパラメータが必須とされます。このように、パラメータの依存関係を適切に処理することで、ユーザーに対して明確なフィードバックを提供できます。

フォームとGETリクエストの連携

GETリクエストは、Webフォームの送信と連携させてデータをサーバーに送る際にも利用されます。フォームのメソッドとしてGETを指定することで、フォームの入力データがURLにクエリパラメータとして付加され、サーバーに送信されます。これにより、簡単に検索クエリやフィルタリング条件をサーバーに伝えることができます。

フォームからのGETリクエストの例

以下の例では、ユーザー名を入力して送信するシンプルなフォームを作成し、送信されたデータをGETリクエストで取得します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>GETリクエストの例</title>
</head>
<body>
    <form action="welcome.php" method="GET">
        <label for="name">名前:</label>
        <input type="text" id="name" name="name">
        <input type="submit" value="送信">
    </form>
</body>
</html>

このフォームでは、action属性で指定されたwelcome.phpにデータが送信され、メソッドはGETが指定されています。その結果、送信されたデータはwelcome.php?name=ユーザー名の形式でURLに追加されます。

送信されたデータの処理

次に、welcome.phpで受け取ったGETリクエストのデータを処理します。

<?php
if (isset($_GET['name']) && !empty($_GET['name'])) {
    $name = htmlspecialchars($_GET['name']);
    echo "こんにちは、" . $name . "さん!";
} else {
    echo "名前が入力されていません。";
}
?>

ここでは、nameパラメータが存在し、かつ空でないかを確認し、適切なメッセージを表示しています。htmlspecialchars()関数を使用して、ユーザー入力によるXSS攻撃を防ぐ対策も行っています。

GETメソッドを使用するフォームの特性

GETメソッドを使用するフォームの特徴として以下が挙げられます。

  • URLにデータが表示される:フォーム送信後、データがURLのクエリパラメータに含まれるため、ブックマークや共有が容易です。
  • データ量に制限がある:URLの長さには制限があるため、大量のデータ送信には不向きです。
  • キャッシュされやすい:ブラウザによりキャッシュされるため、リクエストの履歴が残ることがあります。

これらの特性を理解した上で、フォームの目的に応じたリクエストメソッドを選択することが重要です。

URLエンコードとデコード


GETリクエストでは、データがURLに含まれるため、クエリパラメータとして使用できない文字や特殊文字を適切に扱う必要があります。URLエンコードとデコードは、このような問題を解決するための重要なプロセスです。エンコードによって、URLで許可されていない文字が適切な形式に変換され、デコードによって元の文字列に戻されます。

URLエンコードとは


URLエンコードは、文字列内のスペースや特殊文字(&?=など)を「%」記号とその後に続く2桁の16進数表現で置き換えるプロセスです。例えば、スペースは%20にエンコードされます。PHPでは、urlencode()関数を使用して文字列をエンコードすることができます。

<?php
$query = "名前=太郎&年齢=20";
$encoded_query = urlencode($query);
echo $encoded_query; // 出力: %E5%90%8D%E5%89%8D%3D%E5%A4%AA%E9%83%8E%26%E5%B9%B4%E9%BD%A2%3D20
?>

このように、URLエンコードを適用することで、文字列をURLに含めることができる形式に変換できます。

URLデコードとは


URLデコードは、エンコードされた文字列を元の形式に戻すプロセスです。PHPでは、urldecode()関数を使用してデコードできます。

<?php
$encoded_query = "%E5%90%8D%E5%89%8D%3D%E5%A4%AA%E9%83%8E%26%E5%B9%B4%E9%BD%A2%3D20";
$decoded_query = urldecode($encoded_query);
echo $decoded_query; // 出力: 名前=太郎&年齢=20
?>

エンコードされたデータを正しく処理するためには、デコードを行って元のデータを取得する必要があります。

自動的なエンコードとデコードの処理


PHPの$_GET変数は、自動的にURLデコードされた値を返します。そのため、通常はエンコードされたデータを自動的にデコードせずに使用することができますが、特定の文字列を手動でエンコードする必要がある場合や、リンクを生成する場合にはurlencode()関数を利用することが有効です。

エンコードが必要な場合の例


動的に生成されたリンクやクエリパラメータにユーザー入力を含める場合には、URLエンコードを行うことで意図しない挙動を防ぐことができます。

<?php
$search_query = "PHP GETリクエストの処理";
$url = "search.php?query=" . urlencode($search_query);
echo '<a href="' . $url . '">検索結果を見る</a>';
// 出力: <a href="search.php?query=PHP%20GET%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E5%87%A6%E7%90%86">検索結果を見る</a>
?>

この例では、スペースや日本語の文字をエンコードしてリンクを安全に生成しています。

エンコードとデコードの必要性


エンコードとデコードは、URLを正しく扱い、予期せぬエラーやセキュリティ上の問題を防ぐために不可欠です。URLに含めるデータは常にエンコードし、受け取ったデータを適切にデコードすることで、信頼性の高いシステムを構築することができます。

$_GETとセキュリティ対策

PHPでGETリクエストを使用する際には、セキュリティリスクを考慮する必要があります。特に、$_GETを使ってユーザーからの入力を処理する場合、不正なデータや攻撃からアプリケーションを守るために適切な対策を講じることが重要です。ここでは、$_GETを使用する際に注意すべき主なセキュリティリスクと、その対策について解説します。

SQLインジェクション対策

SQLインジェクションは、攻撃者がSQLクエリを操作してデータベースに不正な操作を行う手法です。GETパラメータを直接SQLクエリに使用することは非常に危険です。対策として、以下の方法を取ることが推奨されます。

  • プリペアドステートメントの使用:PDOやMySQLiを使用して、プリペアドステートメントでクエリを実行します。これにより、SQLインジェクション攻撃を防ぐことができます。
  • 入力値のエスケープ:どうしても直接クエリを作成する場合は、mysqli_real_escape_string()を使用して特殊文字をエスケープしますが、プリペアドステートメントを推奨します。
<?php
// プリペアドステートメントの例
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$user = $stmt->fetch();
?>

XSS(クロスサイトスクリプティング)対策

XSSは、攻撃者が悪意のあるスクリプトをWebページに挿入し、ユーザーの情報を盗んだり、サイトの表示を改ざんしたりする攻撃です。GETリクエストで受け取ったデータをそのままHTMLに出力すると、XSS攻撃のリスクがあります。対策として、以下の方法を行います。

  • htmlspecialchars()関数を使用:HTML出力時に特殊文字をエスケープし、スクリプトが実行されないようにします。
  • 適切なHTML属性を指定:データをHTML属性に挿入する際は、必ずエスケープしてから使用します。
<?php
$name = isset($_GET['name']) ? htmlspecialchars($_GET['name']) : 'ゲスト';
echo "こんにちは、" . $name . "さん!";
?>

ディレクトリトラバーサル攻撃への対策

ディレクトリトラバーサル攻撃では、攻撃者がサーバー上のファイルパスを操作して、本来アクセスできないファイルにアクセスしようとします。GETパラメータでファイルパスを受け取る際には、以下の対策が必要です。

  • 固定されたディレクトリのみを使用:ユーザーが指定したファイル名を使用する場合でも、許可されたディレクトリ内のみでファイルを探します。
  • パス正規化の検証basename()realpath()関数を使用して、ディレクトリトラバーサルの試みを防ぎます。
<?php
$filename = isset($_GET['file']) ? basename($_GET['file']) : 'default.txt';
$filepath = '/var/www/files/' . $filename;

if (file_exists($filepath)) {
    echo file_get_contents($filepath);
} else {
    echo "ファイルが見つかりません。";
}
?>

その他の一般的なセキュリティ対策

  • 入力データの検証とフィルタリング:受け取ったGETパラメータの形式が正しいかを確認し、不正なデータは除外します。
  • HTTPSの使用:通信の盗聴を防ぐため、SSL/TLSを使用してデータを暗号化します。
  • エラーメッセージの制限:不正アクセスの手がかりを与えないよう、詳細なエラーメッセージをユーザーに表示しないようにします。

これらのセキュリティ対策を施すことで、$_GETを使ったWebアプリケーションの安全性を大幅に向上させることができます。

実際のコード例での応用

$_GETを使ったGETリクエスト処理の基本を理解したら、実際のPHPアプリケーションに応用することでその効果を体感できます。ここでは、GETリクエストを利用した簡単な検索機能とページネーションの実装例を紹介します。これにより、$_GETの具体的な使用方法と応用例を学びます。

例1: 検索フォームを使ったデータのフィルタリング

以下の例では、GETリクエストを使用してユーザーの検索クエリに基づいてリストをフィルタリングします。まず、検索フォームを作成し、そのフォームから送信されたデータを$_GETで取得します。

HTMLフォーム

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>簡単な検索機能</title>
</head>
<body>
    <form action="search.php" method="GET">
        <label for="query">検索キーワード:</label>
        <input type="text" id="query" name="query">
        <input type="submit" value="検索">
    </form>
</body>
</html>

search.php

<?php
$items = [
    'Apple', 'Banana', 'Cherry', 'Date', 'Elderberry', 'Fig', 'Grape', 'Honeydew'
];

$query = isset($_GET['query']) ? $_GET['query'] : '';

if (!empty($query)) {
    $results = array_filter($items, function($item) use ($query) {
        return stripos($item, $query) !== false;
    });
} else {
    $results = $items;
}

echo "検索結果: <br>";
foreach ($results as $result) {
    echo htmlspecialchars($result) . "<br>";
}
?>

このコードは、入力されたキーワードを基に配列$itemsから部分一致する要素を検索し、結果を表示します。stripos()関数を使用することで、大文字小文字を区別せずに検索が可能です。

例2: ページネーションの実装

次に、ページネーションを実装して、データを複数ページに分割して表示する方法を紹介します。以下の例では、pageパラメータを使用して現在のページ番号を取得し、データの一部を表示します。

PHPコードでのページネーション

<?php
$items = [
    'Apple', 'Banana', 'Cherry', 'Date', 'Elderberry', 'Fig', 'Grape', 'Honeydew'
];

$items_per_page = 3;
$total_items = count($items);
$total_pages = ceil($total_items / $items_per_page);

$current_page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1;
$current_page = max(1, min($current_page, $total_pages));

$start_index = ($current_page - 1) * $items_per_page;
$paginated_items = array_slice($items, $start_index, $items_per_page);

echo "ページ $current_page / $total_pages<br><br>";

foreach ($paginated_items as $item) {
    echo htmlspecialchars($item) . "<br>";
}

echo "<br>";

// ページナビゲーションのリンクを生成
if ($current_page > 1) {
    echo '<a href="?page=' . ($current_page - 1) . '">前のページ</a> ';
}

if ($current_page < $total_pages) {
    echo '<a href="?page=' . ($current_page + 1) . '">次のページ</a>';
}
?>

このコードでは、$items_per_pageに基づいて表示する項目を分割し、現在のページに対応する項目だけを表示します。ページ番号のリンクを作成し、pageパラメータを介して次のページや前のページへ移動できます。

コード例の応用と拡張

この検索機能とページネーションをさらに拡張して、複数のフィルタを組み合わせたり、データベースからのデータを扱ったりすることができます。たとえば、ユーザーがカテゴリや価格範囲でフィルタリングできるようにしたり、検索結果を並べ替えたりする機能を追加することが考えられます。

$_GETを使ってクエリパラメータを活用することで、柔軟で使い勝手の良いWebアプリケーションを構築することが可能です。これにより、ユーザーが希望する情報を効率的に取得できるインターフェースを提供できます。

$_GETとPOSTリクエストの違い

PHPでは、ユーザーからのデータを受け取るために$_GET$_POSTという2種類のスーパーグローバル変数を使用します。これらは、それぞれGETリクエストとPOSTリクエストに対応しており、使い方や用途が異なります。ここでは、$_GETと$_POSTの違い、それぞれの特性、および適切な使用シーンについて解説します。

$_GETの特徴

  • データがURLに含まれる:GETリクエストでは、クエリパラメータがURLの一部として送信されます。そのため、送信されたデータはURLに表示され、ブックマークや共有が容易です。
  • データ量に制限がある:ブラウザやサーバーによってURLの長さには制限があり、通常は2000文字程度が限界です。したがって、大量のデータ送信には不向きです。
  • キャッシュされやすい:ブラウザのキャッシュ機能やリクエスト履歴により、GETリクエストはキャッシュされやすく、同じリクエストを再送信するのが容易です。
  • 読み込み専用のリクエストに適している:GETリクエストは、サーバー上のデータを取得するために設計されているため、データの読み込みや表示に適しています。

$_POSTの特徴

  • データがHTTPメッセージボディに含まれる:POSTリクエストでは、送信するデータはHTTPリクエストのボディ部分に含まれます。URLには表示されないため、GETリクエストに比べてセキュリティが高くなります。
  • データ量に制限がない(理論上):サーバーの設定次第で送信できるデータ量を増やすことができ、大量のデータを送信する際に適しています。例えば、フォームに入力されたテキストやファイルのアップロードが可能です。
  • キャッシュされない:POSTリクエストは通常、キャッシュされないため、同じデータを再送信する場合には改めてリクエストを行う必要があります。
  • データの変更・送信に適している:POSTリクエストは、サーバー上のデータを作成、更新、削除するために使用されます。フォームの送信によるデータの登録や編集、ファイルのアップロードなどに適しています。

$_GETと$_POSTの使い分け

両者の違いを踏まえて、次のような場面で使い分けるのが一般的です。

  • $_GETを使用する場面
  • URLにクエリパラメータを含めることで状態を共有したい場合(例:検索クエリやフィルタ条件)
  • ページのデータ取得や表示に関する処理(例:製品リストのページング、商品カテゴリの選択)
  • データを変更しない読み取り専用の処理
  • $_POSTを使用する場面
  • フォームの送信によるユーザー登録やデータの更新、削除といった操作
  • 大量のデータ送信が必要な場合(例:テキストエリアでの長文投稿やファイルのアップロード)
  • セキュリティが重要なデータ(例:パスワードや個人情報)

例:$_GETと$_POSTの違いを実際に見る

以下に、$_GETと$_POSTを使った簡単なフォームの例を示します。

GETリクエストを使用したフォーム

<form action="process.php" method="GET">
    <label for="name">名前:</label>
    <input type="text" id="name" name="name">
    <input type="submit" value="送信">
</form>

このフォームでは、データがURLに含まれて送信されるため、送信結果のURLはprocess.php?name=ユーザー名となります。

POSTリクエストを使用したフォーム

<form action="process.php" method="POST">
    <label for="name">名前:</label>
    <input type="text" id="name" name="name">
    <input type="submit" value="送信">
</form>

こちらはデータがHTTPリクエストのボディに含まれて送信され、URLにはデータが表示されません。

$_GETと$_POSTの共通点と注意点

  • 両者ともにユーザーからの入力データを処理するため、適切な検証が必要
    ユーザー入力をそのまま処理することはセキュリティリスクを伴うため、htmlspecialchars()やフィルタリングを行います。
  • $_REQUESTの使用に注意
    PHPの$_REQUEST変数は、GETとPOSTの両方のリクエストデータを含むことができますが、データの優先順位が不明確になる場合があるため、基本的には$_GETか$_POSTを明示的に使うことが推奨されます。

GETとPOSTの違いを理解することで、PHPでのリクエスト処理をより適切に行えるようになります。目的に応じたリクエストメソッドを選ぶことで、Webアプリケーションの機能やセキュリティを強化できます。

演習問題:GETリクエストを使った簡単なアプリの作成


学んだ内容を実践するために、GETリクエストを利用した簡単なWebアプリケーションを作成してみましょう。以下の演習では、GETリクエストを使用してフィルタリング機能とページネーション機能を備えた簡単な商品リストアプリを作成します。

演習の要件

  1. 商品リストの表示
  • 商品名のリストを表示します。
  1. 検索機能の実装
  • 検索キーワードに基づいて商品をフィルタリングします。
  1. ページネーションの実装
  • 1ページあたり3件の商品を表示し、ページを切り替えるリンクを作成します。

ステップ1: 商品リストの表示


まずは、PHPで商品名のリストを表示するコードを作成します。以下の例を参考にしてください。

<?php
$products = [
    'Apple iPhone', 'Samsung Galaxy', 'Sony Xperia', 'Google Pixel', 
    'Huawei P30', 'OnePlus Nord', 'Nokia Lumia', 'LG Velvet'
];

foreach ($products as $product) {
    echo htmlspecialchars($product) . "<br>";
}
?>

ステップ2: 検索機能の実装


次に、検索フォームを追加し、入力されたキーワードに基づいて商品をフィルタリングします。

HTMLフォーム

<form action="" method="GET">
    <label for="search">検索キーワード:</label>
    <input type="text" id="search" name="search">
    <input type="submit" value="検索">
</form>

PHPコードでフィルタリング

<?php
$search = isset($_GET['search']) ? $_GET['search'] : '';

$filtered_products = array_filter($products, function($product) use ($search) {
    return stripos($product, $search) !== false;
});

foreach ($filtered_products as $product) {
    echo htmlspecialchars($product) . "<br>";
}
?>

このコードでは、検索キーワードに基づいてリストをフィルタリングし、該当する商品だけを表示します。

ステップ3: ページネーションの実装


最後に、ページネーション機能を追加します。1ページあたり3件の商品を表示し、複数ページに分割します。

ページネーションの実装例

<?php
$items_per_page = 3;
$total_items = count($filtered_products);
$total_pages = ceil($total_items / $items_per_page);

$current_page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1;
$current_page = max(1, min($current_page, $total_pages));

$start_index = ($current_page - 1) * $items_per_page;
$paginated_items = array_slice($filtered_products, $start_index, $items_per_page);

foreach ($paginated_items as $product) {
    echo htmlspecialchars($product) . "<br>";
}

echo "<br>";

// ページリンクの表示
if ($current_page > 1) {
    echo '<a href="?search=' . urlencode($search) . '&page=' . ($current_page - 1) . '">前のページ</a> ';
}

if ($current_page < $total_pages) {
    echo '<a href="?search=' . urlencode($search) . '&page=' . ($current_page + 1) . '">次のページ</a>';
}
?>

このコードにより、現在のページ番号に基づいて表示する商品の範囲を計算し、ページリンクを動的に生成します。

挑戦課題

  • カテゴリフィルタの追加:商品にカテゴリ属性を追加し、カテゴリごとに絞り込む機能を実装してみましょう。
  • 並べ替え機能の追加:商品名の昇順・降順で並べ替えられるように拡張してみてください。
  • 詳細ページの作成:各商品にリンクを追加し、クリックすると詳細情報ページに移動するようにします。

これらの演習を通じて、GETリクエストの実践的な使い方を学び、PHPでのWebアプリケーション開発スキルを向上させましょう。

まとめ


本記事では、PHPでのGETリクエスト処理と$_GETの使用方法について学びました。GETリクエストの基本的な概念から、フォームとの連携、URLエンコード、セキュリティ対策、そして実際のコード例まで幅広く解説しました。GETリクエストはデータの取得に適しており、検索機能やページネーションなど、ユーザーからの入力を利用する場面で広く活用されています。

適切なデータの検証とセキュリティ対策を施し、ユーザーからの入力を安全に処理することが重要です。GETとPOSTの違いを理解し、状況に応じて使い分けることで、Webアプリケーションの品質と安全性を高めることができます。

コメント

コメントする

目次