WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

PEAR::HTML_QuickForm でフォームの送信内容を検証する

      2012/12/14

送信データの検証

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 正規表現 正規表現パターン
email メールアドレスのフォーマット
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 echo '<?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>

 - PEAR , , ,