この章ではフォームについて説明します。
会員登録で名前、住所などを入力したことがあると思いますが、これがフォームです。
フォーム自体はHTMLで作るのですが、その入力した内容をサーバーに送るにはPHPを使います。
以下のプログラムはHTMLで作成しています。
ファイル名は
ここから「名前」「メールアドレス」などの情報を送信して、PHPプログラムで処理するというプログラムを作成します。
この例で説明しますと
method属性にはサーバへの送信方法を指定します。
フォームからサーバへの送信方法にはPOSTとGETの2つがあります。POSTを指定した場合、フォームに入力したデータはHTTPプロトコル(後ほど補足で説明します)という通信の機能によりリクエストボディつまり本体部分に入力されてサーバに送られますが、送る文字数には制限はありません。
POSTの場合は入力したデータの他にもWebブラウザの種類やバージョンなどの情報、どの言語を使っているか、どのサイトから訪問してきたかなどの情報も一緒に送信します。
GETはURLの後ろに
複数の情報を付加する場合には
つまり
例えば
つまり、フォームの送信データがURLとして渡されると言うことです。
そのため送信する情報には制限が有り、最大で約2000文字位です。
例を示すとヤフーなどで検索していると
そして、サーバはその検索語を元に検索結果を返しています。
get方式でデータを送るときにはmethodの値をgetに変更します。
HTTPプロトコルとはユーザーのコンピューターとサーバの間のやり取りに関する通信規約であり、ユーザーのブラウザからリクエストを発信し、その結果をサーバがレスポンスするとその処理が完結すると言う単純な構造から出来ています。
size属性はテキストボックスの横幅で、valueは入力欄の初期値です。
name 属性はtextに名前を付けるためにあります。
colsは1行に入力できる文字数です。
name属性はradioに名前を付けるためにあります。
name属性はセレクトボックスに名前を付けるためにあります。
name属性はチェックボックスに名前を付けるためにあります。
value属性にはsubmitボタンに付ける名前を書きます。
次は送信先のPHPの部分について説明します。
以下のファイルは
ユーザーが送信ボタンを押すとmthodに指定した方式で送信されます。
post方式は大量のデータを送るときに便利です。
例えばpost方式で送信した以下のフォームのメールアドレスのデータを得たいのであればname属性の値をキーとして
getの場合はフォームのmethodの部分を以下の通りgetと書きます。
では具体的に
フォームから送信されたデータを受け取るには送信方法がPOSTであれば
まずはPOSTから説明します。
フォームで入力された氏名を受け取りたいのであれば
name属性の値を連想配列のキーに入れます。
では実際、PHP側でどのようにデータを受け取っているかを見てみましょう。
例えば
つまり
ですので、
結果は
「htmlspecial」はユーザー定義関数ですが、これについては後ほど説明します。
次にempty関数について説明します。
通常、フォームからデータを送った時、そのデータが間違っていないのかをチェックする必要があります。
例えば名前が入力しているかどうかをチェックして、入力していないのならば入力するようにメッセージを表示することが必要になります。
会員登録で名前の入力が間違っていて、もう1度入力するようにメッセージを表示された経験が1度はあると思います。
empty関数は引数に値が入っているかどうかを確認する関数であり、〇数字の0
〇文字列の
〇null
の場合はTRUEで、それ以外はFALSEを返します。
nullとは何も変数に入ってない状態をさします。
ですので
似たような関数としてisset関数があります。
この関数は変数がセットされているのかを調べる関数です。
変数 が NULL 以外であれば TRUE、そうでなければ FALSE を返します。
以下のようにissetは値がカラでもTRUEを返すので、送信データがカラでもそのまま警告もなく進んでしまいます。
「値が入っている」
カラではなくで本当に値が入っているか確認するにはempty関数かstrlen関数を使いましょう。
strlen関数については説明しましたが、もう一度復習しましょう。
引数に文字列を設定すると長さを返してくれます。
長さとはバイト数のことです。
半角英数字は1文字1バイトとして数えています。
おおよそ日本語のようなマルチバイト文字は1文字2バイトですが、文字コードがUTF-8では概ね3文字バイトで表されます。
21バイト
13バイト
ではstrlenをif文で使ってみましょう。
結果は以下の通りです。
値が入っている
値が入ってない
値が入っている
strlenをこのように使うことによってissetと違ってカラ文字には値が入っていないことを確認できます。
これでフォームの名前や住所などがカラの場合にはメッセージを表示させることができます。
ここで補足としてis_numeric関数について説明します。
変数が数値、または数値文字列ならばTRUEを、そうでなければFALSEを返します。
数値文字列とは造語ですが、例えば
このis_numeric関数はフォームの入力値を数字に設定しているのに文字を送ってきてしまう場合にチェックすることが出来ます。
結果は以下の通りです。
数字です
数字以外が入っています
数字です
次はチェックボックスのデータをPHP側に渡す方法について説明します。
これを付けることにより、配列としてPHP側にデータを渡すことができます。
htmlspecialhars関数はフォームから入力した文字や数値を画面に表示するときには必ずhtmlspecialchars関数を使います。
これは外部からの悪質なサイトへの攻撃を防ぐことに有益な関数です。
具体的には
〇 ‘&’ (アンパサンド) は
〇「変換スタイル」に
〇 ‘>’ (大なり) は
「変換スタイル」はデフォルトでは
構文の「文字コード 」は変換をどの文字コードで行うかを指定します。
この例では
では説明をしていきます。
ユーザーが入力したデータが
このユーザー定義関数はよく使う関数なので覚えておいてください。
引数が配列ではない時に
問題は引数が配列の時です。
配列の場合は
以下の過程を配列の数だけ繰り返します。
以下のファイル名は
Lesson21.htmlから以下の
複数ある場合は
しかし、文字数に制限があり(2000文字くらい)、少ないデータを送るのに適しています。
以下の形式でGETのデータを受け取ります。
つまり、name 属性の値と入力された値が
渡すデータが複数ある場合には各データを
例えば以下のように送信されます。
日本語などはURLとして認められていないので、通常はそのままでは送ることはできませんが、URLエンコードを行うとURLとして認められている文字に変換して送ってくれます。
このエンコードの作業はフォームから送る場合には自動で変換してくれます。
では例を見てみましょう。
フォームで送る場合には勝手にブラウザがURLエンコードを行ってくれるのですが、リンクに埋め込んでデータを送る場合には自身でURLエンコード処理を行わなくてはいけません。
下のファイル名は
Lesson27.phpの中に
urlencode関数を記述しませんと文字化けしますので気を付けてください。
$_GETのキーには以下の「name2」を入れます。