PHPでフォームからデータを受け取る方法(GETとPOST)

プログラミング初心者向けに、PHPで【フォームからデータを受け取る】方法を初心者向けに解説した記事です。フォームからのデータの受け取り方法には、「GET」と「POST」の2通りがあるのでそれぞれ紹介します。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

プログラミング初心者向けに、PHPの基礎を紹介する記事です。

今回は、フォームからデータを受け取る方法について解説します。

最初にフォームの送信方法とPHPでの受け取り方に関しての説明をします。

その後、実際に動くコードを作成してデータの送受信を試していきます。

フォームでのデータのやりとりはWebサイトなどでは基本なので、ぜひ覚えておきましょう。

 

目次

開発環境はXAMPPを使っています。

 

GETとPOSTとは

PHPにおけるデータの受け取り方には、GETリクエスト POSTリクエスト を使う2通りの方法があります。

POSTリクエストはフォームからHTTP通信により送信され、送信データはリクエストの本体に含まれます。

GETリクエストはフォームやリンクからHTTP通信により同じように送信されますが、送信データはURLの最後にに続いて パラメータ名=値という形式で付加されます。

 

 

大石ゆかり

フォームを使ってデータを送信できるんですね。

田島悠介

そうなんだ。フォームから送ったデータを、PHPで取得できるんだよ。

大石ゆかり

いろいろなところで使われてそうですね。

田島悠介

そうだね。後、フォームじゃないんだけどURLの最後に?p=2とか/p2/もGETでデータを送ってることになるんだ。

多くは何ページ目とかに使われるね。HTMLでフォームを作って送信してみよう!

[PR] PHPプログラミングで挫折しない学習方法を動画で公開中

HTMLのフォーム

サーバにデータを送信するためには、HTMLのフォームを使います。

GETリクエストのフォーム

フォームの構造は次のようなコードです。

<form action = “index.php” method = “GET”>
<input type = “text” name =“comment/“><br/>
<input type = “submit” value =“送信/“>
</form>

formタグのaction属性に送信先のURLを指定します。

送信方法はデフォルトでGETリクエストですが、method属性で POSTかGETに指定できます。

formタグ内の inputタグの値が送信するデータです。

この時、name属性がリクエストパラメータ名になり、value属性の値やテキストボックスに入力された値がそのパラメータの値です。

上のコードでは、フォームのデータは、commentというパラメータ名で入力値とのペアで送られ、送信方法はGETリクエストになり、送り先は index.php です。

POSTリクエストのフォーム

POSTリクエストにしたい場合は、次のようにform要素のmethod属性をPOSTに変更するだけです。

<form action = “index.php” method = “POST”>
<input type = “text” name =“comment/“><br/>
<input type = “submit” value =“送信/“>
</form>

送信されるデータ

ここでは、例としてcommentという名前属性のinput要素に hogehogeという文字を入力して送信するとしましょう。

GETリクエストのデータ

データがURLの一部として含まれてサーバに送られます。

送信先は index.phpとすると、URL全体は次のようになります。

http://index.php?comment=hogehoge

ここで注目していただきたいのは、後に付けた?comment=hogehogeの部分です。

GETリクエストのデータは基本的には、 ? の後に パラメータ名=値のペアの形式で送られます。

複数のデータの場合は、間を & でつなげます。

http://index.php?comment=hogehoge&title=hello

このURLで送られるのは、

comment=hogehogeとtitle=helloという2つのデータ(パラメータ名=値のペア)です。

 

 

フォームデータの受け取り方

GETリクエストで送信したデータを受け取る

GETリクエストで送信したデータは、グローバル変数である $_GET に連想配列という形で入っています。

そこで、PHPでデータを受け取るときは、この $_GET を使います。

先ほどの例では、comment=hogehogeというデータが送られましたが、$_GETには、[‘comment’ => ‘hogehoge’] という連想配列で保存されます。

$_GETからデータを受け取るには、受け取りたいinput要素の name属性 をキーとして指定します。

例ではname属性が commentですから、 $_GET[‘comment’] という書き方です。

POSTで送信したデータを受け取る

同様に、POSTリクエストで送信したデータは、グローバル変数である $_POSTに連想配列という形で入っています。

PHPでデータを受け取るときは、$_GETで説明したように、 $_POST を使って、$_POST[‘comment’]と記述すれば値が取得できます。

 

