1

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'])
        )
    )
)

是什么赋予了?

4

6 回答 6

8

看起来您正在尝试确保提交所有帖子变量。你需要帮助吗?

使用 !empty() 可能不是您特定问题的答案,但它肯定有助于您尝试做的事情。

如果 $_POST 键未设置,如果它是一个空数组,或者即使它是一个空字符串,empty() 将返回 TRUE,因此使用 !empty() 是确保用户已填写信息的好方法.

于 2010-07-19T22:40:23.707 回答
8

dispatch_address_postcode不是强制性的,即使它是空白的,它仍然会运行......”

再看一遍那句话。如果该字段不是强制性的,如果该字段为空白,则代码运行完全可以。如果某个字段不是必填字段,请不要将其作为必填项进行测试。

真正的问题是,is_null仅测试变量是否为null. 发布的值永远不会是null,如果它们是空的,它们将是''(一个空字符串)。您的所有!is_null测试将始终true,如果未设置变量(您不希望发生的事情),您将收到警告。更合适的测试是!empty.

更合适的测试将包括该值是否有效的测试(电子邮件是否看起来像电子邮件地址,电话中是否至少有 x 位数字?)。您还应该遍历字段以使您的代码更具可读性,无尽的嵌套和链接if条件看起来并不有趣。

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

foreach ($mandatoryFields as $field => $rule) {
    if (empty($_POST[$field]) || !validateByRule($_POST[$field], $rule)) {
        raiseHell();
    }
}
于 2010-07-19T23:27:53.570 回答
1

尝试编写自己的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) && ...)

于 2010-07-19T22:46:36.547 回答
0
!is_null($_POST['personal_info_first_name']) && !isset($_POST['personal_info_first_name'])
于 2010-07-19T22:35:53.133 回答
0

采用array_key_exists('card_number', $_POST) && !empty($_POST['card_number'])

于 2010-07-19T22:41:32.860 回答
0

编辑:请在否决之前考虑这一点。我把它留在这里作为“不该做什么”。我会删除它,因为它很糟糕,但是没有人会从我的错误中吸取教训。

不要这样做-阅读评论以获取有关为什么不好的重要信息

我的答案会大不相同,但我是一个大不相同的人......

只是发现这会起作用。而不是所有的 isset 和事情,只需以编程方式分配变量!我想我有一些重构要做......你知道我所有的代码......

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
}

如果您使用此代码,那么什么是 null 什么不在 foreach 中并不重要,因为不会生成任何为 null 的内容。然后,您可以使用更好看的代码(并且可能更快的代码)来检查所需的任何内容。

于 2010-07-19T23:35:17.343 回答