[PHP-users 430] Re: フォームのチェック

BAC php-users@php.gr.jp
Sun, 01 Jul 2001 10:43:36 +0900


BACです。ようやく全容を理解しました。

On Sun, 1 Jul 2001 07:27:18 +0900
"tyunn" <tyunn@to.email.ne.jp> wrote:

> 俊介です。
> 自分自身へPOSTしているフォームがあります。
> submitした際に入力内容のチェックを行っていますが、
> 入力もれなどが見つかった場合は以下のようにもとのフォームに
> 戻ってエラーメッセージを出しています。
> その際に、フォーム内で入力した内容をすべて表示させておきたい
> のですがよい方法はありますか?
> phpは3.0.18-i18n。
> 
> ■aaa.php3
> <? if($regist){
>         include('chk.inc'){

 include('chk.inc') ; ?

>         // 正常に入力された場合の処理
>     }
> ?>
> <html>
> <body>
> <?
>   if ($message==msg01){
>       echo "**a1が入力漏れです**"";
>   }
> ?>
> <form method=post action=aaa.php>

 action=aaa.php3 ?

> <input type=text name=a1 value=<? echo a1;?>>
> <input type=text name=a2 value=<? echo a2;?>>

 a1,a2 -> $a1, $a2 ?

> <select name=a3><option value=MM>MM</option><option
> value=SS>SS</option></select>
> </form></body></html>
> 
> ■chk.inc
> <?
>   if (!$a1){
>        header("location: http://host/aaa.php3?message=msg01");
>        exit;
>   }
> ?>

 これでは動くものも動かないでしょう。抜粋の仕方がちょっと完全じゃないの
で推測が混じりますが、おそらくaaa.php3のフォーム部品の中にhiddenの
registというのがあるのでしょう。それを見て1回目に呼ばれたのか、2回目以
降に呼ばれたのか判断し、2回目以降であればchk.incを呼び出し、チェックを
行ってaaa.php3を呼び出す、わけでしょう、きっと。

 chk.incでaaa.php3?message=msg01に飛ばしている以上、それまでの入力、a1,
a2, さらにregistも失われます。つまり、2回目以降の流れはこうなります。

1. $registがセットされているため、chk.incをインクルードする
2. $a1がセットされていなかった場合、$message=msg01という状態でaaa.php3に
 飛ばされる
3. $registはセットされていないため、chk.incはインクルードされない
4. $message=msg01なので「入力漏れ」と表示
5. $a1, $a2はセットされていないため、初期値にはなにも表示されない

 chk.inc を

if (!$a1) {
    $message = 'msg01' ;
}

に変えて、aaa.php3を

<? if($regist){
        include('chk.inc') ;
        if ($message==msg01){
            echo "**a1が入力漏れです**"";
        } else {
            // 正常に入力された場合の処理
        }
    }
?>
<html>
<body>
  .......

とかすればよいのでは?

----------
BAC (bac@dev-nul.com)