Как исправить Неустранимая ошибка: Uncaught TypeError: Неподдерживаемые типы операндов: строка + строка [PHP] [HTML]

поэтому, надеюсь, я задаю свой вопрос надлежащим образом. Я пытаюсь написать код калькулятора, который будет отображать ошибку, когда кто-то пытается ввести букву вместо числа. Как мне заставить это работать без «Неустранимая ошибка: Uncaught TypeError: Неподдерживаемые типы операндов: строка + строка», останавливающая код. И тогда Исключение должно отображаться рядом с полем ввода.

Я добавляю скриншот результата, который я пытаюсь получить, и я дам код, который у меня есть. [

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Calculator</title>
</head>

<?php

$number1 = "";
$number2 = "";
$result = "";
$calculate = "";

if (isset($_GET['calculate'])) {
    $number1 = $_GET['number1'];
    $number2 = $_GET['number2'];
    $calculate = $_GET['calculate'];

    function isValidNumber1($number1)
    {
        if (!is_numeric($number1)) {
            throw new Exception("Number 1 is not a number!");
        }
    }
    try {
        isValidNumber1($number1);
        $result = $number1 + $number2;
    } catch (Exception $e) {
        echo $e->getMessage() . PHP_EOL;
    }


    switch ($calculate) {
        case "Add":
            $result = $number1 + $number2;
            break;
        case "Substract":
            $result = $number1 - $number2;
            break;
        case "Multiply":
            $result = $number1 * $number2;
            break;
        case "Divide":
            $result = $number1 / $number2;
            break;
        case "Modulo":
            $result = $number1 % $number2;
            break;
    }
}

?>

<body>
    <h1>Calculator</h1>

    <form action="" method="get" id="calculator">

        <label for="number1">Number 1:</label>
        <input type="text" name="number1" value="<?php echo $number1; ?>"><br><br>
        <label for=" number2">Number 2:</label>
        <input type="text" name="number2" value="<?php echo $number2; ?>"><br><br>

        <?php
        echo "<p>Operation:  $calculate</p>";
        echo "<p>Result: $result</p>";
        ?>

        <div>
            <input type="submit" name="calculate" value="Add">
            <input type="submit" name="calculate" value="Substract">
            <input type="submit" name="calculate" value="Multiply">
            <input type="submit" name="calculate" value="Divide">
            <input type="submit" name="calculate" value="Modulo">
        </div>
    </form>

</body>

</html>

][1]

Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Введение в технологический стек Twitch
Введение в технологический стек Twitch
В этой статье мы подробно рассмотрим стек Twitch, который подразделяется на следующий набор технологий:
8 полезных HTML-тегов, которые лучше использовать вместо <div>
8 полезных HTML-тегов, которые лучше использовать вместо <div>
Когда я только начинал изучать html, я использовал div для всего, это был один из первых тегов, которые я выучил, и казалось, что он работает в любой...
HTML5: API локального хранилища (Local Storage)
HTML5: API локального хранилища (Local Storage)
LocalStorage - это простой способ хранения данных в браузере пользователя.
Доступность HTML - программирование с инклюзивной перспективой
Доступность HTML - программирование с инклюзивной перспективой
Представьте, что вы хотите поехать на пляж. Представьте, что вы упорно трудились весь год и заслужили это. Прибыв на место, вы обнаруживаете, что...
Именование классов CSS: Конвенция именования BEM
Именование классов CSS: Конвенция именования BEM
Сопровождаемость кода, сама по себе, является пульсирующим эффектом нескольких факторов. Когда часть программного обеспечения читабельна, ясна,...
0
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

исправить текущую реализацию

  • вам нужно добавить операторы switch внутри блока try,
  • поэтому, когда срабатывает исключение проверки, он избегает его запуска
  • а об отображении ошибки рядом с вводом вы можете установить exception message в variable и напечатать его рядом с вводом ",

ваша реализация после этих правок будет выглядеть так:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Calculator</title>
</head>

<?php

$number1 = "";
$number2 = "";
$result = "";
$calculate = "";
$number1Error = '';

if (isset($_GET['calculate'])) {
    $number1 = $_GET['number1'];
    $number2 = $_GET['number2'];
    $calculate = $_GET['calculate'];
    $errors = [];
    
    function isValidNumber1($number1)
    {
        if (!is_numeric($number1)) {
            throw new Exception("Number 1 is not a number!");
        }
    }
    
    
    try {
        isValidNumber1($number1);
        $result = $number1 + $number2;
        
        switch ($calculate) {
        case "Add":
        var_dump($number1);
            $result = $number1 + $number2;
            break;
        case "Substract":
            $result = $number1 - $number2;
            break;
        case "Multiply":
            $result = $number1 * $number2;
            break;
        case "Divide":
            $result = $number1 / $number2;
            break;
        case "Modulo":
            $result = $number1 % $number2;
            break;
    }
    
    } catch (Exception $e) {
        $number1Error = $e->getMessage() . PHP_EOL;
        
    }


    
}

?>

<body>
    <h1>Calculator</h1>

    <form action="" method="get" id="calculator">

        <label for="number1">Number 1: </label>
        <input type="text" name="number1" value="<?php echo $number1; ?>"> <?php echo $number1Error; ?><br><br>
        <label for=" number2">Number 2:</label>
        <input type="text" name="number2" value="<?php echo $number2; ?>"><br><br>

        <?php
        echo "<p>Operation:  $calculate</p>";
        echo "<p>Result: $result</p>";
        ?>

        <div>
            <input type="submit" name="calculate" value="Add">
            <input type="submit" name="calculate" value="Substract">
            <input type="submit" name="calculate" value="Multiply">
            <input type="submit" name="calculate" value="Divide">
            <input type="submit" name="calculate" value="Modulo">
        </div>
    </form>

</body>

</html>

Спасибо, Омар, это почти работает. Когда я впервые запускаю код, я получаю «Предупреждение: неопределенная переменная $number1Error», ссылаясь на переменную после поля ввода. Как это решить?

George 09.04.2022 07:52

просто инициализируйте его $number1Error = ''; перед try как в упомянутом примере в ответе

Omar Tammam 09.04.2022 07:54

Я использовал код, который вы посоветовали, но я все еще получаю предупреждение.

George 09.04.2022 08:23

это плохо, вам нужно определить это еще до isset условия, пример обновлен, пожалуйста, проверьте

Omar Tammam 09.04.2022 08:27

Спасибо, Омар, за быстрый ответ. Я переместил инициализацию $number1Error = ''; над первым оператором if, и теперь он работает.

George 09.04.2022 08:28

Другие вопросы по теме