PHPでGETデータを取得する方法について

採用はこちら

PHPでGETデータを取得する場合は、PHPに用意されているスーパーグローバル変数の$_GETを使用するのが基本です。

GETはURLのクエリパラメータを利用してデータを送信する仕組みで、検索フォームや商品一覧の絞り込み、ページネーションなど、多くのWebサイトで使われています。

ただし、GETで受け取ったデータはユーザーが自由に変更できるため、単純に取得するだけではなく、値の存在確認やバリデーション、出力時のエスケープなども重要です。

この記事では、PHPでGETデータを取得する基本的な方法から、安全な扱い方、フォームとの連携、複数パラメータや配列の取得方法まで詳しく解説します。

目次

PHPのGETとは

GETとは、HTTPでクライアントからサーバーへリクエストを送信するときに利用されるメソッドの一つです。

GETを使用すると、送信するデータは通常URLの末尾にクエリパラメータとして付加されます。

たとえば、次のURLを考えてみましょう。

https://example.com/search.php?keyword=php

このURLでは、keywordという名前のパラメータにphpという値が設定されています。

PHPでは、この値を$_GETから取得できます。

<?php

$keyword = $_GET['keyword'] ?? '';

echo $keyword;

このページに、

search.php?keyword=php

というURLでアクセスすると、phpが取得されます。

GETデータはURLから確認できる

GETの大きな特徴は、送信したデータがURLに表示されることです。

たとえば、検索条件として、

keyword=php

と、

page=2

を送信すると、URLは次のようになります。

search.php?keyword=php&page=2

そのため、GETは検索結果やページ番号など、URLを共有したりブックマークしたりしたい情報との相性がよい方法です。

一方で、パスワードなどURLに表示させるべきではない情報をGETで送信するのは適切ではありません。

PHPの$_GETとは

$_GETは、GETパラメータを取得するためにPHPが用意しているスーパーグローバル変数です。

連想配列として扱うことができ、クエリパラメータの名前を配列のキーとして指定します。

たとえば、URLが次のようになっているとします。

search.php?keyword=php&page=2

PHPでは、概念的には次のようなデータとして扱えます。

$_GET = [
    'keyword' => 'php',
    'page' => '2',
];

したがって、それぞれ次のように取得できます。

<?php

$keyword = $_GET['keyword'] ?? '';
$page = $_GET['page'] ?? '';

echo $keyword;
echo $page;

$_GETはスーパーグローバル変数

$_GETはPHPのスーパーグローバル変数の一つです。

スーパーグローバル変数は、通常の変数とは異なり、関数の内外を問わず利用できます。

たとえば、次のような関数内からでも$_GETを参照できます。

<?php

function showKeyword(): void
{
    echo $_GET['keyword'] ?? '';
}

showKeyword();

ただし、プログラムの保守性を考えると、さまざまな場所から直接$_GETを参照するより、一度変数へ取り出してから必要な処理へ渡す設計のほうが扱いやすい場合があります。

PHPでGETデータを取得する基本的な方法

もっとも基本的な方法は、$_GETにパラメータ名を指定する書き方です。

たとえば、次のURLにアクセスするとします。

sample.php?name=Taro

PHPでは次のように取得できます。

<?php

$name = $_GET['name'];

echo $name;

実行結果は次のとおりです。

Taro

ただし、この方法ではnameパラメータが存在しなかった場合に、未定義の配列キーに関する警告が発生する可能性があります。

そのため、実際のプログラムではパラメータが存在するか確認してから使用することが重要です。

GETデータが存在するか確認する方法

GETパラメータは必ず送信されるとは限りません。

そのため、存在しないパラメータを直接参照しないようにする必要があります。

isset()で確認する

代表的な方法がisset()です。

<?php

if (isset($_GET['name'])) {
    $name = $_GET['name'];

    echo $name;
}

nameが存在する場合だけ処理されるため、未定義の配列キーを参照する問題を避けられます。

