我正在创建一个基本表格,用于购买成人票和儿童票。使用表单的设置方式,用户必须购买成人票,但无需购买儿童票。我添加了一些错误消息/验证以强制执行表单中的规则。所有成人票错误消息均正常工作,而儿童票则错误。
我希望子票规则检查以下内容:输入的有效数字(又名不是字母),数量大于0,并且输入了整数。我以为我已经设置了规则,因此它们仅在子票证输入不为空的情况下才开始验证,但是它们仍在尝试验证其为空时的有效性,考虑到没有子票证需要,我不希望这样做被购买。如何使它正常工作?
这是我的PHP代码以及错误消息。
<?php
$adult=$_POST['adult'];
$child=$_POST['child'];
$date=date('m/d/Y');
function isInteger($input) {
return(ctype_digit(strval($input)));
}
if (empty($adult)) {
$error_message='You must purchase at least 1 Adult ticket!';
}
else if (!is_numeric($adult)) {
$error_message="You must enter a valid number!";
}
else if ($adult <= 0) {
$error_message="You must enter a quantity greater than zero!";
}
else if (!isInteger($adult)) {
$error_message="You must enter a whole number for the quantity! (i.e. 1, 2, etc...)";
}
else if (!empty(!is_numeric($child))) {
$error_message="You must enter a valid number!";
}
else if (!empty($child <= 0)) {
$error_message="You must enter a quantity greater than zero!";
}
else if (!empty(!isInteger($child))) {
$error_message="You must enter a whole number for the quantity! (i.e. 1, 2, etc...)";
}
else if ($adult + $child > 5) {
$error_message="Sorry, there is a limit of 5 total tickets per customer!";
}
else {
$error_message='';
}
if($error_message !=""){
include('index.php');
exit();
}
?>
答案 0 :(得分:3)
如果$child = 1
if(!empty($child <= 0) )
等效于if(!empty(false))
,这毫无意义。
与(!empty(!is_numeric($child)))
改用if(isset($child) && $child <= 0) {}
您也可以使用$child = isset($_POST['child']) ? $_POST['child'] : 0
答案 1 :(得分:0)
不寻找可接受的答案,只是想提出一种更实用的方法。
PHP具有一些非常强大的内置函数来进行验证。您可以使用两个filter_var
和filter_input
,它们可以轻松地将数字值验证为整数,而无需检查整数的每个变体。
我建议不要使用elseif
立即引发一个需要处理的异常,而不是链接几个throw
条件,否则就停止执行。伴随try/catch
块以根据需要处理异常。
$adult = filter_var($_POST['adult'] ?? null, FILTER_VALIDATE_INT);
$child = filter_var($_POST['child'] ?? null, FILTER_VALIDATE_INT);
try {
if (false === $adult || false === $child) {
throw new \InvalidArgumentException('You must enter a whole number (1, 2, etc...)');
}
if (0 >= $child || 0 >= $adult) {
throw new \InvalidArgumentException('You must enter a quantity greater than zero!');
}
// at this point child and adult must be >= 1
// ensure total is at least 1 and at most 5
$total_options = ['options' => ['min_range' => 1, 'max_range' => 5]];
$total = filter_var($adult + $child, FILTER_VALIDATE_INT, $total_options);
if (false === $total) {
throw new \InvalidArgumentException('Sorry, there is a limit of 5 total tickets per customer!');
}
// what should happen next...
} catch(\InvalidArgumentException $e) {
$error_message = $e->getMessage();
require __DIR__ . '/index.php';
## always use absolute paths to prevent include_path overrides/overhead
} finally {
// do something else no regardless of success or Exception...
}
对于PHP <7.0替换
$_POST['child']) ?? null
与
isset($_POST['child']) ? $_POST['child'] : null