Проверьте, если несколько строк пустые [дубликаты]

Possible Duplicate:
More concise way to check to see if an array contains only numbers (integers)
PHP checking if empty fields

У меня есть форма, которая представляет 10 полей, и 7 из них должны быть заполнены, вот как я проверяю это сейчас в PHP:

if (!$name || !$phone || !$email || !$mobile || !$email || !$state || !$street || !  $city) {
        echo '<div class="empty_p">You have empty fields!!!</div>';}
else{
        //process order or do something
}

Мой вопрос: есть ли более простой способ сделать это? Потому что иногда мне нужно проверять еще больше строк (12-15)

 Steve08 июн. 2012 г., 16:18
@MarkBaker Правда, но он заявляет, что ему нужно только проверить 7 из представленных в форме переменных.
 Steve08 июн. 2012 г., 16:14
Если вы добавите их в массив, вы можете использовать foreach.
 Mark Baker08 июн. 2012 г., 16:16
@dynamic - если это данные формы, скорее всего, они изначально поступают из массива ($ _POST или $ _GET)

Ответы на вопрос(7)

Что-то вроде этого?

foreach($_POST as $key => $value) 
{
    if (empty($_POST[$key]))
    {
        echo '<div class="empty_p">'.$_POST[$key].' is empty.</div>';
    }
}
 26 авг. 2013 г., 16:34
@ Fred-ii- хороший глаз;) Я отредактировал свой ответ
 08 июн. 2012 г., 16:25
Гехе, ты прав. Привычки: P
 08 июн. 2012 г., 16:27
Хороший материал, хотя это не может повредить, чтобы дважды проверить случай; p
 26 авг. 2013 г., 16:19
