【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