2010-01-07 2 views
2

У меня есть следующий PHP код:

$required_fields = array ('menu_name','visible','position'); 
foreach($required_fields as $fieldname) 
{ 
    if (!isset($_POST[$fieldname]) || empty($_POST[$fieldname])) 
    { 
     $errors [] = $fieldname; 
    } 
} 

menu_name, visible и position являются переменными, получаемыми с помощью метода поста.

Когда значение visible равно нулю, оно создает запись в массив ошибок.

Каков наилучший способ определить, является ли переменная пустой, когда 0 считается «не пустой»?

+0

Я бы разместил это в ответе, но Ян его покрыл, поэтому я поставлю его здесь: http://www.deformedweb.co.uk/php_variable_tests.php – zombat

ответ

1

Поскольку данные пользователя неаккуратные, я использую настраиваемую функцию, которая обрабатывает пустые пространства как не-данные. Похоже, это будет делать именно то, что вы хотите. Эта функция будет считать «0» действительной (ака не пустой).

function isNullOrEmpty($arg) 
{ 
    if (!is_array($arg)) 
    { 
     $arg = array($arg); 
    } 

    foreach ($arg as $key => $value) 
    { 
     $value = trim($value); 
     if($value == "" || $value == null) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

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

$required = array($_POST['name'], $_POST['age'], $_POST['weight']); 
if (isNullOrEmpty($required)) 
{ 
    // required data is missing 
} 

PS: Имейте в виду, функция запустит предупреждения PHP, если значение не будет установлено, и нет простого способа обойти это, но вы не должны иметь предупреждений, включенных в производство в любом случае.

+0

Вы можете улучшить свой код, если вы проверите, имеет ли параметр массив или нет (я знаю, что вы это делаете уже).Если это не массив, просто выполните '$ arg = array ($ arg)', тогда вы можете использовать цикл foreach, и вам нужно написать только «trim» и только сравнительную часть * один раз *, который лучше поддерживать. Представьте, что у вас есть другие критерии проверки, вам придется добавить их дважды (один раз для массивов и один раз для значений без массива) (что не является СУХОЙ). –

+0

@ Феликс, хороший момент, теперь он упрощен. – TravisO

+0

Это то, что я использовал в ответ на ваш ответ if ($ _POST [$ fieldname] == '' ||! Isset ($ _ POST [$ fieldname])) – Gatura

8

От РНР manual:

пустой() возвращает FALSE, если переменная имеет непустое и ненулевое значение.

ли что-то вроде этого:

if (!IsSet ($_POST['field']) || Trim ($_POST['field']) == '') 

это будет гарантировать, что поле установлено и что она не содержит пустую строку

По существу: это empty(), что вызывает ваш проблемы не IsSet()

+2

Это не вкус. Теоретически это неправильно, так как функция не называется так. –

+0

Это делает код более удобным для чтения. –

+0

Надежда PHP начнет учитывать регистр: P – drAlberT

-1

Не можете ли вы добавить еще одну строку с чем-то вроде:

if (!isset($_POST[$fieldname]) || empty($_POST[$fieldname])) 
{ 
    if ($fieldname != 'visible' || $_POST[$fieldname] != 0) 
    { 
     $errors [] = $fieldname; 
    } 
} 
+2

Вы получите уведомление, если '! Isset ($ _ POST [$ fieldname])' is true и '$ fieldname! = 'Visible'' является ложным, поскольку вы затем пытаетесь получить доступ к' $ _POST [$ имя_поля] '. – Gumbo

0

Если вы хотите, чтобы обеспечить ключ массива присутствует вы можете использовать array_key_exists() вместо пустой()

Проверка будет конкатенация is_array() и array_key_exists(), паранойя конечно

+0

Я тоже об этом думал, но 'isset()' также возвращает 'false', если ключ присутствует, но содержит значение« null »(где' array_key_exists() 'возвращает' true'). Поэтому в этом случае я действительно думаю, что 'isset()' подходит лучше. –

Смежные вопросы