ゼロから始めるPHP講座Vol13 GETとPOSTの使い方


ゼロから始めるPHP講座Vol13 GETとPOSTの使い方

今回はPHPの「GET」と「POST」の使い方について解説していきます。   

初心者向けPHPの解説は【PHP入門】概要からオススメ書籍、スクールまで徹底解説

関数の使い方はゼロから始めるPHP講座Vol05 関数の基礎

関数の書き方はゼロから始めるPHP講座Vol06 関数の書き方をご覧ください。 image

目次
  1. ゼロから始めるPHP講座GETとPOSTの使い方
  2. GETとPOSTとは
  3. GETとPOSTの使い分け
  4. GETとPOSTの使用例
  5. 補足.変数の初期化
  6. 課題

ゼロから始めるPHP講座GETとPOSTの使い方

GETとPOSTとは

Webページの仕組み」の際にも一部説明致しましたが、ブラウザでWebページを閲覧する際には、サーバに「このファイルを見せてください」と要求(リクエスト)しており、このリクエストの方法(メソッド)でよく使うものにGETとPOSTがあります。

GETやPOSTを利用すると、閲覧するファイルをリクエストすると同時に、フォームに入力された内容などのデータをサーバ(リクエストしたファイル)へ引き渡すことができます。

例として、send.phpとreceive.phpでは、以下のようなやり取りが行われています。

image

GETとPOSTの特徴は以下となります。

GET
フォーム内でGETを利用することを明示する ※省略可 <form method="get" action="データ送信先"> HTML内で明示がない場合はGETとなる 例)ハイパーリンク(a要素) 送信内容がURLに渡される http://www.google.co.jp/search?q=codecamp ※URLの?以降が連想配列の「キー=」として送られる(メータ) 送信できる情報量に制限がある(ブラウザによって異なる)

POST
フォーム内でPOSTを利用することを明示する
<form method="post" action="データ送信先">
URLには表示されない
 

送られた値が連想配列として定義されるのが、$_GETと$_POSTとなります。 また、送信する内容のことをリクエストパラメータと呼びます。

GETとPOSTの使い分け

GETは、検索結果を表すページなどに使います。

http://www.google.co.jp/search?q=codecampのように、GETを使ってリクエストパラメータをURLに含めると、

  • 検索結果の一覧が出ているページをブックマーク可能
  • ブラウザのキャッシュ機能により、2回目以降は高速表示が可能

という利点があります。

POSTはユーザ名やパスワードなど秘匿性の高い情報を送信する際を代表に、セキュリティの観点から利用します。

なおPOSTを利用したからセキュリティに問題がないわけではなく、GETよりはリスクが軽減されるだけで、セキュリティ対策は別途必要となります。

この2つの使い分けとして、GETを使う明確なメリットがある場合以外は、基本的にPOSTを利用します。

GETとPOSTの使用例

ユーザが入力したデータの受け取りは基本的にGETかPOSTを利用し受け取っており、Webサービスを提供する上で欠かせません。

お手本にある通り、GET又はPOSTを使用したプログラムを順番に作成しましょう。

GET
ファイル名: get_sample.php


