【问题标题】:Form values should not clear表单值不应该明确
【发布时间】:2011-11-21 00:12:13
【问题描述】:

我有一个表格可以提交我的联系信息。 我正在使用 php 获取表单字段,例如:

if(isset($_post['submit']))
{
//submit cantact info
}
else
{
//bad user
}

我的问题是:如果用户提交表单失败,“表单值不应该清除”......

但是单击提交按钮时表单值正在清除..!所以有人知道如何防止清除表单值吗?

【问题讨论】:

  • value = $_post['fieldname']
  • 澄清:您的意思是:用户提交表单并且您验证输入日期。如果发生验证错误,您会再次向用户显示错误消息和表单,然后字段应包含输入的值?

标签: php xhtml


【解决方案1】:

您必须手动填充这些字段。

总体思路是使用 POST/Redirect/GET 方法

收到 POST 数据后,您必须检查它并提出错误标志
如果出现一些错误,您必须返回相同的表格,填写输入内容和相应的错误消息。

这是一个粗略的例子:

<?  
$err = array();
if ($_SERVER['REQUEST_METHOD']=='POST') {  

  //performing all validations and raising corresponding errors
  if (empty($_POST['name']) $err[] = "Username field is required";  
  if (empty($_POST['text']) $err[] = "Comments field is required";  

  if (!$err) {  
    // if no errors - saving data 
    // and then redirect:
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
  }  else {
    // all field values should be escaped according to HTML standard
    foreach ($_POST as $key => $val) {
      $form[$key] = htmlspecialchars($val);
    }
} else {
  $form['name'] = $form['comments'] = '';  
}
include 'form.tpl.php';
?>  

然后在 form.tpl.php 模板中把它变成这样:

<? if ($err): ?>
  <? foreach($err as $e): ?>
<div class="err"><?=$e?></div>
  <? endforeach ?>
<? endif ?>
<form>
  <input type="text" name="name" value="<?=$form['name']?>">
  <textarea name="comments"><?=$form['comments']?></textarea>
  <input type="submit">
</form>

【讨论】:

  • 啊,你说得对。把它的定义放在错误的地方。已更正,谢谢
  • +1 以获得真正全面的答案。如果可能的话,我会再次 +1 以提及 PRG
【解决方案2】:

您必须(手动)将提交的值放入表单元素中。示例:

<input type="text" name="username" value="<?=( isset( $_POST['username'] ) ? $_POST['username'] : '' )?>" />

【讨论】:

  • 谨防 XSS 漏洞
  • 真@Phil。但是这条线太长了,装不下;)
【解决方案3】:

您需要跟踪表单值。一个建议是设置一个默认值数组,用于呈现表单标记。

在 POST 上,然后合并发布数据。例如

$formData = array(
    'foo' => '',
    'bar' => 'default value',
    'baz' => ''
);

if ('POST' == $_SERVER['REQUEST_METHOD') {
    $formData = array_merge($formData, $_POST);

    // do validation, handle success
}

然后,在 HTML 中

<input name="foo" value="<?php echo htmlspecialchars($formData['foo']) ?>">
<!-- etc -->

【讨论】:

  • 你说得对。我只是存储帖子值并在字段中显示。我没有使用你的 array_merge 方法。也不使用 htmlspecialchars() 方法...
猜你喜欢
  • 2020-11-14
  • 2022-01-07
  • 2019-04-05
  • 2018-07-05
  • 2019-07-25
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多