PHPのPOST配列を完全に理解するために

2018年9月20日

PHPで作成したウェブサイトではユーザーが入力した内容(住所など)をサーバー側で受け取ることがあります。

こういった場面で使用されるのが「POST」という機能でユーザーが入力した内容はPOST配列($_POST)の中に格納されサーバー側に戻ってきます。

では実際にどう入力された情報をとりだすのかというところを書き留めます。

配列を正しく理解する

配列は複数の要素を1つにまとめるものですが大事なのが「キー」と「値」の関係を正しく理解すること。この理解が曖昧だと、POST配列のコードを書くときよくわからなかったり迷いが生じます。

配列は複数の要素を一つにまとめることのできるものですが、PHPの配列には情報は「キー」と「値」のペアで1つの要素となります。「値」があるのに「キー」がないということはあり得ないということです。

「キー」というのは配列の要素名です。「値」はその中身です。

例えば「アドレス」という名前の配列を考えてみます。この時「氏名」「住所」「電話番号」などが「キー」でその実際の内容が「値」です。

「住所:茨城県つくば市」という場合ですと「住所」が「キー」=「要素名」で「茨城県つくば市」が住所という「キー」に対応する「値」です(「住所」というのは任意でつけた名前で何でもいいです。名前の付け方は後述します)

「キー」と「値」は1対1の関係にあるので、一つのキーに複数の値が割り振られはいけません。

住所が複数ある場合などは「住所1」「住所2」など、別の要素に分けてそれぞれ入力する必要があるということです。あるいは2つの住所を1つの配列にまとめます。

テキストボックスに入力した内容を送信する

これらを踏まえてPOST配列を考えてみます。

例えばウェブサイトから住所を入力するためのコードを考えると、このような形になると思います。

   <?php
    <form action="$_SERVER[PHP_SELF]" method="post">
    <input type="text" name="address">
    <input type="submit" value="送信">
    </form>

action="$_SERVER[PHP_SELF]"の$_SERVER[PHP_SELF]というスーパーグローバル配列は現在のページへのパスを表します。

つまり(submitボタンを押すことで)入力内容がPOSTされるとこのページ自身にPOST配列を送信するということになります。

こうして送信されたPOST配列は同一ページの他の部分でも使うことが出来ます。

input type="text"はテキスト入力用のテキストボックスを表示するコードです。その下の行は、テキストボックスに入力した内容を送信するためのボタンを表示します。valueを「送信」としていますが、こうすることで「送信」と書かれたボタンが設置されます。この値は何でも構いません。

このままでは何かをテキストボックスに入力して送信しても何も起こりません。例えば上のコードに続けて

print $POST['address'];

と追加した上でテキストボックスに文字列を入力して「送信」ボタンをクリックするとページがリロードされ、テキストボックスに入力した内容が表示されます。

ここでPOST配列ですが「input type="submit" value="送信"」のコードによりPOST配列を返します。

その上に「input type="text" name="address"」とありますが、ここのname="address"のところがPOST配列の「キー」になります。値はテキストボックスに入力した内容です。

従ってPOST配列のaddressキーに対応する値(ここではテキストボックスに入力した内容)は$POST['address']でアクセス可能です。$POST[ ]というのは配列、'address'の部分がその要素名です。

ちょっと混乱しますがinput type="submit" value="送信"のところ。input typeがsubmitの場合、valueはボタンのラベルとなります。つまり「送信」と書かれたボタンが表示され、これをクリックすることで初めてデータが送信されます。あて先はこのコードが書かれているページ自身です(action="$_SERVER[PHP_SELF]"としているため)

応用編 チェックボックスなど

ではチェックボックスやプルダウンメニューの場合はどうなるでしょうか。以下のコードを見てください。

<form action="$_SERVER[PHP_SELF]" method="post">
        <select name="category" size="7">
        <option value="wood">木工</option>
        <option value="lthr">革細工</option>
        <option value="blsm">鍛冶</option>
        <option value="amr">甲冑</option> 
        <option value="alc">錬金</option>
        <option value="sew">裁縫</option> 
        <option value="grv">彫金</option>
        <option value="cook">料理</option> 
        </select>
<input type="submit" value="選択してください">

ちょっとわかりづらいですが木工~料理までの7択から1つを選ぶコードです。これを(「選択してください」ボタンをクリックして)POSTするとPOST配列がこのページに送信され、リロードされます。

2行目のnameに"category"と指定があるのでこれがPOST配列での「キー」となります。その時の「値」はvalue=で指定したものです。よってこの選択肢から選んだものは$_POST['category']でアクセス可能です。

「木工」を選んでクリックした場合、「キー」は「category」で「値」は「wood」です。なので$_POST['category']の中身は「wood」になります。「革細工」を選んだ場合は「キー」は「category」で「値」は「lthr」、$_POST['category']の中身は「lthr」となります。他も同様です。

あとvalue="wood"などは必ずしも付ける必要はありません。付けない場合は[木工]が[カテゴリー]キーに対する「値」となります。

なお、複数の選択肢を選んでポストするには上記2行目を以下のコードと差し替えます。multipleというオプションをつけcategoryのところに[]をつけて配列にしてあります。こうするとCtrl+クリックで複数の選択が可能となります。

<select name="category[]" size="7" multiple>

このようにした場合は$_POST['category'][0]、$_POST['category'][1]のように参照可能です。

  • この記事を書いた人

ともぞう

アラフォーのサラリーマンです。ほかに『Chrome通信』や『初心者による初心者の為のウイスキーの話など。』などを運用しています。