<?php
if (isset($_GET['query']) === TRUE) {
    $query  = htmlspecialchars($_GET['query'], ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>スーパーグローバル変数使用例</title>
</head>
<body>
    <h1>検索しよう</h1>
<?php
    // formから検索文字列が渡ってきている場合はGoogleへのリンクを表示
    if (isset($query) === TRUE) {
?>
    <a href="https://www.google.co.jp/search?q=<?php print $query; ?>" target="_blank">「<?php print $query; ?>」をGoogleで検索する</a><br>
    <a href="http://www.bing.com/search?q=<?php print $query; ?>" target="_blank">「<?php print $query; ?>」をbingで検索する</a><br>
    <a href="http://search.yahoo.co.jp/search?p=<?php print $query; ?>" target="_blank">「<?php print $query; ?>」をyahooで検索する</a><br>
    <p>このページをブックマークしてみましょう。<br>ブックマークからこのページにアクセスしても同じページが表示されます</p>
<?php
    }
?>
    <!-- 検索文字列送信用フォーム -->
    <form method="get">
        <input type="text" name="query" value="<?php if (isset($query) === TRUE) { print $query; } ?>">
        <input type="submit" value="送信">
    </form>
</body>
</html>

image

GETを利用し、Google、Yahoo、Bingという3つの検索サービスにて、同じキーワードで検索した場合の検索結果へのリンクを作成しています。

image

GETとPOSTの使い分けで説明した通り、検索キーワードごとに別々なURLになるため、上記のような検索キーワード入力済のページを個別にブックマークできます。

POST
ファイル名: post_sample.php


<?php
// 変数初期化
$gender = '';

if (isset($_POST['gender']) === TRUE) {
$gender = htmlspecialchars($_POST['gender'], ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>スーパーグローバル変数使用例</title>
</head>
<body>
<h2>性別を選択してください</h2>
<?php if ($gender === '男' || $gender === '女') { ?>
<p>あなたの性別は「<?php print $gender; ?>」です</p>
<?php } ?>
<form method="post">
<input type="radio" name="gender" value="男" <?php if ($gender === '男') { print 'checked'; } ?>>男
<input type="radio" name="gender" value="女" <?php if ($gender === '女') { print 'checked'; } ?>>女
<input type="submit" value="送信">
</form>
</body>
</html>

image

POSTでは、ラジオボタンのチェックした値を取得し表示しています。

image

URLの後ろにリクエストパラメーターは付与されておらず、上記のように性別を選択した後にブックマークをしても、表示されるのは選択前のページとなります。

GETやPOSTで送ることができるのはテキストボックスだけでなく、今回作成したラジオボタン、チェックボックスやセレクトボックスなど、ユーザが選択や入力可能な情報は全て$_GET又は$_POSTで受け取ることが可能です。

なおテキストボックスの場合は、ユーザが入力した値が送られてきましたが、ラジオボタンやチェックボックス、セレクトボックスの場合、value=""に指定した値が、$_GET又は$_POSTに送られてきます。

※セレクトボックスはvalueを指定しなかった場合、表示されている値が送信されます。

image

補足.変数の初期化

PHPに限らず、プログラミング言語には「変数の初期化」という概念があり、簡単に言えば変数に初期値を設定することを指します。

初期化の役割は色々とありますが、大きな役割の1つとして、値が代入されていない変数の参照防止があります。

image

NULL型の説明時にも紹介しましたが、値が代入されていない変数を参照すると、エラーが発生します。

PHPに限らず「すべての変数は参照される前に代入されていなければならない」ものであり、このような処理を記述してはなりません。

これを防ぐため、プログラム内で利用する変数の初期化を行います。

image

上記のように、変数に入れる値のデータ型に合わせて初期値を設定します。

変数初期化をどこまで行うかは意見が別れるところですが、最低でも値が代入されていない変数を参照しエラーが発生するコードは避けるべきですので、このような可能性がある変数は初期化をしましょう。

実際にPOSTの使用例として作成したpost_sample.phpでは、変数$genderの初期化をしています。


<?php
// 変数初期化
$gender = '';

if (isset($_POST['gender']) === TRUE) {
    $gender = htmlspecialchars($_POST['gender'], ENT_QUOTES, 'UTF-8');
}
?>

もし初期化をしていないと、GETでアクセスした場合に変数$genderに値を代入する処理がないため、変数$genderを参照している箇所でエラーが発生します。

まずは「Notice: Undefined variable」という変数の未定義エラーが発生しないプログラム作成を心掛けましょう。

またこの他にも初期化の役割はあり、特に配列に関しては、初期化をしたほうが良いことが多いです。今後紹介するサンプルプログラムでは必要に応じて変数初期化をしますので、なぜ行っているのかについて読み解くようにしましょう。

課題

以下のテキストボックス、ラジオボタン、チェックボックスをHTMLにて作成し、ユーザが選択した値をPOSTで受け取り、表示するプログラムを作成してください。

ファイル名:challenge_super_global.php

image

image

下記は回答イメージで、POSTで受け取った値の表示が行えれば、見た目は自由です。

image

NEXT LESSON ☛ for文を使った繰り返し処理

PREV LESSON ☛ スーパーグローバル変数とは

image


CodeCampus編集部
この記事を書いた人
CodeCampus編集部
まずは7日間お試し!人気プログラミング講座を無料公開中
オンライン・プログラミングレッスンNo.1のCodeCamp