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'])
)
)
)
是什么给出了?
答案 0 :(得分:8)
看起来您正在尝试确保提交所有发布变量。你想要帮忙吗?
使用!empty()可能不是您特定问题的答案,但它肯定有助于您尝试做的事情。
如果没有设置$ _POST键,如果它是一个空数组,或者即使它是一个空字符串,empty()返回TRUE,所以使用!empty()是确保用户填写的好方法在信息中。
答案 1 :(得分:7)
“
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();
}
}
答案 2 :(得分: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) && ...)
答案 3 :(得分:0)
!is_null($_POST['personal_info_first_name']) && !isset($_POST['personal_info_first_name'])
答案 4 :(得分:0)
使用array_key_exists('card_number', $_POST) && !empty($_POST['card_number'])
答案 5 :(得分:0)
编辑:请在downvote之前考虑这个。我要离开这里作为“什么不该做”。我会删除它,因为它很糟糕,但是没有人会从我的错误中吸取教训。
不要这样做 - 阅读评论以获取有关为什么这不好的详细信息
我的回答将大不相同,但我是一个完全不同的人...
我 JUST 发现这会有效。而不是所有的设置和事情,只需以编程方式分配变量!我想我有一些重构......你知道我的所有代码......
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都不会被生成。然后,您可以使用更好看的代码(可能还有更快的代码)来检查所需的任何内容。