为什么我的PHP错误消息无法正常工作?

时间:2019-02-21 04:06:59

标签: php

我正在创建一个基本表格,用于购买成人票和儿童票。使用表单的设置方式,用户必须购买成人票,但无需购买儿童票。我添加了一些错误消息/验证以强制执行表单中的规则。所有成人票错误消息均正常工作,而儿童票则错误。

我希望子票规则检查以下内容:输入的有效数字(又名不是字母),数量大于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();
  }
?>

2 个答案:

答案 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_varfilter_input,它们可以轻松地将数字值验证为整数,而无需检查整数的每个变体。

我建议不要使用elseif立即引发一个需要处理的异常,而不是链接几个throw条件,否则就停止执行。伴随try/catch块以根据需要处理异常。

示例https://3v4l.org/PJfLv

$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