PHP: нормальный способ проверки данных POST? - PullRequest
1 голос
/ 27 октября 2011

У меня есть 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 ]

2 голосов
/ 27 октября 2011

Вы можете использовать простой цикл с переменной, содержащей имена полей:

<?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 голосов
/ 27 октября 2011

Это работает для любого количества полей, которые вы вводите в форму

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 голос
/ 27 октября 2011

Вы должны взглянуть на использование фреймворка, такого как zend или yii. Короткий ответ: если вам не нравится делать это таким образом, вам придется кодировать класс или объект для этого.

1 голос
/ 27 октября 2011

Сохранение f1, f2 и т. Д. В массиве и использование оператора 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)");

Примечание. Выше не проверено.

0 голосов
/ 27 октября 2011

выше кажется очень уродливым

Это неправильное чувство.
Если вам нужно только проверить, было ли поле пустым, вы, конечно, можете сделать несколько глупых циклов.

Бит в реальной жизни существуют разные проверки для разных полей, поэтому вам придется писать их все вручную, по очереди.В этом нет ничего плохого.

Единственная проблема, которую я вижу здесь, это избыточные проверки в первой строке.почему все эти "|| пустые" там?

...