phpでサイトを作っていると、Webページからphpにデータを受け渡したくなることがあります。
urlクエリに応じて振る舞いを変えるページやフォーム入力データを加工するページを作るために、先日調べた内容を簡単にまとめます。
定義済み変数$_GETでurlクエリを読み込む
urlクエリの利用
urlクエリというのは、クライアントからサーバーに対してパラメータを渡すのに使用されます。通常のurlに「?マーク」に続けて「名前=値」の形式で指定します。複数の値を渡す場合は「&マーク」で区切ります。
先日作ったDE酒🍺のぉとは万年カレンダー機能のあるサイトなのですが、クエリなしurlでアクセスすると当月のカレンダーを表示しますが、クエリで年月を指定すると指定月のカレンダーを表示します。
- 今月の表示:https://www.takeru-chan.com/deshu.php
- 2018年1月の表示:https://www.takeru-chan.com/deshu.php?year=2018&month=1
今回のケースで言えばブラウザ(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リクエストを使う意味があるかどうかはわからないけれど。
こんな感じでインタラクティブな操作が扱えるようになると、できることが増えますよ。( ´ ▽ ` )ノ