【PHP】GETとPOSTの違いと使い分けの方法をフォームを作成して確認する
HTTPのGETとPOSTの違いを知るために、簡単なフォームを作成します。
まずは、PHPとHTMLを使ったフォームに何かを入力して、ボタンを押すとGETメソッドによりサーバーにデータが送信されて、
サーバーがリクエストされたパラメータを元に画面を表示する仕組みを作成します。
その後、同じようにPOSTメソッドでもフォームを作成し、GETとPOSTの違いを確認します。
また、GETとPOSTの特徴を活かした使い分けも紹介します。
GETメソッドでフォームを作成(index.php)
ファイル構成
∟index.php
∟get.php
<form action="get.php" method="GET">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="送信">
<!-- <button type="submit">送信</button> -->
</form>
formタグのaction属性では、フォームの内容を送信する先のパスやURLを指定します。
action属性を設定することで、ボタンなどが押されたときに、そのURLやパスに対してリクエストを送信できます。
パスは相対パスでも絶対パスでも指定可能です。
ボタンについては、inputタグかbuttonタグでtype属性をsubmitにすることで送信ボタンとして機能させることができます。
name属性で送信された入力内容を通知することができます。
たとえば、passwordならpasswordというわかりやすいname属性の値にしてあげることで、通知された内容が明確になります。
ボタンを押すことで、サーバー上にリクエストが送信されます。
リクエストを表示(get.php)
<p>入力された名前: <?php echo $_GET['username']; ?></p>
<p>入力されたpwd: <?php echo $_GET['password']; ?></p>
<!-- 入力された名前: 山田太郎 -->
<!-- 入力されたpwd: yamadataro -->
get.phpで、送られてきたパラメータを取得します。
getメソッドで取得するときは、$_GET[]の連想配列にパラメータが格納されます。
$_GET[]はスーパーグローバル変数でPHPファイルのどこからでも参照できる
自動的に設定される連想配列です。
連想配列のため、$_GET[]のカッコ内にほしいキーを指定することでその値を取得できます。
フォームでリクエストを送信
index.phpで値をusernameに山田太郎、パスワードにyamadataroと入力すると、
URLのパスは以下のようになります。
get.php?username=山田太郎&password=yamadataro
POSTメソッドでフォームを作成(index.php)
ファイル構成
∟index.php
∟post.php
<form action="post.php" method="POST">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="送信">
<!-- <button type="submit">送信</button> -->
</form>
method部分でGETからPOSTに変更するだけで、
そのほかは同じです。
リクエストを表示(post.php)
<p>入力された名前: <?php echo $_POST['username']; ?></p>
<p>入力されたpwd: <?php echo $_POST['password']; ?></p>
<!-- 入力された名前: 山田太郎 -->
<!-- 入力されたpwd: yamadataro -->
post.phpで、送られてきたパラメータを取得します。
POSTメソッドで取得するときは、$_POST[]の連想配列にパラメータが格納されます。
$_POST[]はスーパーグローバル変数でPHPファイルのどこからでも参照できる
自動的に設定される連想配列です。
連想配列のため、$_POST[]のカッコ内にほしいキーを指定することでその値を取得できます。
フォームでリクエストを送信
index.phpで値をusernameに山田太郎、パスワードにyamadataroと入力すると、
URLのパスは以下のようになります。
post.php
GETメソッドと違い、URLにパラメータはありません。
その代わり、検証ツールのPayload部分にForm Dataというのがありますが、それがBody部分に
検証ツールでの確認方法
Chromeの検証などの開発ツールを開き、Networkタブを開いてcontrol+Rもしくはcommand+Rで更新すると、
リクエストの内容を確認できます。
GETメソッドの場合は、Request URLという項目に、パラメータがあります。
また、Payloadでも送信したパラメータの内容を確認することができます。
GETとPOSTの使い分け
GETはその特性上、データを取得する際に使うメソッドです。
POSTは基本的にはデータの更新や作成をする際に使うメソッドです。
どういうことか、下の例で確認してみます。
- POSTではパラメータを隠すことができる
- URLは最大2000文字程度までしか設定できない
- GETではパラメータを含めてURLをシェアできる
たとえば、ブログなど、記事というものは文字数が多くなるので、URLに含めるには適していないです。
そのため、GETではなくPOSTを使って、BODYにパラメータを設定します。
このように、URLにパラメータを設定するか、BODYにパラメータを設定すべきかでGETとPOSTを使い分けます。
GETではパラメータを含めてURLをシェア
こちらは以下の例で確認できます。
<?php
// 連想配列データ(本来はデータベースからとってくる)
$participants = [
'1' => [
'name' => 'ken',
'age' => 25,
],
'2' => [
'name' => 'nanako',
'age' => 16,
],
'3' => [
'name' => 'yoiko',
'age' => 62,
],
];
// idがないときは1を代入
$id = $_GET['id'] ?? 1;
$participant = $participants[$id];
$name = $participant['name'];
$age = $participant['age'];
?>
<div><?php echo "{$name}さんは{$age}才です。"; ?></div>
<!-- idが1、もしくは未入力のとき→kenさんは25才です。 -->
<!-- idが2→nanakoさんは16才です。 -->
<!-- idが3→yoikoさんは62才です。 -->
??はnull合体演算子です。
もしGETのidのパラメータが設定されていないときは、1を代入します。
null合体演算子についてはnull合体演算子の使い方を参考にしてみてください。
上の連想配列部分は、本来はデータベースからデータを取得してきます。
idを変更すると、取得できるデータが変化します。
GETメソッドを使用しているため、URLには、url?id=1などの形式になり、簡単にURLを共有できるようになります。