人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでのフォーム入力・確認について質問です。

皆さんはフォームで入力した値を確認する場合、どういう処理を行っていますでしょうか?

私はifで必須項目の入力を要素の数だけ行い、htmlspecialcharsをします。
そしてエラー箇所が見つからなければ出力用テンプレートを読み込んで、
テンプレートの内部で echo $_POST["hoge"];や<?=$_POST["hoge"]?>などで出力しています。
日付などは表示方法の違いがありますので、独自関数を使って変換したりもします。

別にそれでも問題ないと思いますが、もう少しスマートに出来ないものかといつも悩んでいます。

出来ましたら、PEARやオープンソースクラスを使用せずに、
「こうすれば入力チェックしやすい」「確認時の出力ソースがわかりやすい」
などありましたら、教えていただければと思います。

※具体的なソース提示は必要ありませんが、出来るだけ自力で構造を組み立てられるアドバイスをお願いします。
(PEARやHTML_QuickFormを使えというのは、なしの方向で)

●質問者: kt26
●カテゴリ:ウェブ制作
✍キーワード:echo hoge Pear PHP いもの
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● tobeoscontinue
●35ポイント

私もフォーム処理は面倒だなぁと思って何かないものかと探して辿り着いたのがQuickFormでした。目から鱗でした。HTML_QuickFormも同じようなもの(更に強力?)でしょう。ただhtmlの生成が希望と違うので自前で実装しようとしてます。

大雑把なチェックは

function validate($require)
{
 foreach ($_POST as $name => $value)
 $_POST[$name] = htmlspecialchars($value);

 foreach ($require as $name)
 if (!isset($_POST[$name]))
 return FALSE;
 return TRUE;
}

という関数を作って(動作未確認)

if (validate(array("hoge", ...)))
 include(template.php);

のように必須項目の名前を記述していけばいいので見た目がちょっとすっきりします。が個々の値の正当性は調べないといけないので、抜本的な解決ではありませんが。


希望にそわないかもしれませんがQuickForm風に実装をして見ます。

要素としてarray(tag, attr, value)を考えます。

これからhtmlを生成するのは割と簡単だと想像がつくと思います。

function attr_html($attrs)
{
 $contents = '';
 foreach ($attrs as $attr) {
 list($name, $value) = explode("=", $attr);
 $contents .= ' '.$name.'="'.$value.'"';
 }
 return $contents;
}

function fetch($tags, $level=0)
{
 $single_tags = array("input","img");
 $contents = '';
 foreach ($tags as $data) {
 list($tag, $attr, $value) = $data;
 if (is_array($value)) $value = fetch($value, $level+1);
 $contents .= str_pad('', $level).'<'.$tag.attr_html($attr).'>'.$value."\n";
 if (!in_array($tag, $single_tags))
 $contents .= str_pad('', $level).'</'.$tag.'>'."\n";
 }
 return $contents;
}

簡単にarray()からhtmlを生成する部分です。(タグの表示位置を合わせるために余計なコードが入っているのでごみごみしていますが実際はけっこうスッキリです)

$tags = array(
 array("input", array("type=text", "name=hoge", "value=", "size=20")),
 array("input", array("type=submit", "value=send"))
);

echo '<form action="aaa.php" method="post">'."\n".fetch($tags, 1).'</form>';

次にinput用のarray()を定義してfetch()でhtmlが生成されることを確認できると思います。


$tagsは単純な配列ですのでチェック用の項目を追加して

validate($tags)のようにすればhtmlの生成と入力値のチェックを関数の中に閉じ込めることができるのではないかと思います。


今回は簡単なケースなのでいいのですが実際にはもっと改良しないと使えないでしょう。それに入れ子状態のarray()を作るのはちょっと大変です。私の感覚ではhtmlの生成と入力値のチェックから開放されるのであればQuickFormの考え方は十分に使えるものだと思っています。

◎質問者からの返答

詳しくご回答ありがとうございます。

一番上の例は私もやってますね。その処理にis_arrayを加えて、配列か否かによってサニタイズの処理を変えるようにしています。

その下の確認処理・チェックに関してですが、おっしゃるように見た感じはごみごみしてますね。

inputまでは生成する必要が無く、あくまで目的は「入力確認のソースをスマートに(簡略化)する」と言う事ですから、少し違うかもしれません。

提案していただいているQuickFormは申し訳ありませんが、HTML_QuickFormと同じだと思うので却下で。

理由はやはり他者のソースを頼って使うようでは、自身のコーティングスキルが上がらないと思うからです。それに他の人間と作業する場合も、その人がQuickFormを知っている必要がありますからね。それよりも自分で作ったソースや仕組みの方が、説明しやすいです。


2 ● okuryu
●35ポイント

受け取ったデータを何のために使うデータなのかというのをはっきりと変数名をつけて使い分けてやるというのをよくやります。

例えば未加工のデータがそのまま $hoge とすると表示目的のデータは $hoge4html という感じです。

<?php

$hoge = $_POST['hoge'];
$hoge4html = format4html($hoge);
$hoge4db = format4db($hoge);

function format4html($str) {
 // 表示用に加工する処理
}

function format4db($str) {
 // データベース用に加工する処理
}

?>
こうすることで「この変数にどんなデータいれたんだっけ?」みたいなことがなくなります。
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