phpにWebページから値を渡す

2018年3月27日

phpでサイトを作っていると、Webページからphpにデータを受け渡したくなることがあります。

urlクエリに応じて振る舞いを変えるページやフォーム入力データを加工するページを作るために、先日調べた内容を簡単にまとめます。

定義済み変数$_GETでurlクエリを読み込む

urlクエリの利用

urlクエリというのは、クライアントからサーバーに対してパラメータを渡すのに使用されます。通常のurlに「?マーク」に続けて「名前=値」の形式で指定します。複数の値を渡す場合は「&マーク」で区切ります。

先日作ったDE酒🍻のぉとは万年カレンダー機能のあるサイトなのですが、クエリなしurlでアクセスすると当月のカレンダーを表示しますが、クエリで年月を指定すると指定月のカレンダーを表示します。

今回のケースで言えばブラウザ(Webクライアント)からphp(サーバー)に対してyearなりmonthなりの値を渡し、phpサーバーが値に応じたhtmlを生成してブラウザに返しています。

定義済み変数$_GET

これらurlクエリの値はphpの定義済み変数$_GETを使って受け取ることができます。$_GETはクエリの名前をキーとして値を持つ連想配列になっています。

つまり上記の場合、$_GET[‘year’]の中身が2018、$_GET[‘month’]の中身が1ということになりますね。

このようにurlクエリを利用したデータの受け渡しはurlにバッチリ表示されてしまうので、パスワードの受け渡しのような用途には向いていません。

$_GET利用上の制約にはいくつかあるようですが、以下を押さえておけば良さそうです。

  • 送信内容が丸見え
  • 送信量に制限がある(具体的に何バイトかは調べてない)
  • 日本語を送信できない(urlで使用できる文字のみ可)

最後のものはパーセントエンコードすれば回避できますが、面倒くさいですね。

定義済み変数$_POSTでformデータを受け取る

formデータの利用

htmlのformタグを使ってデータを送ることができます。formにはテキストボックスやセレクトボックス、チェックボックス、ラジオボタン、ボタンなどの部品があり、これら部品の値を渡します。

具体的にはmethod属性にpostを設定したformタグ内の送信ボタン(type属性にsubmitを設定したinput要素)を押すと、各部品のvalue属性の値を渡します。

<form action="" method="post">
  名前:<input type="text" name="name" size="20" value="" /><br>
  年齢:<select name="age">
    <option selected value="0">-- 選択してください --</option>
    <option value="1">20歳未満</option>
    <option value="2">20代</option>
    <option value="3">30代</option>
    <option value="4">40代</option>
    <option value="5">50代</option>
    <option value="6">60代以上</option>
  </select><br>
  性別:<input type="radio" name="gender" value="male" />男性
    <input type="radio" name="gender" value="female" />女性<br>
  <input type="submit" value="送信" />
</form>

定義済み変数$_POST

こうして送信された各値はphpの定義済み変数$_POSTを使って受け取ることができます。$_POSTはname属性の値をキーとしてvalue属性の値を持つ連想配列になっています。

例えば先ほどのフォームの名前に「Takeru-chan」を入力し、年齢を「20歳未満」、性別を「男性」として送信ボタンを押すと、$_POST[‘name’]の中身がTakeru-chan、$_POST[‘age’]の中身が1、$_POST[‘gender’]の中身がmaleということになります。

先ほどのクエリ渡しと違って、これらの値は内部的に処理されます。

とはいえ普通のhttp(s)リクエストなので、パケットをキャプチャすれば簡単に読み取られるようですが。。。

この方法を利用して作ったのが半角⇒全角変換ツールになります。

formのaction属性

上記の例ではformのaction属性は空になっています。この場合、値の送信先は自身になります。つまり値を受ける$_POST変数を含むphpコードは同一ファイル内になければなりません。

ここでaction属性にurlを指定すると、値の送信先はそのurlになります。送信ボタンを押すとリンク先に移動して値を渡します。

上記入力フォームは純粋なhtmlファイルで作成しておいて、action属性に具体的に値を処理するphpファイルを指定するというような使い方になります。

formでGETしてもいい

ここまでGETリクエストはクエリ、POSTリクエストはformという書き方をしましたが、formのmethod属性はgetも受け付けます。というかmethod属性を指定しないと自動的にGETリクエストになるっぽい。

ここで「method=”get”」とした場合には、当然$_GET変数で受けることになります。このときformは自動的にそれぞれの値をクエリに変換してurlに付加します。この時日本語は自動的にパーセントエンコードされます。

ただまぁ、あえてGETリクエストを使う意味があるかどうかはわからないけれど。

こんな感じでインタラクティブな操作が扱えるようになると、できることが増えますよ。( ´ ▽ ` )ノ