送信データの検証
HTML_QuickForm を利用すると、フォームから送信されたデータが正しく入力されているかや、正しい書式で入力されているかどうかを簡単に検証することができます。
サーバサイトでのデータの検証は、特にセキュリティの観点から見ても重要なものです。それを HTML_QuickForm のメソッドひとつで簡単に行えることは大きな利点と言えます。
addRule メソッド
HTML_QuickForm にはフォームから送信されたデータを検証する addRule メソッドが実装されています。構文は以下の通りです。
void HTML_QuickForm::addRule(mixed $elements, string $message, string $type[, string $format=''[, string $validation='server'[, bool $reset=FALSE[, bool $force=FALSE]]]]) |
---|
$elements : 検証対象の要素名 $message : 検証エラー時に表示するメッセージ $type : 検証の型 $format : 検証時に必要なパラメータ $validation : 検証を実行する場所(server|client) $reset : エラー発生時に入力値をリセットするか $force : フォーム要素が存在しなくても、ルールを強制的に適用するかどうか |
addRule メソッドの3番目の引数である $type は、その検証対象の要素の入力が必須であるかどうかや、どういった形式で入力されている必要があるかどうかなどを示すもので、種類としては下表のものがあります。
検証の種類 | 概要 | 必要なパラメータ |
---|---|---|
require | 必須項目 | - |
maxlength | 文字の最大長 | 最大長を示す数値 |
minlength | 文字の最小長 | 最小長を示す数値 |
rangelength | 文字範囲(m~n文字) | 最小値を示す数値, 最大値を示す数値 |
regex | 正規表現 | 正規表現パターン |
メールアドレスのフォーマット | - | |
lettersonly | 文字列のみ | - |
alphanumeric | 数値、又はアルファベット | - |
nonzero | 0でないこと | - |
uploadedfile | 必須(ファイル) | - |
maxfilesize | 最大ファイルサイズ | |
mimetype | MIME型 | MIME型 |
filename | ファイル名 | 正規表現パターン |
compare | 2つの要素間の比較 | 比較演算子 (eq|neq|gt|gte|lt|lte) |
以下、簡単なサンプルスクリプトになります。
test4qform.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>PEAR::HTML_QuickFormでフォームの送信内容を検証するサンプル</title> </head> <body> <?php require_once ('HTML/QuickForm.php'); $form = new HTML_QuickForm('inquiries', 'POST', ''); $form->addElement('header', 'MyHeader', 'IDとパスワードを入力してください'); $form->addElement('text', 'id', 'ID:'); $form->addElement('password', 'cmpPasswd', 'パスワード:'); $form->addElement('password', 'cmpRepeat', 'パスワード(再入力):'); $form->addElement('submit', 'send', '送信'); $form->addRule('id', 'IDが入力されていません', 'required', NULL, 'client'); $form->addRule('cmpPasswd', 'パスワードが入力されていません', 'required', NULL, 'client'); $form->addRule('cmpRepeat', 'パスワードが再入力されていません', 'required', NULL, 'client'); $form->addRule('id', '全項目英数字で入力してください', 'alphanumeric', NULL, 'client'); $form->addRule(array('cmpPasswd', 'cmpRepeat'), 'パスワードが一致しません', 'compare', null, 'client'); if ($form->validate()) { echo '正常にログインできました。'; } else { echo 'IDとパスワードを入力してログインしてください。'; $form->display(); } ?> </body> </html>