PHPでフォームからデータを受け取る方法(GETとPOST)
プログラミング初心者向けに、PHPで【フォームからデータを受け取る】方法を初心者向けに解説した記事です。フォームからのデータの受け取り方法には、「GET」と「POST」の2通りがあるのでそれぞれ紹介します。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
プログラミング初心者向けに、PHPの基礎を紹介する記事です。
今回は、フォームからデータを受け取る方法について解説します。
最初にフォームの送信方法とPHPでの受け取り方に関しての説明をします。
その後、実際に動くコードを作成してデータの送受信を試していきます。
フォームでのデータのやりとりはWebサイトなどでは基本なので、ぜひ覚えておきましょう。
目次
開発環境はXAMPPを使っています。
GETとPOSTとは
PHPにおけるデータの受け取り方には、GETリクエスト と POSTリクエスト を使う2通りの方法があります。
POSTリクエストはフォームからHTTP通信により送信され、送信データはリクエストの本体に含まれます。
GETリクエストはフォームやリンクからHTTP通信により同じように送信されますが、送信データはURLの最後に?
に続いて パラメータ名=値
という形式で付加されます。
フォームを使ってデータを送信できるんですね。
そうなんだ。フォームから送ったデータを、PHPで取得できるんだよ。
いろいろなところで使われてそうですね。
そうだね。後、フォームじゃないんだけどURLの最後に?p=2とか/p2/もGETでデータを送ってることになるんだ。
多くは何ページ目とかに使われるね。HTMLでフォームを作って送信してみよう!
[PR] PHPを学んで未経験からWebエンジニアを目指す方法とは
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 と入力して送信ボタンを押してください。
すると、次のように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」と表示されました。
これで、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のパラメータが含まれているかチェックをしています。
あればその後の処理を実行します。
これで、データを入力せずに送信を押しても、エラーは発生しなくなりました。
もちろん、データを入力して送信すれば、バリデーションチェックを通るので、入力値が画面に表示されます。
これで、バリデーションの追加ができました。
ここまでは、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には何も表示されませんが、送信先の画面にデータがしっかり表示されているのがわかると思います。
GET と POST の使い分け
GET では送りたいデータを直接URLに付加するので、URLを見ればサーバにどういうリクエストを送ったのかが明らかです。
検索フォームなどでGETリクエストが使われることが多いですが、検索内容をURLとして保存して後で利用したり、誰かとシェアしたりしたい場合は、GET が適しているでしょう。
GETリクエストはGoogleの検索エンジンなどにも使われています。
Googleの検索エンジンでは、検索窓にワードを入力して検索した時のURLには、q = ○○ という形で書き込んだキーワードが表示されます。
これは、q というのが検索窓の name属性で、画面の検索内容はhogehogeであることを示しています。
一方で、URLには長さの制限がありますので、大きなデータを送信するには向いていません。
また、パスワードのような秘匿したいデータの場合では、URLに直接表示されるGETリクエストは使えません。
そのような場合は、POSTリクエストを使うべきです。
用途によってGETリクエストとPOSTリクエストを使い分けると良いでしょう。
今回の記事は以上です。
執筆してくれたメンター
メンター安野
Webアプリケーションエンジニアとして長年健診業界で業務システムの開発に従事してきました。 |
GETやPOSTで送信できました!ただ、どちらが良いのか迷ってしまいますね。
GETはURLに付くべき処理に向いているかな。何ページ目とか、カテゴリーやタグは何なのかって指定は、URLを通してGETで受け取って、データベースに問い合わせみたいな感じかな。
POSTは、本文が長い場合に多い感じですかね。掲示板とかショッピングサイト入力欄とかPOSTになってますよね。今思い返したんですが。
そうだね。SSL通信だとPOSTの内容も暗号化されるので、セキュリティに関わる物などもPOSTがいいね。
PHPを学習中の方へ
これで解説は終了です、お疲れさまでした。
- つまずかず「効率的に」学びたい
- 副業や転職後の「現場で使える」知識やスキルを身につけたい
プログラミングを学習していて、このように思ったことはありませんか?
テックアカデミーのPHP/Laravelコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。
合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、PHP/Laravelを使ったWebアプリケーション開発を学べます。
まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。
時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!