受信データのバリデーション

フォームから送られてきた外部のデータは、開発者が想定していないようなデータである可能性があります。

場合によっては、悪意あるユーザーによって、危険なコードが含まれたデータが送られてくるかもしれません。

そのため、フォームデータを処理するには、まずそのデータが想定した値かどうか検証する(バリデーション)必要があります。

ここでは、データがPOSTリクエストによって送られてきたとします。

 

値が送信データに含まれているかをチェック

まず、送信データに入力データが入っているか確かめる必要があります。

そのためには、isset()や array_key_exists()メソッドを使います。

if ( !array_key_exists(‘comment’, $_POST){

  print “コメントは必須項目です。”;

}

こうすれば、必須項目で値が入っていない時はエラーを出力できます。

 

送信データが既定の文字数以下かをチェック

str_len()メソッドを使えば、値の文字数を取得できるので、それと比較したい文字数を以下のように比較します。

if ( str_len($_POST[‘comment’]) > 255 ) {

  print “コメントは255文字以下で入力してください。”;

}

 

他にもいろいろなバリデーションがあります。

 

Eメールの書式になっているかのチェックもできます。

詳しくはTechacademyのこの記事をご覧ください。

 

実際にコードを書いてみよう

以上の内容をおさらいするために、ここからは実際にコードを書いてフォームデータの送受信を試してみましょう。

HTMLでフォームを作る

PHPで実際にデータのやりとりをする前に、まずはHTMLを使ってフォームを作ります。

formタグのmethod 属性には、先ほどの GETリクエスト を指定しましょう。

これで、フォームからGETリクエストでデータを送信するということです。

<!DOCTYPE html>
<html lang = “ja”>
<head>
<meta charset = “UFT-8”>
<title>フォームからデータを受け取る</title>
</head>
<body>
<h1>フォームデータの送信</h1>
<form action = “index.php” method = “GET”>
<input type = “text” name =“comment/“><br/>
<input type = “submit” value =“送信/“>
</form>
</body>
</html>

 

ブラウザで表示すると次のようになります。

フォームデータの送信

これでフォームができました。

 

 

データを送信する(GET)

一度、データを送信してみましょう。

hogehoge と入力して送信ボタンを押してください。

hogehoge

 

すると、次のようにURLが変わります。

URL変化

注:フォームから送信を完了すると、多くのサイトでは「送信されました」といった別の完了ページに遷移します。しかしここでは、分かりやすくするために、同じファイルに送信します。

URLの?以下に、データが付加されていることをご確認ください。

form の name属性が comment なので、付加されるデータも comment=hogehoge になっています。

ここまでで送信フォームは完成しました。

続いて、受け取る側である、サーバ側のPHPプログラムの作成に移ります。

 

データを受け取る(GET)

ここで、まず送信したデータをきちんと受け取れるかを確認するために、受信側でデータを出力してみましょう。

<?php
$comment = $_GET[‘comment’];
echo $comment;
?>
<!DOCTYPE html>
<html lang = “ja”>
<head>
<meta charset = “UFT-8”>
<title>フォームからデータを受け取る</title>
</head>
<body>
<h1>フォームデータの送信</h1>
<form action = “index.php” method = “GET”>
<input type = “text” name =“comment/“><br/>
<input type = “submit” value =“送信/“>
</form>
</body>
</html>

 

先ほどと同じように、hogehoge と入力して送信を押します。

hogehoge

 

すると、ブラウザ上に「hogehoge」と表示されました。

hogehoge表示

これで、GETを使いデータを受け取る確認ができました。

 

ただ、このままでは、何も入力しないまま送信ボタンを押した場合、毎回エラーに飛んでしまいます。

エラーを出さずにデータを受け取ることができたときのみ処理されるように、バリデーションを追加したいと思います。

エラー

 

バリデーションを追加

PHPのif文(条件分岐) でバリデーションを追加したいと思います。

if文のなかに、「指定のデータを受け取ったときのみ」という条件式を書きます。

 

条件式には、先ほどご紹介した isset() というPHPの関数を使います。

isset は、(  )の中身に、指定のデータがセットされていれば真を返し、データがなければ偽を返すという関数です。

<?php
if(isset($_GET[‘comment’])){
$comment = $_GET[‘comment’];
echo $comment;
}
?>
<!DOCTYPE html>
<html lang = “ja”>
<head>
<meta charset = “UFT-8”>
<title>フォームからデータを受け取る</title>
</head>
<body>
<h1>フォームデータの送信</h1>
<form action = “index.php” method = “GET”>
<input type = “text” name =“comment/“><br/>
<input type = “submit” value =“送信/“>
</form>
</body>
</html>

 

if(isset($_GET[‘comment’])

最初のコードによって、$_GETグローバル変数に commentのパラメータが含まれているかチェックをしています。

あればその後の処理を実行します。

これで、データを入力せずに送信を押しても、エラーは発生しなくなりました。

フォームデータの送信

 

もちろん、データを入力して送信すれば、バリデーションチェックを通るので、入力値が画面に表示されます。

hogehoge

 

 

これで、バリデーションの追加ができました。

ここまでは、GETリクエスト でフォームデータの送受信をしていましたが、次からは、POSTリクエストを使って送受信をしてみましょう

 

 

フォームデータの送受信(POST)

POST で送りたい場合は、

  • $_GETから$_POSTに変更
  • formタグのmethod属性を GET から POST に変更

すればOKです。

<?php
if(isset($_POST[‘comment’])){
$comment = $_POST[‘comment’];
echo $comment;
}
?>
<!DOCTYPE html>
<html lang = “ja”>
<head>
<meta charset = “UFT-8”>
<title>フォームからデータを受け取る</title>
</head>
<body>
<h1>フォームデータの送信</h1>
<form action = “index.php” method = “POST”>
<input type = “text” name =“comment/“><br/>
<input type = “submit” value =“送信/“>
</form>
</body>
</html>

 

ブラウザ上で確認しましょう。

POSTリクエストのため、データはリクエスト本体に入って送られるので、URLには何も表示されませんが、送信先の画面にデータがしっかり表示されているのがわかると思います。

POSTブラウザ

 

 

GET と POST の使い分け

GET では送りたいデータを直接URLに付加するので、URLを見ればサーバにどういうリクエストを送ったのかが明らかです。

検索フォームなどでGETリクエストが使われることが多いですが、検索内容をURLとして保存して後で利用したり、誰かとシェアしたりしたい場合は、GET が適しているでしょう。

GETリクエストはGoogleの検索エンジンなどにも使われています。

Googleの検索エンジンでは、検索窓にワードを入力して検索した時のURLには、q = ○○ という形で書き込んだキーワードが表示されます。

これは、q というのが検索窓の name属性で、画面の検索内容はhogehogeであることを示しています。

 

一方で、URLには長さの制限がありますので、大きなデータを送信するには向いていません。

また、パスワードのような秘匿したいデータの場合では、URLに直接表示されるGETリクエストは使えません。

そのような場合は、POSTリクエストを使うべきです。

用途によってGETリクエストとPOSTリクエストを使い分けると良いでしょう。

今回の記事は以上です。

 

執筆してくれたメンター

メンター安野

Webアプリケーションエンジニアとして長年健診業界で業務システムの開発に従事してきました。
TechAcademyではPHP/Laravelコースを担当しています。
開発実績: 健康診断システム、電話予約システム、検査管理システム、各種データ処理ツール

 

大石ゆかり

GETやPOSTで送信できました!ただ、どちらが良いのか迷ってしまいますね。

田島悠介

GETはURLに付くべき処理に向いているかな。何ページ目とか、カテゴリーやタグは何なのかって指定は、URLを通してGETで受け取って、データベースに問い合わせみたいな感じかな。

大石ゆかり

POSTは、本文が長い場合に多い感じですかね。掲示板とかショッピングサイト入力欄とかPOSTになってますよね。今思い返したんですが。

田島悠介

そうだね。SSL通信だとPOSTの内容も暗号化されるので、セキュリティに関わる物などもPOSTがいいね。

 

PHPを学習中の方へ

これで解説は終了です、お疲れさまでした。

  • つまずかず「効率的に」学びたい
  • 副業や転職後の「現場で使える」知識やスキルを身につけたい

プログラミングを学習していて、このように思ったことはありませんか?

テックアカデミーのPHP/Laravelコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。

合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、PHP/Laravelを使ったWebアプリケーション開発を学べます。

まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。

時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!