Skip to main content

GETとPOSTのデータ送信

クライアントからサーバーへのデータ送信

ここまでは、サーバー上にコンテンツを置いて、それをウェブブラウザで取得する方法を見てきた。しかし、逆にウェブブラウザからサーバーへデータを送る必要がある場合もある。

ログインページを考えてみよう。ユーザー名とパスワードを入力すると、そのデータをサーバーに送信しなければならない。サーバーはデータベースを確認して、ユーザー名とパスワードが一致すればブラウザにログインを認識させる。

ウェブ開発では、クライアントからサーバーへデータを送る方法が2つある。GETとPOSTだ

GET

GETは短い文字列や値を送るときに使う。GETの値をクライアントからサーバーへ渡すには、以下のようにURLの末尾に書く。

http://www.mywebsite.co.jp/mypage.php?変数A=値A;変数B=値B ...

URLの末尾に「?」を付けて、その後がGETの値であることを示す。そして、各値のペアを「;」(セミコロン)で区切って渡す。

例えば、Googleで「大原学園」を検索したいとする。Googleにアクセスして検索語を入力してもいいが、単純に次のようにすることもできる

https://www.google.com/search?q=大原学園

ここでは、「q」(query、つまり検索)という1つの値として「大原学園」をGoogleに渡している。

PHPでは、$_GETという特別なグローバル連想配列を通してGETパラメータを取得できる。以下の演習をやってみよう。

<?php
	// get_example.phpで保存してください
    
	// "name"のパラメータが設定されている?
	if (!isset($_GET["name"]))
	{	
		print("お名前を教えてください");
	}
      
	else
	{
		$name = $_GET["name"];
		print("こんにちは、" . $name . "さん。");
	}
?>

ここでisset()は、そのGET変数が存在するかどうかをチェックしている。では、ブラウザを開いて次を試してみてください。

http://localhost/get_example.php?name=一郎

image.png

見ての通り、変数「name」が正しく読み込まれて表示されている。今度はURLに2つ目のパラメータ「age」(年齢)を追加してみよう。

<?php
	// get_example.phpで保存してください
    
	// "name"のパラメータが設定されている?年齢も?
	if (!isset($_GET["name"]) || !isset($_GET["age"]))
	{	
		print("お名前と年齢を教えてください");
	}
	
	else
	{
		$name = $_GET["name"];
		print("こんにちは、" . $name . "さん。");
		
		$beerOk = $_GET["age"] >= 20;
		if ($beerOk)
			print("ビールはいかがでしょうか?");
		else
			print("コーラを飲みませんか?");
	}
?>

そして次を試してみてください。

http://localhost/get_example.php?name=一郎&age=19

image.png

ちょっとした遊びとして、今度はパラメータを何も渡さずに試してみよう。

http://localhost/get_example.php

どうなるか見てみてください。

POST

POSTもブラウザにデータを送るもう一つの方法だ。画像やテキストファイルのような、文字列ではない情報を送るときによく使われる(例えば、Instagramの投稿に画像を添付するとき、それはPOSTで送信されている)。POSTは小さなパラメータを送るのにも使われるが、URLには表示されないので、ユーザーが直接それを編集できないという特徴がある。

POSTのデータはURLに表示されないため、サーバーへデータを送るには特別な方法が必要になる。ブラウザがPOSTでサーバーへデータを送れるように「HTMLフォーム」を作る必要がある。まずは、先ほどの例と同じ2つのパラメータを持つ、シンプルなHTMLフォームを作ってみよう。

<!-- post_form.html として保存してください -->
<meta charset="utf-8">
<form action="get_example.php" method="get">
	<input type="text" name="name" value="一郎">
	<input type="text" name="age" value="19">
	<input type="submit">
</form>

これはフォームのごくシンプルな例だ。1行ずつ見ていこう。

コード 説明
<meta charset="utf-8">
文字コードを設定している。漢字やかなを使うためUTF-8を使用している
<form action="get_example.php" method="get">
フォームの開始。フォームが送信されると、値はGETモードでget_example.php に送られる
<input type="text" name="name" value="一郎">
<input type="text" name="age" value="19">

get_example.phpへ2つのテキスト変数(「name」と「age」)を送る。

 

デフォルト値は「一郎」と「19」

<input type="submit">

送信ボタンを表示する。このボタンを押すと値が get_example.php に送られる

</form>

フォームの終了

ブラウザで http://localhost/post_form.html を開いて、送信ボタンを押してみてください。

image.png

見ての通り、これは同じパラメータをURL経由(GETモード)で渡しているだけだ。今度はこれをPOSTに切り替えてみよう。まず、フォームの中の

<form action="get_example.php" method="get">

<form action="post_example.php" method="post">

に置き換えてください。

次にPHPスクリプトを編集して、$_GET の代わりに $_POST から読み込むようにする必要がある。get_example.php をコピーして post_example.php という名前に変更し、次のようにしよう。

<?php
	// post_example.phpで保存してください
    
	// "name"のパラメータが設定されている?年齢も?
	if (!isset($_POST["name"]) || !isset($_POST["age"]))
	{	
		print("お名前と年齢を教えてください");
	}
	
	else
	{
		$name = $_POST["name"];
		print("こんにちは、" . $name . "さん。");
		
		$beerOk = $_POST["age"] >= 20;
		if ($beerOk)
			print("ビールはいかがでしょうか?");
		else
			print("コーラを飲みませんか?");
	}
?>

そしたらフォームを再読み込みして、もう一度試してみてください。見ての通り、今度はURLにパラメータが表示されていない。

image.png

ブラウザだけじゃない!

ここまではブラウザを使ってサーバーへデータを送るテストをしてきた。これはとてもよくある使い方だけど、それだけではない。どんなアプリケーションでも、GETとPOSTを使ってウェブサーバーにデータを送ることができる。Unityの授業では、UnityWebRequest クラスを使って自分のUnityゲームからPHPサーバーへデータを送る方法を後で学ぶ。