Null合体演算子を使用する

より簡潔に書きたい場合は、Null合体演算子の??が便利です。

<?php

$name = $_GET['name'] ?? '';

このコードでは、$_GET['name']が存在していてnullではない場合はその値を使用し、存在しない場合は空文字列を使用します。

たとえば、ページ番号なら次のように初期値を設定できます。

<?php

$page = $_GET['page'] ?? '1';

pageパラメータが存在しなければ、1が使用されます。

GETパラメータを簡潔に取得したい場合によく利用される書き方です。

HTMLフォームからGETデータを送信する方法

PHPでGETデータを取得する代表的な場面がHTMLフォームです。

フォームからGETデータを送信する場合は、formタグのmethod属性にgetを指定します。

<form action="search.php" method="get">
    <input type="text" name="keyword">
    <button type="submit">検索</button>
</form>

ユーザーが入力欄に、

PHP

と入力して送信すると、ブラウザは次のようなURLへアクセスします。

search.php?keyword=PHP

PHPでは次のように値を取得できます。

<?php

$keyword = $_GET['keyword'] ?? '';

echo $keyword;

name属性がGETパラメータの名前になる

HTMLフォームでは、入力要素のname属性が重要です。

<input type="text" name="keyword">

この場合、keywordがGETパラメータの名前になります。

PHPでは次のように取得します。

$_GET['keyword']

複数の入力欄がある場合も同じです。

<form action="search.php" method="get">
    <input type="text" name="keyword">
    <input type="number" name="page">
    <button type="submit">検索</button>
</form>

PHP側では次のように取得できます。

<?php

$keyword = $_GET['keyword'] ?? '';
$page = $_GET['page'] ?? '1';

複数のGETデータを取得する方法

GETでは複数のパラメータを同時に送信できます。

URL上では、それぞれのパラメータを&で区切ります。

products.php?category=pc&page=3&sort=price

PHPでは、それぞれのパラメータ名を指定して取得します。

<?php

$category = $_GET['category'] ?? '';
$page = $_GET['page'] ?? '1';
$sort = $_GET['sort'] ?? '';

echo $category;
echo $page;
echo $sort;

この場合、$_GETには概念的に次のようなデータが格納されます。

[
    'category' => 'pc',
    'page' => '3',
    'sort' => 'price',
]

商品検索や記事一覧などでは、このように複数のGETパラメータを組み合わせることがよくあります。

GETデータの内容をまとめて確認する方法

開発中にGETデータの内容を確認したい場合は、var_dump()print_r()を利用できます。

var_dump()を使用する

<?php

var_dump($_GET);

たとえば、次のURLでアクセスしたとします。

test.php?name=Taro&age=30

おおむね次のような情報を確認できます。

array(2) {
  ["name"]=>
  string(4) "Taro"
  ["age"]=>
  string(2) "30"
}

var_dump()では、値だけでなく型なども確認できるため、デバッグに便利です。

print_r()を使用する

簡単に配列の構造を確認したい場合は、print_r()も利用できます。

<?php

print_r($_GET);

ただし、var_dump()print_r()による内部データの表示は、基本的に開発やデバッグ用途で使用します。

本番環境で不用意に表示すると内部情報が漏れる可能性があるため注意が必要です。

GETデータは基本的に文字列として取得される

GETパラメータとして送信された値は、通常PHPでは文字列として取得されます。

たとえば、URLが次のようになっている場合です。

sample.php?page=10

PHPで、

var_dump($_GET['page']);

とすると、通常は文字列の"10"として扱われます。

そのため、整数として計算などに使用したい場合は、必要に応じて型変換やバリデーションを行います。

整数へキャストする方法

単純に整数へ変換するのであれば、次のようにキャストできます。

<?php

$page = (int) ($_GET['page'] ?? 1);

?page=5なら、整数の5として扱えます。

ただし、キャストには注意点があります。

たとえば、

?page=abc

という値でも整数へキャストすると0になります。

