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


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

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

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

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

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

回答の条件
  • 1人2回まで
  • 登録:2007/03/02 20:57:12
  • 終了:2007/03/08 11:29:42

回答(2件)

id:tobeoscontinue No.1

tobeoscontinue回答回数214ベストアンサー獲得回数542007/03/03 00:47:35

ポイント35pt

私もフォーム処理は面倒だなぁと思って何かないものかと探して辿り着いたのが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の考え方は十分に使えるものだと思っています。

id:kt26

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

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

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

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

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

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

2007/03/03 09:46:28
id:okuryu No.2

okuryu回答回数72ベストアンサー獲得回数32007/03/07 00:51:51

ポイント35pt

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

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

<?php

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

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

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

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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません