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

什么给了?

有帮助吗?

解决方案

"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();
    }
}

其他提示

看起来您尝试确保提交所有帖子变量。你想要这个吗?

使用!空()可能不是您具体问题的答案,但它肯定会帮助您想要做的看起来。

空()如果未设置$ _post键,则返回true,如果它是空的阵列,否则它是一个空字符串,所以使用!空()是确保用户已填写的好方法在信息中。

尝试编写自己的is_valid函数并使用该函数而不是世代odicetagcode。

例如

(这绝不是全面的):

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;
}
.

使用如此:

is_null

!is_null($_POST['personal_info_first_name']) && !isset($_POST['personal_info_first_name'])
.

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

编辑:请在下坡之前考虑这一点。我在这里离开这一点是“什么不做什么”。我会删除它,因为它是不好的,但是没有人会从我的错误中吸取教训。

不要这样做 - 阅读伟大信息的评论,因为这是坏的

我的答案会疯狂地不同,但我是一个疯狂的不同之家...

只是发现这将是工作。而不是所有的名称和事物,只是以编程方式分配变量!我想我有一些重构要做......你知道我的所有代码...

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才会进行。然后,您可以使用更好的Like Mook代码(并且可能更快代码)来检查所需的任何内容。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top