PHP – HTMLフォームからのデータの受け取り方

ブラウザとWEBサーバー間のデータ通信であるHTTPプロトコルはOSI参照モデルのセッション層に属しており、ブラウザ上のHTMLフォームに入力したデータをサーバーに引き継ぐGETメソッドとPOSTメソッドもHTTPプロトコルに定義されています。

WEBサーバーはUTF-8N形式でエンコードしてブラウザに返すため、Windowsで作成したShift-JIS形式の文章をサーバーにアップロードして、ブラウザからサーバーにページ要求した場合、サーバーがUTF-8Nでエンコードしたときに文字化けが発生します。

フォーム部品のinputタグのtype属性の値にはtext(テキストボックス)やsubmit(送信ボタン)があり、これらの最初と最後を囲って入力値を送信するのがformタグで、action属性に処理ファイル名、type属性に送信方法(POSTかGET)を指定すると「HTTPプロトコルのPOSTメソッドを用いてmail等のフィールド名のコントロールに格納された値をtarget.phpに渡してね」と意味づけできます。

クライアントとサーバー間の通信

ネットワーク通信構造を7階層のプロトコルに分けたのがOSI参照モデルなんですが、クライアント(Webブラウザ)とWebサーバとがデータを送受信するのに使われるのがHTTPプロトコル。OSI参照モデルではセッション層に属しています。

  • 7. アプリケーション層(HTTP,FTP,DNS)
  • 6. プレゼンテーション層(HTTP,FTP,DNS)
  • 5. セッション層(HTTP,FTP,DNS)
  • 4. トランスポート層(TCP)
  • 3. ネットワーク層(IPルーティング)
  • 2. データリンク層(Ethernet)
  • 1. 物理層(UTPケーブル, ネットワークアダプタ)

HTMLフォームにデータを入力させて、ブラウザからデータをサーバーのファイルに引き継ぐ場合に使うのがGETメソッドかPOSTメソッドで、これらは全部HTTPプロトコルの中に定義されています。

クライアントPCで作成するPHPやHTMLファイルは、Windows上で文字コードに1対1で変換されて保存されます。このときUTF-8Nでエンコード(符号化)することにより、サーバーがクライアントに表示する際のエンコードが正しくUTF-8Nで行われ、クライアントPCでのデコード(復号化)も同じくUTF-8Nで行われます。

以下はアップロードしたファイルの文字コードとサーバーのエンコードが異なることによる文字化けの例。

  1. PCで文章を書いて自動的にShift-JISでエンコード化され保存
  2. クライアントからサーバーにページアップロード
  3. クライアントからサーバーにページ要求
  4. サーバーはクライアントに文章をUTF-8Nでエンコードして表示
  5. 文字化け



フォーム部品

フォーム部品は入力を受け付ける部品とデータを送信する部品(inputタグ)があり、type属性、name属性、value属性、size属性、maxlength属性、placeholder属性(うっすら表示)などが付けられます。

inputタグのtype属性の値にはtext(テキストボックス)、submit(送信ボタン)、password、hidden(フォーム部品を表示させる何かを送る)、checkbox(チェックボックス)、radio(ラジオボタン)などがあります。

<form action="target.php" method="post">
    <input type="text" name="mail"></input>
    //チェックボックス
    <input type="checkbox" name="hp1" value="iphone">iPhone</input>
    <input type="checkbox" name="hp2" value="android">Android</input>
    <input type="checkbox" name="hp3" value="blackberry">Blackberry</input>

    //ラジオボタン(複数のラジオボタンに同じname属性の値を付けることでグループ化)
    //チェックボックスやラジオボタンは値を入力できないのでvalueを持たせる。
    <input type="radio" name="nilai" value="good" checked="checked">Good</input>
    <input type="radio" name="nilai" value="bad">Bad</input>

    //セレクトボックス
    <select name="city">
        <option value="fukuoka">Fukuoka</option>
        <option value="tokyo">Tokyo</option>
    </select>

    //テキストエリア
    <textarea cols="40" name="comment" rows="5">コメントをどうぞ</textarea> 

    //送信ボタン 
    <input type="submit" name="send1"></input> 

</form>

 

最後にこれらのフォーム部品の最初と最後を囲って入力値を送信するのがformタグで、action属性にファイル名、type属性に送信方法(POSTかGET)を指定します。これで「HTTPプロトコルのPOSTメソッドを用いてmail等のフィールド名のコントロールに格納された値をtarget.phpに渡してね」という意味になります。

form1

連想配列のキーと値の取得方法

サーバーにあるtarget.phpでは、テキストボックスに入力された値をnameをキーとした$_POSTという連想配列で受け取ります。name属性に配列のキーを指定していましたので$_POST[‘email’]で入力した値を取得できます。

送信されてきた連想配列のキーはarray_keys関数で取得できますので、$_POSTのキーを配列変数(ここでは$params)に格納し、キーをインクリメントしながら動的に1つずつ値を取り出すこともできます。これは$paramsには、フォーム内にある複数のコントロールのnameを出現順に値として格納しているからです。

//ボタン複数の場合name属性まで指定して連想配列の値の有無をチェック
if(isset($_POST['send1'])){

    //配列のキー(name属性)を直接指定し値を取得
    //$_SESSION['email']=$_POST['mail'];
    //$_SESSION['nilai']=$_POST['nilai'];

    //array_keys関数は配列のキーを取得する関数
    $params=array_keys($_POST);
 
    foreach($params as $key=>$value){
        //ダブルクオーテーション内では変数展開する
        $_SESSION["$value"]=$_POST["$value"]."<br>";
    }
}

ちなみにPHPでは通常の変数と同じく配列変数も事前に宣言は必要なく、存在しない配列に$params値を格納しようとすると配列が自動的に作成されます。

result1

チェックボックスのキーに配列を使用するとき

チェックボックスのキーを配列hp[]にすると$_POST[‘hp’]には配列(キーは数字)となって渡されるので、target.phpにて配列型変数$hpに移してからキーと値を取り出します。

<form action="target.php" method="post">
    //チェックボックスのキーに配列を使用
    <input type="checkbox" name="hp[]" value="iphone">iPhone</input>
    <input type="checkbox" name="hp[]" value="android">Android</input>
    <input type="checkbox" name="hp[]" value="blackberry">Blackberry</input>

    <input type="submit" name="send2"></input>
</form>

フォームから送られてきた配列型変数hpからforeach(配列変数 as 値変数)で配列の値を取得できますが、foreach(配列変数 as キー変数 => 値変数)で配列のキーと値を同時に取り出すこともできます。

if(isset($_POST['send2'])){
    //hpも配列型変数
    $hp=$_POST['hp'];

    //配列の値のみ取得する場合
    //foreach($hp as $value){
    //    print $value."<br>";
    //}
    //配列のキーと値を取得する場合
    foreach($hp as $key=>$value){
        print $key."=".$value."<br>";

    }
}

チェックボックスのキーに配列を指定する場合、そのままarray_keys関数を使うと’Array’そのものが所得されてしまうので、配列となって送られてくる$_POST[‘hp’]をPHP側で配列変数に代入し、キー(数字)と値を取得する。
result2