【问题标题】:How can I re-fill form fields that a user filled out after I've redirected them back to the form when there was an error?当出现错误时,如何重新填写用户填写的表单字段,然后我将它们重定向回表单?
【发布时间】:2013-06-28 01:15:51
【问题描述】:

短版:

  • 我有一个包含 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 多个会话变量进行极其繁琐的定义,然后围绕 EVERY 创建更加繁琐和庞大的 if/else 语句> 表单域。

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

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

【问题讨论】:

  • 我会有一个 array() 保存表单字段,然后是一个循环来构建表单(检查会话值)
  • 如果一开始就有错误,为什么要重定向?
  • One Trick Pony:我目前正在一个单独的 PHP 文件中一起进行验证。您介意解释一下在同一个文件中进行验证会如何改变事情吗?
  • 将支票保存在单独的文件中。我只是说您可以在检查失败后显示表单,这样您就可以保持提交的 $_POST 数据并避免使用会话。除非表单提交成功,否则不需要重定向
  • 呃,这不是让我处于同样的境地吗? (必须使用 140 个 if / else 语句为 isset($_POST['foo_data'] 回显不同的输入,就像我对会话变量所做的一样)。

标签: php forms redirect autofill


【解决方案1】:

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

  • 从 $_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
}

我对@9​​87654323@ 进行了函数调用,它接受字段值和要执行的验证类型——在本例中为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']; ?>"/>

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

【讨论】:

  • 那行得通 :) 谢谢 Pe de Leao!出于好奇(因为我这周开始学习它,但还不能说我喜欢它)你喜欢 CodeIgniter VS flat PHP,特别是在表单和表单验证方面?
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 2020-07-21
  • 2012-01-28
  • 2014-06-19
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多