#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 ().