1

中途半端に機能している単純なphp検証フォームがあります。フィールドを空のままにして[送信]をクリックすると、正しいエラーメッセージが表示されます。問題は正規表現にあります。たとえば、通貨フィールドが有効でない場合、正しいエラーメッセージは表示されません。[送信]をクリックすると、ページが再読み込みされ、テキストボックス内のすべての値が消去されます。どうして正しいエラーメッセージが表示されないのですか?

HTMLフォーム

<form action="" method="post" id="form">

                <label for="tile">Title: <em>*</em></label>
                <input type="text" name="title" id="title" value="<?php echo $form['title']; ?>"> <?php echo $error['title'] ?>


                <label for="currency">Currency: <em>*</em></label>
                <input type="text" name="currency" id="currency" value="<?php echo $form['currency']; ?>"> <?php echo $error['currency'] ?>

                <input type="submit" name="submit" id="submit">

        </form>

PHPバリデーター

  //variables
    $error_open = "<label class='error'>";
    $error_close = "</label>";
    $valid_form = TRUE;
    $redirect = "success.php";

    $form_elements = array('title', 'currency');
    $required = array('title', 'currency');

    foreach ($required as $require)
    {
        $error[$require] = '';
    }

    if (isset($_POST['submit']))
    {
        //process form

        //get form data
        foreach ($form_elements as $element)
        {
            $form[$element] = htmlspecialchars($_POST[$element]);
        }

        //check form elements
            //check required fields
            if ($form['title'] == '')
            {
                $error['title'] =  $error_open . "* This field is required" . $error_close;
                $valid_form = FALSE;
            }
            if ($form['currency'] == '')
            {
                $error['currency'] = $error_open . "* This field is required" . $error_close;
                $valid_form = FALSE;
            }


            //check formatting
            if ($error['title'] == '' && !preg_match('/^([A-Za-z0-9_-]+)/', $form['title']))
            {

                $error['title'] = $error_open . "* Enter a valid descriptive title" . $error_close;
                $valid_form = FALSE;

            }

            if ($error['currency'] == '' && !preg_match('/^\s*[+-]?(\d*\.\d\d)\s*$/', $form['currency']))
            {

                $error['currency'] = $error_open . " Enter a valid decimal number <br> * Do not include Dollar($) sign <br> * Example: (1.00)" . $error_close;
                $valid_form = FALSE;

            }



        //check for bad data
            if (contains_bad_str($form['title']) ||
            contains_bad_str($form['currency']))
            {
                $valid_form = FALSE;

            }

            if (contains_bad_str($form['title']) ||
            contains_bad_str($form['currency']))
            {
                $valid_form = FALSE;

            }

        //check if form is valid
        if ($valid_form)
        {

            //redirect
            header("Location: " . $redirect);

        }
        else
        {
            include('form.php');

        }

    }
4

2 に答える 2

1

これは私のために働いた。

function contains_bad_str($s) {
    $r = preg_match ( "/cheese|rice|beans/i" , $s);
    return $r;
}

// variables
$error_open = "<label class='error'>";
$error_close = "</label>";
$valid_form = TRUE;
$redirect = "success.php";

$form_elements = array('title', 'currency');
$metadata = array('title'=> array('/^([A-Za-z0-9_-]+)/',
                                  "* Enter a valid descriptive title"),
                  'currency' => array('/^\s*[+-]?(\d*\.\d\d)\s*$/',
                                      "* Enter a valid decimal number <br/>" .
                                      "* Do not include Dollar($) sign <br/>" .
                                      "* Example: (1.00)" ));

foreach ($form_elements as $element) {
    $error[$element] = '';
}

if (isset($_POST['submit'])) {
    // get form data
    foreach ($form_elements as $element) {
        $form[$element] = htmlspecialchars($_POST[$element]);
        // check presence
        if ($form[$element] == '') {
            $error[$element] =  $error_open . "* required" . $error_close;
            $valid_form = FALSE;
        }
        // check formatting
        elseif (!preg_match($metadata[$element][0], $form[$element])) {
            $error[$element] = $error_open . $metadata[$element][1] . $error_close;
            $valid_form = FALSE;
        }
        // sanitize
        elseif (contains_bad_str($form[$element])) {
            $error[$element] =  $error_open . "* bad string" . $error_close;
            $valid_form = FALSE;
        }
    }

    if ($valid_form) {
        header("Location: " . $redirect);
    }
    else {
        include('form.php');
    }
}
else {
    // blank form
    $form = array('title'=>'', 'currency'=>'');
    $error = array('title'=>'', 'currency'=>'');
    include('form.php');
}
于 2012-06-20T23:54:24.820 に答える
0

PHPの入力フィルターを見たことがありますか?特に、FILTER_VALIDATE_FLOAT通貨を見てください。

于 2012-06-21T00:31:17.910 に答える