そのため、「本当に整数として正しい入力か」を確認したい場合はバリデーションを利用するほうが適切です。

filter_input()でGETデータを取得する方法

$_GET以外にも、filter_input()を使ってGETパラメータを取得できます。

基本的な書き方は次のとおりです。

<?php

$keyword = filter_input(INPUT_GET, 'keyword');

INPUT_GETを指定すると、GETとして渡された値が対象になります。

filter_input()で整数を検証する

ページ番号やIDなど、整数でなければならない値を受け取る場合は、FILTER_VALIDATE_INTを指定できます。

<?php

$page = filter_input(
    INPUT_GET,
    'page',
    FILTER_VALIDATE_INT
);

値が整数として正しければ、その値が返されます。

一方で、整数として不正な値なら通常falseとなり、パラメータが存在しない場合は通常nullとなります。

そのため、次のように判定できます。

<?php

$page = filter_input(
    INPUT_GET,
    'page',
    FILTER_VALIDATE_INT
);

if ($page === null) {
    $page = 1;
} elseif ($page === false) {
    exit('ページ番号が不正です。');
}

これなら「パラメータが指定されていない場合」と「不正な値が指定された場合」を区別できます。

filter_input()を使うだけで安全になるわけではない

注意したいのは、filter_input()を使えば自動的にすべての入力値が安全になるわけではない点です。

フィルターを指定せず、

$keyword = filter_input(INPUT_GET, 'keyword');

としただけでは、HTML出力用のエスケープなどが自動的に行われるわけではありません。

整数なら整数として検証する、メールアドレスなら形式を確認するなど、用途に応じたバリデーションを行うことが重要です。

また、HTMLへ出力するときは別途htmlspecialchars()などを使用します。

GETデータをHTMLへ表示するときの注意点

GETデータはユーザーがURLを書き換えることで自由に変更できます。

そのため、受け取った値をそのままHTMLへ出力するのは避けるべきです。

たとえば、次のコードです。

<?php

echo $_GET['name'] ?? '';

外部から受け取った文字列を適切に処理せずHTMLへ出力すると、クロスサイトスクリプティングなどの脆弱性につながる可能性があります。

htmlspecialchars()を使用する

通常のHTML本文や引用符で囲まれた属性値へ文字列として出力する場合は、htmlspecialchars()を使用します。

<?php

$name = $_GET['name'] ?? '';

echo htmlspecialchars(
    $name,
    ENT_QUOTES | ENT_SUBSTITUTE,
    'UTF-8'
);

フォームへ入力内容を再表示するときも同様です。

<?php

$keyword = $_GET['keyword'] ?? '';

?>

<form method="get">
    <input
        type="text"
        name="keyword"
        value="<?= htmlspecialchars(
            $keyword,
            ENT_QUOTES | ENT_SUBSTITUTE,
            'UTF-8'
        ) ?>"
    >

    <button type="submit">検索</button>
</form>

エスケープは出力時に行う

GETデータを取得した時点ですぐにhtmlspecialchars()を適用するのではなく、基本的には出力先に応じて必要な処理を行うのが重要です。

たとえば、次のような流れです。

GETデータを取得
↓
値を検証
↓
必要な処理を実行
↓
HTMLへ出力するときにエスケープ

HTML、SQL、URLなどでは必要な処理が異なるためです。

htmlspecialchars()はHTML出力向けの処理であり、SQLインジェクション対策やURLエンコードの代わりにはなりません。

GETデータをSQLで使用するときの注意点

GETパラメータをデータベース検索に使用する場合も注意が必要です。

次のように、GETデータをSQLへ直接連結する書き方は避けます。

<?php

$id = $_GET['id'] ?? '';

$sql = "SELECT * FROM users WHERE id = $id";

外部入力をSQL文へ直接組み込むと、SQLインジェクションなどの原因になる可能性があります。

PDOのプリペアドステートメントを使用する

PDOを使用する場合は、プリペアドステートメントを利用します。

