PHP тестирует пользовательский ввод для диапазона значений certin

#php

#php

Вопрос:

Кажется, я не могу понять, как создать php if stament, чтобы определить, ввел ли пользователь числовое значение и в значение диапазона certin.

  <form name="heat.php" class="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <fieldset>
        <legend>Get The Heat Index</legend>
        Tempeture <input type="text" name="temp"><br>
        Humidity <input type="text" name="hum"><br>
      <input id="submit"type="submit" value="Get The Heat Index">
     </feildset>   
 </form>
 <?php 
 $temp=
 $hum="";  
 if (empty($temp) amp;amp; empty($hum) amp;amp; ("80" <= $temp) amp;amp; ($temp >= "112") amp;amp; ("13" <= $hum) amp;amp; ($hum >= "85")) //validates temp input 
  {
    echo "The temperature should be a number between 80 and 112. 
        The humidity should be a number between 13 and 85. Please try again.";
  } else{

  }
?>
  

Как только пользователь введет правильные данные, произойдет остальное, но если это неправильное число или значение выходит за пределы диапазона, они получат сообщение об ошибке.

Комментарии:

1. попробуйте is_numeric, w3resource.com/php/function-reference/is_numeric.php и для диапазона ($min <= $value) amp;amp; ($value <= $max)

2. Для того, чтобы этот код выполнялся, ВСЕ условия должны быть верными, потому что вы используете amp;amp; проверки. Как он может быть пустым и больше 112?

3. @RakeshJakhar если вы хотите предоставить ссылку, лучше всего сделайте это на руководство. php.net/is_numeric

4. @miken32 ок, принято к сведению!

Ответ №1:

Вы можете сделать это за одну проверку — просто используйте filter_var

Пример:

 filter_var(
    $value, 
    FILTER_VALIDATE_INT, 
    [
        'options' => [
            'max_range' => 10, 
            'min_range' => 4
        ]
    ]
)
  

Это вернет значение as integer для всех передаваемых значений, которые являются целым числом и находятся в диапазоне от 4 до 10. (оба включительно!). Если переданное значение не соответствует параметрам, оно вернет false. Если вы не хотите, чтобы это false возвращалось, вы можете указать возвращаемое значение по умолчанию:

 filter_var(
    $value, 
    FILTER_VALIDATE_INT, 
    [
        'options' => [
            'max_range' => 10, 
            'min_range' => 4,
            'default' => 5
        ]
    ]
)
  

И рабочий код: https://3v4l.org/JZ54r

Ответ №2:

Вот код, который работает следующим образом:

 <?php
const minHum = 13;
const maxHum = 85;
const minTemp = 80;
const maxTemp = 112;

$temp = 0;
$hum  = 0;
$message = "";

$arrOptions = [["options" => ["min_range"=>minTemp, "max_range"=>maxTemp]],
   ["options" => ["min_range"=>minHum, "max_range"=>maxHum]]];

$arrShouldBe = ["The temperature should be a number between 80 and 112.",
   "The humidity should be a number between 13 and 85. Please try again."];


function failed2Validate($var,$arr){
      if ( filter_var($var, FILTER_VALIDATE_INT, $arr)== false)  {
             return true;
      }
      return false;
}

function validate($temp,$hum,$arrOptions, $arrShouldBe){
     $i=0;
     $message = "";
     $arrFuncs = [failed2Validate($temp,$arrOptions[0]), failed2Validate($hum,$arrOptions[1])];
     $count = count($arrFuncs);
     while ($i < $count) {
          $message = $arrFuncs[$i]? $arrShouldBe[$i]: "Success";
          if ($message != "Success"){
               break;
          }
          $i  ;
     }
     return $message;
}

/******* START ******/
if ( isset( $_POST["submit"] ) ) { 
   if ( !isset($_POST['temp']) || !isset($_POST['hum']) ) { 
      $message = "No data, No dice";
   }
   // check that data is numeric 
   else 
   if( ctype_digit($_POST['temp']) amp;amp; ctype_digit($_POST['hum']) ) {
          [$temp,$hum] = [ $_POST['temp'], $_POST['hum']]; 
   }
   else
   { //coerce data into numeric values
        [$temp,$hum] = [(int) $_POST['temp'], (int) $_POST['hum']]; 
   }  

   if ($message != "No data, No dice") {
     $message = validate($temp,$hum,$arrOptions, $arrShouldBe);
   }
   echo $message;
?>



<html>
<head><title>test</title>
</head>
<body>
<form name="myform" class="form" method="post" action="<?php echo $action; ?>">
    <fieldset>
        <legend>Get The Heat Index</legend>
        Tempeture <input type="text" name="temp"><br>
        Humidity <input type="text" name="hum"><br>
      <input name="submit" id="submit"type="submit" value="Get The Heat Index">
     </feildset>   
 </form>
 </body>
 </html> 
  

Смотрите смоделированный ПОСТ со слегка измененным PHP-кодом здесь.

Атрибут name формы OP кажется странно напоминающим, если это имя файла PHP. Итак, я изменил его на myform . Больше информации об атрибуте name в HTML-форме здесь.

Одна строка кода, а именно $temp= , выдаст ошибку синтаксического анализатора. Интересно, что вы можете написать инструкцию, например $temp; .

Нужно быть осторожным с логикой при использовании empty() против isset(), поскольку в отношении переменной, которой не было присвоено значение или установлено значение null, empty() возвращает true в отличие от isset(), которая возвращает false.

Самое главное, что предоставленные пользователем данные должны рассматриваться как испорченные. Итак, в этом случае код проверяет, отправил ли пользователь значения. Если это так, то данные проверяются, являются ли они числовыми. Если нет, то код преобразует данные POST в целые числа. В примере кода OP нет кода, указывающего, что опубликованные данные были присвоены каким-либо переменным. Фактически, код операционной системы никогда не проверяет, была ли форма вообще отправлена, поэтому я вставил код для проверки этого обстоятельства.

Наконец, сравнения должны выполняться в правильном порядке, т. Е. если пользователь вводит 90 для температуры, то тест («80» <= $ temp) всегда возвращает true , но если вы измените местами операнды, т. Е. ($temp <= «80»), то вы сможете точно определить, ввел ли пользователь температуру в желаемом диапазоне или произошла ошибка.

Примечание: Первоначально я пересмотрел свой ответ, вдохновленный примером, который кух-чан предоставляет с использованием filter_var ().