5

精简版:

  • 我有一个包含 100 多个字段的表单,每个字段都有服务器端验证。
  • 我的表单正在工作并且数据已成功提交;当验证出现错误时,我什至会将它们重定向回表单,并显示具体发生了什么错误。
  • 当他们被重定向回(大量)表单时,他们的所有数据都消失了,他们需要再次输入。

我已经想到了几种回答我自己问题的方法,但它们并不是最优雅的解决方案。

我目前的思考过程是:将他们所有输入的数据保存为 $_SESSION 变量——并且每当他们加载表单时,if围绕每个输入做一个语句,这样;

if(isset($_SESSION['foo_data'])) {

    echo "<input type='text' name='foo' value='$_SESSION["foo_data"]'>";

} else {

    echo "<input type='text' name='foo' placeholder='Enter your text here...'>";

}

这种方法可行,但它还涉及对 140 多个会话变量的极其繁琐的定义,然后是围绕每个表单字段创建更加繁琐和巨大的 if/else 语句。

有没有更好的方法来做到这一点?

附加信息:使用纯 php,没有任何类型的框架。

4

1 回答 1

4

会话是不必要的。你的基本计划应该是:

  • 从 $_POST() 获取变量
  • 验证表单值。
  • 使用通过验证的值创建一个数组。
  • 重定向到表单时使用数组填充值。

在开始使用 CodeIgniter 之前,我曾经使用if语句来验证和生成如下错误消息:

if ( ! empty($_POST['email'])){
    if ($this->verifyInput($_POST['email'], 6)){
        $fill['email'] = $_POST['email'];//$fill is the array of values that passed validation
    } else $tally++;//$tally keeps a running count of the total number of erors
}

我进行了一个函数调用,$this->verifyInput它接受字段值和要执行的验证类型——在本例中为 6,表示电子邮件。这是我的验证功能:

function verifyInput($input, $type){
    if ($type == 0)     $pattern =  '/^1$/';//just the number 1
    elseif ($type == 1) $pattern =  '/^[0-9]+$/';//just integers
    elseif ($type == 2) $pattern =  '/^[A-Za-zÁ-Úá-úàÀÜü]+$/';//just letters
    elseif ($type == 3) $pattern =  '/^[0-9A-Za-zÁ-Úá-úàÀÜü]+$/';//integers & letters
    elseif ($type == 4) $pattern =  '/^[A-Za-zÁ-Úá-ú0-9àÀÜü\s()\/\'":\*,.;\-!?&#$@]{1,1500}$/';//text
    elseif ($type == 5) $pattern =  '/^[A-Za-zÁ-Úá-úàÀÜü0-9\']+[A-Za-zÁ-Úá-úàÀÜü0-9 \'\-\.]+$/';//name
    elseif ($type == 6) $pattern = '/^.+@[^\.].*\.[a-z]{2,}$/';//e-mail
    elseif ($type == 7) $pattern = '/^((\(0?[1-9][0-9]\))|(0?[1-9][0-9]))?[ -.]?([1-9][0-9]{3})[ -.]?([0-9]{4})$/';//brazilian phone
    if (preg_match($pattern, $input) == 1) return true;
    else return false;
}

验证完成后,我使用$fill数组为每个字段预填充表单:

<input class="field" type="text" name="email" value = "<?php echo $fill['email']; ?>"/>

您还应该确保$fill使用空值启动,例如$fill['email']='';或检查以确保在填充输入标签之前设置了值:

<input class="field" type="text" name="email" value = "<?php if(isset($fill['email'])) echo $fill['email']; ?>"/>

这些只是一般指导方针,您可以根据自己的需要进行调整,但我发现这是一种方便的处理方式。

于 2013-07-01T00:43:32.327 回答