@Bono Эта строка также выдаст ошибку из-за отсутствия) вif (empty($_POST[$key]) --- следует читать какif (empty($_POST[$key]))
 08 июн. 2012 г., 16:24
Вы можете удалить!isset($_POST[$key]) так как он не будет в массиве POST, который вы зациклите, если он еще не установлен.

Вы можете написать цикл Foreach

  foreach($_POST as $key => $value) 
    {
        if (!isset($_POST[$key]) || empty($_POST[$key])
        {
            echo '<div class="something">You have empty fields!!!</div>';
        }
    }
 08 июн. 2012 г., 16:21
Вы только что скопировали мой код? : /
 26 авг. 2013 г., 16:17
Эта строка выдаст ошибку из-за отсутствия) вif (!isset($_POST[$key]) || empty($_POST[$key]) --- следует читать какif (!isset($_POST[$key]) || empty($_POST[$key]))
 08 июн. 2012 г., 16:21
пусто == & quot; & quot; не нужно делать это дважды, но также0 будет считаться пустым.

где следует ожидать эти данные, например$_POST:

if (!isset($_POST['name'], $_POST['phone'], $_POST['email'], $_POST['mobile'], $_POST['state'], $_POST['street'], $_POST['city'])) {
    // something is up
}

Вы можете немного сократить этот код, создав массив с необходимыми именами полей:

$required_fields = array('name', 'phone', 'email', 'mobile', 'state', 'street', 'city');

«Проверка на существование»; код может быть упрощен до:

foreach ($required_fields as $f) {
    if (!isset($_POST[$f])) {
        // something is up
    }
}
The better way ™

Тем не менее, вы должны серьезно рассмотреть возможность объединения обоих существand проверки / санитарные проверки. PHP предоставляет семьюфункции фильтра функции, которые вы можете использовать для проверки и / или дезинфекции ваших входных переменных. Например, чтобы получить эквивалентное поведение, как указано выше:

$required_fields = filter_input_array(INPUT_POST, array(
    'name' => FILTER_UNSAFE_RAW,
    'email' => FILTER_VALIDATE_EMAIL,
));

if (is_null($required_fields) || in_array(null, $required_fields, true)) {
    // some fields are missing
}

Поля, которые существуют, но не прошли проверку, будут установлены вfalseИтак, вот как вы обнаруживаете такое событие:

foreach ($required_fields as $name => $value) {
    if (false === $value) {
        // field $name failed validation (e.g. bad email format)
    } elseif, (!strlen(trim($value))) {
        // field is empty
    }
}

$array = ($name, $email, $mobile);
$valid = true;

foreach($array as $element) {
    if(empty($element)){
        $valid = false;
    }
}

if ($valid){
    // complete
} else {
    // alert! some element is empty
}
Решение Вопроса
<input type="text" name="required[first_name]" />
<input type="text" name="required[last_name]" />
...


$required = $_POST['required'];
foreach ($required as $req) {
   $req = trim($req);
   if (empty($req))
      echo 'gotcha!';
}

ХОРОШО! ребята, просто ...

Вы можете сделать его более безопасным, просто с помощью приведения типов, как все, что мы, программисты, делаем для исходящих данных, например$id = (int) $_GET['id'], лайк$username = (string) addslashes($_POST['username']) и так далее...;

$required = (array) $_POST['required'];

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

 SomeoneS08 июн. 2012 г., 22:01
Хм, это прекрасно работает, но что если кто-то отредактирует исходный код формы и изменится & quot; required [first_name] & quot; ничего. Тогда ничего не будет отправлено, и будут отсутствовать данные?
 08 июн. 2012 г., 16:40
Уже немного поздно, вот почему воображение иссякает здесь: P
 08 июн. 2012 г., 22:23
Это ужасная идея. Клиент, изменяющий HTML или просто отправляющий вручную POST-запрос, сможет обойти эту проверку. Хотя это, скорее всего, не вызовет серьезных проблем, это довольно уродливо.
 09 июн. 2012 г., 14:48
Безопасность магическим путемaddslashes и это уже в редактировании вы сделали, чтобы сосредоточиться на безопасности. Ой, это ужасно. Также, как писал ThiefMaster, вы не вносите белый список имен входных переменных. Это так отвратительно. Вы получаете -1 от меня.
 08 июн. 2012 г., 16:19
прекрасный. Никогда бы не подумал об этом .. ну вы чему-то учитесь каждый день!

можете использовать эту функцию:

<?php
    function isAnyEmpty() {
        $total = 0;
        $args = func_get_args();
        foreach($args as $arg)
        {
            if(empty($arg)) {
                return true;
            }
        }

        return false;
    }
    $var1 = 1;
    $var2 = 'test';
    $var3 = '';

    if(isAnyEmpty($var1, $var2, $var3)) {
        echo 'empty fields!';
    }
?>

который можно было бы использовать повторно, а точнее.

Некоторый псевдокод:

<?

class validateFields {
    $validators = array(
        "name" => array(
            "empty" => array(
                "rule"          => "some regex",
                "errorMessage"  => "name may not be empty"
            ),
            "noNumbers" => array(
                "rule"          => "some regex",
                "errorMessage"  => "No numbers are allowed in the name field"
            )
        ),
        "otherVariable" => array(
            "atLeast50chars" => array(
                "rule"          => "some regex",
                "errorMessage"  => "This field must be at least 50 chars"
            )
        )
    );


    public function Validate($post){
        $errors = array();

        foreach($_POST as $key => $value){
            if(!array_key_exists($key, $validators)) {
                continue;
            }

            foreach($validators[$key] as $validator) {
                if(!preg_match($validator["rule"], $value) {
                    $errors[$key] = $validator["errorMessage"];
                    break;
                }
            }
        }

        return $errors;
    }
}


?>

Тогда в вашем коде вы можете сделать что-то вроде:

$errors = Validate($_POST);
foreach($error as $errorMessage) {
    echo $errorMessage . "</br>";
}

Конечно, вы можете это представить, добавив div с классами прямо под / рядом с соответствующим полем ввода и загрузите туда $ errorMessage. Я уверен, что есть множество примеров там :)

Ваш ответ на вопрос