<?php

$id = filter_input(
    INPUT_GET,
    'id',
    FILTER_VALIDATE_INT
);

if ($id === false || $id === null) {
    exit('不正なIDです。');
}

$stmt = $pdo->prepare(
    'SELECT * FROM users WHERE id = :id'
);

$stmt->execute([
    ':id' => $id,
]);

$user = $stmt->fetch();

このように、値をSQL文へ直接連結せず、パラメータとして渡す方法が基本です。

htmlspecialchars()をSQLインジェクション対策として使用することはできません。

HTMLへの出力とSQLへの値の受け渡しは、それぞれ別の対策が必要です。

配列形式のGETデータを取得する方法

GETパラメータでは、複数の値を配列として受け取ることもできます。

チェックボックスなどでよく利用されます。

たとえば、次のフォームを考えてみましょう。

<form method="get">
    <label>
        <input type="checkbox" name="category[]" value="php">
        PHP
    </label>

    <label>
        <input type="checkbox" name="category[]" value="javascript">
        JavaScript
    </label>

    <button type="submit">検索</button>
</form>

両方を選択して送信すると、URLは次のような形式になります。

?category[]=php&category[]=javascript

PHPでは次のように取得できます。

<?php

$categories = $_GET['category'] ?? [];

取得される内容は、概念的には次のような配列です。

[
    'php',
    'javascript',
]

is_array()で配列か確認する

GETパラメータは外部から自由に変更できるため、想定したデータ型になっているとは限りません。

そのため、配列として処理する前に確認すると安全です。

<?php

$categories = $_GET['category'] ?? [];

if (is_array($categories)) {
    foreach ($categories as $category) {
        echo htmlspecialchars(
            $category,
            ENT_QUOTES | ENT_SUBSTITUTE,
            'UTF-8'
        );
    }
}

単純に「配列として送られてくるはず」と決めつけず、入力値を確認してから処理することが重要です。

GETパラメータ付きURLを生成する方法

PHPからGETパラメータ付きURLを生成する場合は、http_build_query()を使用すると便利です。

たとえば、次の配列があるとします。

<?php

$params = [
    'keyword' => 'PHP 入門',
    'page' => 2,
];

http_build_query()へ渡すと、クエリ文字列を生成できます。

<?php

$query = http_build_query($params);

echo 'search.php?' . $query;

日本語や空白などもURLで利用できる形式にエンコードされます。

文字列を手作業で連結するよりも、GETパラメータを安全かつ管理しやすく組み立てられます。

GETとPOSTの違い

PHPでフォームデータを扱うときは、GETとPOSTの違いについても理解しておく必要があります。

GETでは、送信するデータがURLのクエリパラメータとして表示されます。

search.php?keyword=php&page=2

そのため、検索条件やページ番号、並び順など、URLとして保存・共有したい情報に適しています。

POSTでは通常、フォームデータはURLのクエリ文字列ではなくHTTPリクエストボディに含まれます。

PHPでは$_POSTを使用します。

<?php

$name = $_POST['name'] ?? '';

GETが向いているケース

GETは、主に次のような処理で利用されます。

  • 検索キーワード
  • 商品の絞り込み条件
  • ページ番号
  • 表示件数
  • 並び替え条件

たとえば、

products.php?category=pc&page=2&sort=price

のようにすれば、同じ条件のURLを共有できます。

POSTなどが向いているケース

サーバー上のデータを登録・更新するような処理では、一般的にGETではなくPOSTなどの適切なHTTPメソッドを使用します。

たとえば、次のような処理です。

  • 会員登録
  • コメント投稿
  • データの更新
  • 注文処理

ただし、POSTを使えば自動的に安全になるわけではありません。

GETでもPOSTでも、ユーザーから受け取った入力値は外部入力として適切に検証する必要があります。

PHPでGETデータを安全に扱うポイント

PHPでGETデータを扱う場合は、「取得できたからそのまま使う」という考え方は避ける必要があります。

