формы — если еще php простой калькулятор

Это форма для калькулятора

<form method='post' action='result.php' name='calc_form'>

<input type='text' name='input1' size='15'>

<select name='operation'>
<option value="plus">+</option>
<option value="minus">-</option>
<option value="multi">*</option>
<option value="invalid">**</option>
<option value="divide">/</option>
</select>

<input type='text' name='input2' size='15'>
<input type='submit' value='go'></form>

Это PHP с оператором if elseif

<?php

define ('INVALID_INPUT', 'ERROR: invalid input');
define ('INVALID_OPERATOR', 'ERROR: invalid operator');$result = null;

if
(isset($_POST) and
isset($_POST['input1']) and
isset($_POST['input2']) and
isset($_POST['operation']))
{
$input1 = $_POST['input1'];
$input2 = $_POST['input2'];
$operation = $_POST['operation'];
switch ($operation)
{
case 'plus':
$result = $input1 + $input2;
break;
case 'minus':
$result = $input1 - $input2;
break;
case 'multi':
$result = $input1 * $input2;
break;
case 'divide':
$result = $input1 / $input2;
break;
default:
$result = INVALID_OPERATOR;
break;
}
}
elseif
(!isset($_POST) and
isset($_POST['input1']) and
isset($_POST['input2']) and
isset($_POST['operation']))
{
$result = INVALID_INPUT;
}

if ($result !== null)
{
echo <<<EOM<h2>you calculate</h2> $input1

<h2>and</h2>  $input2

<h2>result is:</h2>

$result

EOM;
}

?>

Я даже пытался только с оператором else и без условия, но он не будет отображать INVALID INPUT, когда ничего не добавляется в форму. Что здесь не так?

0

Решение

Проблема с этим фрагментом кода:

if
(isset($_POST) and
isset($_POST['input1']) and
isset($_POST['input2']) and
isset($_POST['operation']))

Даже если пользователь ничего не вводит в поля ввода, он все равно пройдет isset($_POST['input1']), поскольку они «установлены» в пустую строку. Попробуйте вместо этого переключиться на это:

if
(isset($_POST['input1']) && strlen($_POST['input1']) &&
isset($_POST['input2']) && strlen($_POST['input2']) &&
isset($_POST['operation']))
2

Другие решения

Вы можете просто использовать оператор else вместо оператора else if. Таким образом, если вы меняете входы, вам не нужно перечислять каждый из них дважды.

например:

if (isset($_POST) and
isset($_POST['input1']) and
isset($_POST['input2']) and
isset($_POST['operation']))
{
// result = calculation
} else
{
// result == code
}

Попробуйте это — я проверил это на моем сервере, и это работает!

calculator.php

<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors',1);;

define ('INVALID_INPUT', 'ERROR: invalid input');
define ('INVALID_OPERATOR', 'ERROR: invalid operator');
$input1 = $input2 = $operation = null;
if (isset($_POST['input1']) and  isset($_POST['input2']) and isset($_POST['operation']))
{

$input1 = $_POST['input1'];
$input2 = $_POST['input2'];
$operation = $_POST['operation'];
if(is_numeric($input1) and is_numeric($input2))
{
switch ($operation)
{
case 'plus':
$result = $input1 + $input2;
break;
case 'minus':
$result = $input1 - $input2;
break;
case 'multi':
$result = $input1 * $input2;
break;
case 'divide':
$result = $input1 / $input2;
break;
default:
$result = INVALID_OPERATOR;
break;
}
}
else
{
$input1 = '';
$input2 = '';
$operation = 'invalid';
$result = INVALID_INPUT;
}
}

?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title></title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body class="">

<form method='POST' action='calculator.php'>

<input type='text' name='input1' size='15' value="<?php echo $input1; ?>">

<select name='operation'>
<option <?php if($operation == 'plus') { echo 'selected';} ?> value="plus">+</option>
<option <?php if($operation == 'minus') { echo 'selected';} ?> value="minus">-</option>
<option <?php if($operation == 'multi') { echo 'selected';} ?> value="multi">*</option>
<option <?php if($operation == 'invalid') { echo 'selected';} ?> value="invalid">**</option>
<option <?php if($operation == 'divide') { echo 'selected';} ?> value="divide">/</option>
</select>

<input type='text' name='input2' size='15' value="<?php echo $input2; ?>">
<span>=</span>
<input type='text' name='result' size='50' value="<?php echo $result; ?>">

<input type='submit' value='go'></body>
</html>
2

Ваше состояние не так; это невозможно:

!isset($_POST) and
isset($_POST['input1']) and
isset($_POST['input2']) and
isset($_POST['operation'])

Я подозреваю, что вы имеете в виду

!isset($_POST) or
!isset($_POST['input1']) or
!isset($_POST['input2']) or
!isset($_POST['operation'])
1