PHP:检查POST数据的理智方式?

时间:2011-10-26 21:23:24

标签: php html forms validation

我有page1.php,它使用表单发送以下数据:

<form action="page2.php" method="post">
<input type="text" name="f1">
<input type="text" name="f2">
<input type="text" name="f3">
<input type="text" name="f4">
<input type="submit" value="submit">
</form>

在page2.php上,我做了一些基本的验证,所以看到表单实际上已经提交并输入了所有数据:

<?php
if($_SERVER['REQUEST_METHOD'] != "POST" || empty($_POST["f1"]) || empty($_POST["f2"]) || empty($_POST["f3"]) || empty($_POST["f4"]))
{
    $missing_input = array();

    if (empty($_POST["f1"]))
    {
        $missing_input[] = "field1";
    }
    if (empty($_POST["f2"]))
    {
        $missing_input[] = "field2";
    }
    if (empty($_POST["f3"]))
    {
        $missing_input[] = "field3";
    }
    if (empty($_POST["f4"]))
    {
        $missing_input[] = "field4";
    }

    die("Error: " . implode(", ", $missing_input)");
}
?>

问题是,当在page1.php表单中引入新的POST字段时,上述情况非常难看,需要重新工作。如何更好地对此表单验证进行编码?

5 个答案:

答案 0 :(得分:2)

这适用于您在表单中放置的任意数量的字段

if ($_SERVER['REQUEST_METHOD'] != "POST") {
    die("Improper request method");
}

if (!empty($_POST)) {
    foreach ($_POST as $key => $field) {
        if (strlen($field) === 0) {
            $missing_input[] = $key;
        }
    }
}   

if (!empty($missing_input)) {
    die("Error: " . implode(", ", $missing_input)");
}

答案 1 :(得分:2)

您可以使用带变量保持字段名的简单循环:

<?php
if ($_SERVER['REQUEST_METHOD'] == "POST")
{
  $fieldnames = array(
    'f1' => 'field1',
    'f2' => 'field2'
    'f3' => 'field3'
    'f4' => 'field4'
  );
  $missing_input = $array();
  foreach ($fieldnames as $code => $label)
  {
    if (empty($_POST[$code]))
      {
          $missing_input[] = $label;
      }
  }

  //Display errors nicely
  if (count($missing_input) > 0):?>
  <p>The following fields are required :</p>
  <ul>
    <?php foreach ($missing_input as $field): ?>
    <li><?php echo $field ?></li>
    <?php endforeach; ?>
  </ul>
  <?php endif;
}

答案 2 :(得分:1)

f1f2等存储在数组中,并使用for语句迭代数组。

示例:

if($_SERVER['REQUEST_METHOD'] != "POST")
    die("Error: Wrong method");
$fields = array("f1", "f2", "f3", "f4");
$field_names = array("field1", "field2", "field3", "field4");
$length = count($fields);
$missing_input = array();
for($i = 0; $i < $length; $i++)
    if(empty($_POST[$fields[$i]]))
        $missing_input[] = $field_names[$i];
if(!empty($missing_input))
    die("Error: " . implode(", ", $missing_input)");

注意:以上是未经测试的。

答案 3 :(得分:1)

你应该看看使用像zend或yii这样的框架。简短的回答是,如果您不喜欢这样做,您必须编写一个类或对象来执行此操作。

答案 4 :(得分:0)

  

以上感觉非常难看

这是错误的感觉。
如果你只需要检查字段是否为空,那么你当然可以做一些愚蠢的循环。

在现实生活中,对不同的字段有不同的检查,因此,您必须依次手动编写所有字段。它没有任何问题。

我在这里看到的唯一问题是第一行的冗余检查。为什么所有这些“||空”呢?