! is_null () не работает должным образом - PullRequest
1 голос
/ 20 июля 2010

dispatch_address_postcode

не является обязательным, и все равно будет работать, даже если пусто:

if (!is_null($_POST['personal_info_first_name']) && 
    !is_null($_POST['personal_info_surname']) && 
    !is_null($_POST['personal_info_email']) && 
    !is_null($_POST['personal_info_telephone']) && 
    !is_null($_POST['dispatch_address_country']) && 
    !is_null($_POST['dispatch_address_first_name']) &&
    !is_null($_POST['dispatch_address_surname']) && 
    !is_null($_POST['dispatch_address_address']) && 
    !is_null($_POST['dispatch_address_town']) && 
    !is_null($_POST['dispatch_address_postcode']) && 
    !is_null($_POST['dispatch_address_county']) && 
    (   ($_POST['payment_method'] == "Pay by credit card.") ||
        (
            ($_POST['payment_method'] == "Pay by new credit card.") && 
            !is_null($_POST['card_number']) && 
            !is_null($_POST['expiration_date']) && 
            !is_null($_POST['security_code'])
        )
    )
)

Что дает?

Ответы [ 6 ]

8 голосов
/ 20 июля 2010

Похоже, вы пытаетесь убедиться, что все переменные сообщения отправлены.Хотели бы вы помочь с этим?

Использование! Empty () может не быть ответом на ваш конкретный вопрос, но это определенно поможет с тем, что вы пытаетесь сделать.* empty () возвращает TRUE, если ключ $ _POST не установлен, если это пустой массив, или даже если это пустая строка, поэтому использование! empty () является хорошим способом убедиться, что пользователь заполнилинформация.

7 голосов
/ 20 июля 2010

"dispatch_address_postcode не является обязательным, и все равно будет работать, даже если оно пустое ..."

Просто посмотрите на это предложение еще раз.Если поле не является обязательным, то вполне нормально, если код запускается, если поле пустое.Если поле не является обязательным, не проверяйте его как обязательное.

Реальная проблема заключается в том, что is_null проверяет, только если переменная null.POSTed значения никогда не будут null, если они пустые, они будут '' (пустая строка).Все ваши !is_null тесты будут всегда быть true, и вы получите предупреждение, если переменная не установлена ​​(то, чего вы не хотите, чтобы происходило).Более подходящим тестом будет !empty.

Еще более подходящие тесты будут включать тест, если значение кажется действительным (выглядит ли электронная почта как адрес электронной почты, имеетхотя бы х цифр в нем?).Вам также следует циклически проходить по полям, чтобы сделать ваш код более читабельным, бесконечно вложенным и объединенным в цепочку if Условия не доставляют радости.

$mandatoryFields = array('foo' => 'email', 'bar' => 'telephone');

foreach ($mandatoryFields as $field => $rule) {
    if (empty($_POST[$field]) || !validateByRule($_POST[$field], $rule)) {
        raiseHell();
    }
}
1 голос
/ 20 июля 2010

Попробуйте написать свою собственную is_valid функцию и используйте ее вместо is_null.

Например (и это ни в коем случае не является всеобъемлющей):

function is_valid(&$array, $key, $required=false) {
    if(!array_key_exists($array))
        return false;
    $value = trim($array[$key]);
    if(empty($value) && $required)
        return false;
    return true;
}

Используйте вот так:

if(is_valid($_POST, 'personal_info_first_name', true) && ...)

0 голосов
/ 20 июля 2010

Редактировать: Пожалуйста, учтите это перед понижением.Я оставляю это здесь, чтобы служить «что не делать».Я бы удалил его, потому что это плохо, но тогда никто не учился бы на моих ошибках.

НЕ ДЕЛАЙТЕ ЭТОГО - читайте комментарии, чтобы узнать, почему это плохо

Мой ответ будет совершенно другим, но я совершенно другой парень ...

Я ПРОСТО обнаружил, что это будет работать.Вместо всего этого, просто присвойте переменные программно!Я думаю, что у меня есть некоторый рефакторинг, чтобы сделать ... вы знаете весь мой код ...

if (!is_array($_POST)){exit "$_POST isn't an array";}
foreach ($_POST as $param => $value){
    ${$param} = secure($value);
}

//now you have a set of variables that are named exactly as the posted param
//for example, $_POST['personal_info_first_name'] == $personal_info_first_name

if ($payment_method == "Pay by credit card."){
    //do stuff that you were gonna do anyways
} else if ($payment_method == "Pay by new credit card.") {
    if ($card_number && $expiration_date && $security_code){
        //do stuff that you were gonna do anyways
    } else {
        exit("info missing for credit card transaction");
    }
} else {
    exit("unknown payment method")
}

function secure($input){
    //sanitize user input
}

Если вы используете этот код, то не имеет значения, что является нулевым, а что нетв пределах foreach, потому что все, что является нулевым, просто не будет сделано.Затем вы можете использовать более приятный на вид код (и, возможно, более быстрый код), чтобы проверить все, что требуется.

0 голосов
/ 20 июля 2010

использование array_key_exists('card_number', $_POST) && !empty($_POST['card_number'])

0 голосов
/ 20 июля 2010
!is_null($_POST['personal_info_first_name']) && !isset($_POST['personal_info_first_name'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...