外部から渡される値であることを前提に処理することが重要です。

GETデータを信用しない

URLはユーザー自身で自由に変更できます。

たとえば、本来、

products.php?page=1

となることを想定していても、ユーザーは、

products.php?page=999999

や、

products.php?page=abc

に書き換えられます。

そのため、ページ番号なら、

  • 整数か
  • 許可された範囲内か
  • 必要以上に大きな値ではないか

などを確認する必要があります。

用途に合わせてバリデーションする

すべての入力値を同じ方法で処理するのではなく、データの用途に合わせて検証します。

ページ番号なら整数かどうかを確認します。

$page = filter_input(
    INPUT_GET,
    'page',
    FILTER_VALIDATE_INT
);

並び順であれば、許可された値だけを受け付ける方法もあります。

<?php

$sort = $_GET['sort'] ?? 'new';

$allowedSorts = [
    'new',
    'old',
    'price',
];

if (!in_array($sort, $allowedSorts, true)) {
    $sort = 'new';
}

このように、値を許可リストと照合する方法は実務でもよく利用されます。

PHPでGETデータを取得する実践例

最後に、検索フォームを使ったシンプルな実装例を紹介します。

<?php

$keyword = trim($_GET['keyword'] ?? '');

?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>検索フォーム</title>
</head>
<body>

<form method="get">
    <input
        type="text"
        name="keyword"
        value="<?= htmlspecialchars(
            $keyword,
            ENT_QUOTES | ENT_SUBSTITUTE,
            'UTF-8'
        ) ?>"
    >

    <button type="submit">
        検索
    </button>
</form>

<?php if ($keyword !== ''): ?>

    <p>
        「<?= htmlspecialchars(
            $keyword,
            ENT_QUOTES | ENT_SUBSTITUTE,
            'UTF-8'
        ) ?>」の検索結果
    </p>

<?php endif; ?>

</body>
</html>

実践例の処理の流れ

まず、次の部分でGETデータを取得しています。

$keyword = trim($_GET['keyword'] ?? '');

keywordが存在しない場合は空文字列を使用し、trim()で文字列の前後にある空白を取り除いています。

フォームへ値を再表示するときには、

htmlspecialchars()

を使用します。

検索結果として表示するときも同じように、HTMLへ出力する段階でエスケープしています。

このように、

GETデータを取得する
↓
必要なバリデーションや加工を行う
↓
処理に使用する
↓
HTMLへ表示するときにエスケープする

という流れを意識すると、安全で分かりやすいコードを作りやすくなります。

PHPでGETデータを取得する方法のまとめ

PHPでGETデータを取得するときは、基本的に$_GETを使用します。

もっとも簡単な書き方は次のとおりです。

$value = $_GET['key'] ?? '';

URLが、

sample.php?key=value

なら、$_GET['key']からvalueを取得できます。

ただし、GETパラメータはユーザーが自由に変更できる外部入力です。

そのため、値を取得するだけではなく、存在確認やバリデーションを行うことが重要です。

整数を検証する場合には、たとえば次のようにfilter_input()FILTER_VALIDATE_INTを利用できます。

$page = filter_input(
    INPUT_GET,
    'page',
    FILTER_VALIDATE_INT
);

HTMLへ表示する場合は、必要に応じてhtmlspecialchars()でエスケープします。

echo htmlspecialchars(
    $keyword,
    ENT_QUOTES | ENT_SUBSTITUTE,
    'UTF-8'
);

また、データベースでGETパラメータを使用する場合は、SQLへ直接連結せず、PDOなどのプリペアドステートメントを利用します。

GETデータを扱うときは、「取得」「検証」「処理」「出力」の役割を分け、外部入力をそのまま信用しないことが重要です

この基本を理解しておけば、検索フォームやページネーション、絞り込み機能など、多くのPHPアプリケーションで安全にGETデータを扱えるようになります。

以上、PHPでGETデータを取得する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次