【PHP】GETとPOSTの違いと使い分けの方法をフォームを作成して確認する

PHP

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を共有できるようになります。

PHP

Posted by devsakaso