Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
BlackWood 19.02.2018 в 13:37

1)

if (($_GET['x1'] === '') || ($_GET['x2'] === '')) {
    return 'Аргументы не переданы';
}
BlackWood 19.02.2018 в 13:40

2)

  switch ($_GET['operation']) {
    case '+' :
        $result = $x1 + $x2;
        break;
    case '-' :
        $result = $x1 - $x2;
        break;
    case '*' :
        $result = $x1 * $x2;
        break;
    case '/' :
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}
BlackWood 19.02.2018 в 14:17

3)

    case '/' :
        $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break; 
ivashkevich 19.02.2018 в 19:31

Отлично! Все правильно.

marquise 03.04.2018 в 11:13

Проверка на строку :

if ((gettype($x1)=== "string") && (gettype($x2) === "string")){
    return 'Введите числа';
}
else{
    $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
        switch ($_GET['operation']) {
            case '+':
                $result = $x1 + $x2;
                break;
            case '-':
                $result = $x1 - $x2;
                break;
            case '*':
                $result = $x1 * $x2;
                break;
            case '/':
                $result = $x1 / $x2;
                break;
            default:
                return 'Операция не поддерживается';
        }

        return $expression . $result;
}
ivashkevich 03.04.2018 в 15:38

Не пойдёт, в переменной $_GET['что-то'] всегда будет строка. Попробуйте ещё варианты.

P.S. else здесь лишний: если условие выполнится, то сработает return и код дальше не будет выполняться. Достаточно писать:

if (!тут_проверка_на_число){
    return 'Введите числа';
}

тут_просто_выполняем_код_дальше
KeeF3ar 19.04.2018 в 12:30

4 в индексе

 <label for="x1"></label><input type="number" name="x1" id="x1">

в calc.php

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (($_GET['x1'] == '') || ($_GET['x2'] == '')) {
    return 'Аргументы не переданы';
}

$x1 = intval($_GET['x1']);
$x2 = intval($_GET['x2']);

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 === 0) {
            return 'На ноль делить нельзя';
        } else $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 19.04.2018 в 17:35

Очень хорошо, что позаботились о клиентской стороне! А ещё можно было проверить, является ли переданное значение числом с помощью is_numeric().

[email protected] 03.10.2018 в 18:40

а можно использовать ctype_digit() вместо is_numeric()?

ivashkevich 04.10.2018 в 08:24

Тогда дробные числа не пройдут (содержат точку, а не только цифры)

1nSide 26.04.2018 в 13:21

Сделал, вроде все работает

<?php

if (empty($_GET)){
    return 'Ничего не переданно';
}

if (empty($_GET['operation'])){
    return 'Операция не переданна';
}

if ($_GET['x1'] === ''|| $_GET['x2'] === ''){
    return 'Аргументы 1 или 2 не переданны';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$operations  = $_GET['operation'];

if (is_numeric($x1) && is_numeric($x2)){
     switch ($operations){
        case '+':
            $result = $x1 + $x2;
            break;
        case  '-':
            $result = $x1 - $x2;
            break;
        case  '/':
            $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
            break;
        case  '*':
            $result = $x1 * $x2;
            break;

        default:
            return 'Операция не поддерживается';
    }
} else {
    return 'Введите число';
}

$expression = $x1 . ' ' . $operations . ' ' . $x2 . ' = ';

return $expression . $result;
ivashkevich 26.04.2018 в 17:29

Всё в общем-то очень хорошо)

Из улучшений:

  • Представьте, что в форме пропадает поле x1 и при её отправке вообще прропадает query-параметр x1=что-то
    Тогда при выполнении, там где происходит обращение к $_GET['x1'], возникнет ошибка.
    Чтобы этого избежать, стоит воспользоваться функцией array_key_exists() или isset() - так вы сможете убедиться, что такой ключ в массиве существует. А если нет - напишете соответствующую ошибку.
  • Переменная $operations на деле содержит только одну операцию, значит - $operation
  • При обработке ошибок мы не выводим исходное выражение - если операция не поддерживается, то сразу об этом пишем, без склейки с $expression. Для однообразия при делении на ноль стоит делать также - добавить if и вызывать в нём сразу return, если x2 === 0.
1nSide 28.04.2018 в 11:26

Так?

<?php
// проверяет через функцию пустой метод гет или нет
if (empty($_GET)){
    return 'Ничего не переданно';
}
// проверяем через функцию пустой метод гет с массивом операция 
if (empty($_GET['operation'])){
    return 'Операция не переданна';
}
// проверяем нахождения ключа в массиве метода гет
if (isset($_GET['x1']) && isset($_GET['x2'])){
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
} else return 'Ключу аргумента отсутсвоет';

    $operation = $_GET['operation'];
// проверка на то чтобы пользователь мог записовать только числа
if (is_numeric($x1) && is_numeric($x2)){
     switch ($operation){
        case '+':
            $result = $x1 + $x2;
            break;
        case  '-':
            $result = $x1 - $x2;
            break;
        case  '/':
            if($x2 != 0){
               $result = $x1 / $x2;
            } else {
                return 'На ноль нельзя делить';
            }
            break;
        case  '*':
            $result = $x1 * $x2;
            break;

        default:
            return 'Операция не поддерживается';
    }
} else {
    return 'Введите число';
}
// создаем переменную и записываем переменные в нужной последовательности
$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' = ';
// вывод результата
return $expression . $result;
ivashkevich 28.04.2018 в 18:16

Да, теперь все корректно. Но содержимое после if и else советую всегда помещать внутрь фигурных блоков, даже если это одна строка.

А switch можно написать вне if, это позволит избавиться от лишней вложенности. Просто сделайте проверку на ошибки отдельным условием:

if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'x1 и x2 должны быть числами';
}

switch ...

Понимаете, что проще стало? Сначала проверили данные на корректность, а потом уже с ними спокойно работем, избегая слишком громоздких условий.

1nSide 02.05.2018 в 12:41

Все сделал, не знаю что еще добавить можно) все работает)

<?php

if (empty($_GET)){
    return 'Ничего не переданно';
}

if (empty($_GET['operation'])){
    return 'Операция не переданна';
}

    $x1 = $_GET["x1"] ?? null;
    $x2 = $_GET["x2"] ?? null;
    $operation = $_GET['operation'];

if ($x1 === null || $x2 === null){
    return 'Ключу аргумента отсутсвоет';
}

if (!file_exists(__DIR__ . '/calc.php')){
    return 'Ошибка файла';
}

if (!is_numeric($x1) || !is_numeric($x2)){
    return 'Введите число';
}

     switch ($operation){
        case '+':
            $result = $x1 + $x2;
            break;
        case  '-':
            $result = $x1 - $x2;
            break;
        case  '/':
            if($x2 != 0){
               $result = $x1 / $x2;
            } else {
                return 'На ноль нельзя делить';
            }
            break;
        case  '*':
            $result = $x1 * $x2;
            break;

        default:
            return 'Операция не поддерживается';
    }

$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' = ';

return $expression . $result;
ivashkevich 02.05.2018 в 18:22

Всё супер. Только не понял, для чего вы внутри calc.php проверяете, что он существует. Это лишнее. Все остальное - огонь!

[email protected] 18.05.2018 в 20:01

А в степень почему-то не получается с помощью pow, только ** - подскажите почему так?

ivashkevich 19.05.2018 в 16:07

Потому что в PHP нет функции pow(), но есть оператор ** =)

andropij 17.06.2018 в 18:53
<?php

if (empty($_GET)) {
    return "nothing";
}

if (empty($_GET['operation'])) {
    return "no operation";
}

if (($_GET['number1']=='') || ($_GET['number2']=='')) {
    return "nothing";
}

$x1 = $_GET['number1'];
$x2 = $_GET['number2'];
$operation = $_GET['operation'];

$expression = $x1 . ' ' . $operation . '  ' . $x2 . ' = ';

switch ($operation) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '/':
        if ($x1 != 0) {
            $result = $x1 / $x2;
        } else {
            return 'на ноль делить нельзя';
        }
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;

единственное. Проблему со string решил так:

<input type="number" name="number1">
<input type="number" name="number2">

ivashkevich 18.06.2018 в 05:09

Ок, всё норм. Речь шла о проверке на бэкенде - функция is_numeric() позволяет проверить, что в переменной именно числовое значение.

[email protected] 23.06.2018 в 18:09

Пока так и не получилось прибавить 0. Пишу позже, может кому поможет. Разобрался, почему не получалось, потому-что проверял x1 и x2 на empty(), и если вводил 0, то php считал, что поле пустое

ivashkevich 23.06.2018 в 19:00

Ага, всё правильно, первое задание засчитано. А как в итоге сделал?

[email protected] 24.06.2018 в 00:09

Спасибо за замечательный курс. Все получилось, но пришлось подсмотриват в ответах других участников.

<?php
if (empty($_GET))
    return " Ничего не передано!";

if (empty($_GET['operation']))
    return " не передана операция";

if (($_GET['x1'] === null) || ($_GET['x2'] === null)) 
    return 'Аргументы не переданы';

    if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2']))
        return ' Введите числа';

    if (isset($_GET['x1']) && isset($_GET['x2'])){
    $x1 = intval($_GET['x1']);
    $x2 = intval($_GET['x2']);
    }
    $expression = $x1 .' '.$_GET['operation'].' '.$x2.' = ';

    switch ($_GET['operation']){
        case '+':
            $result = $x1 + $x2; break;
        case '-':
            $result = $x1 - $x2; break;
        case '*':
            $result = $x1 * $x2; break;
        case '/' :
            $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя'; break; 

        default:
           return 'операция не поддерживается';

    }

    return $expression.$result;
?>
ivashkevich 24.06.2018 в 07:07

Это абсолютно нормально, не забывайте в гугле и на stackoverflow тоже подглядывать.

DmitryGavrilov 28.06.2018 в 09:57
<?php

if (empty($_GET)) {
    return "Ничего не передано, массив пустой";
}

if (empty($_GET['operation'])) {
    return 'не передана операция';
}

//Теперь можно передать ноль
if (($_GET['x1'] == '') || ($_GET['x2'] == '')) {
    return 'Аргументы не переданы';
}

if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Нельзя вводить строковые значения';
}

//… задали переменные для массива гет
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

//Для наглядности выводим значения x1 и x2 =
$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

// собственно сами вычисления
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 != 0) {
            $result = $x1 / $x2;
        } else {
            return 'На ноль нельзя делить!';
        }
        break;

    default:
        return "операция не поддерживается";

}

return $expression . $result;
ivashkevich 28.06.2018 в 18:29

По поводу 'Нельзя вводить строковые значения' - не совсем правда. В коде проверка только на то, что это не число. Это ещё не значит, что там строка. Правильнее будет сказать именно о том, что значения должны быть числовыми.

В остальном - отлично!

DmitryGavrilov 29.06.2018 в 14:07

Спасибо! Учту!

Nikolas 12.07.2018 в 09:07

Ты случаем не пропустил закрывающий тек </label> для id="operation"?
Проверка на пустоту $_GET и сопутствующее ему выполнение бессмысленны,т.к. селектор по умолчанию предлагает первый вариант и при нажатии кнопки посчитать, это значение передастся.
Для чего задавать label если мы оставляем их пустыми?
Нужно ли в логике в конструкции switch задавать default, если у нас селектор содержит только два варианта?

ivashkevich 12.07.2018 в 18:07

Да, label лишние, убрал. Спасибо.

Проверка на пустоту не бессмысленна - нельзя доверять тому, что придёт от клиента. Нет гарантии что пользователи будут отправлять данные на бекенд исключительно из "правильной" формы. Ничто не мешает им создать свою форму с плохими данными и завалить ваш бекенд ошибками.

В switch лучше всегда добавляйте секцию default - в ней можно обрабатывать внештатные ситуации, когда пришли данные, которых быть не должно.

Nikolas 12.07.2018 в 18:25

Понял,спасибо! Отличный практический урок :)

dom1r 12.08.2018 в 16:14

Мой топовый код :D

<?php

if (empty($_GET)) {
    return 'Ничего не передано';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

//Обработка нулевых аргументов
if (empty($_GET['x1']) && $_GET['x1'] !== '0' || empty($_GET['x2']) && $_GET['x2'] !== '0') {
    return 'Не переданы аргументы';
}

//Обработка деления на 0
if (($_GET['x1'] !== '0' && $_GET['x2'] == '0') && $_GET['operation'] == '/') {
    return 'Деление на ноль!';
}

//Обработа строковых аргументов

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Переданные значения не являются числом';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = "{$x1} {$_GET['operation']} {$x2} = ";

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    default:
        return 'Опеация не поддерживается';

}

return "{$expression} {$result}";
ivashkevich 13.08.2018 в 15:25

Да, хорошо =)
Единственное, вместо

//Обработка нулевых аргументов
if (empty($_GET['x1']) && $_GET['x1'] !== '0' || empty($_GET['x2']) && $_GET['x2'] !== '0') {
    return 'Не переданы аргументы';
}

я бы написал:

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Не переданы аргументы';
}
Fox-24 14.08.2018 в 15:16

Благодарю!

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if ('' == $_GET['x1'] || '' == $_GET['x2']) {
    return 'Не переданы аргументы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

if (is_numeric($x1) && is_numeric($x2)) {

    if ($_GET['operation']) {

        switch ($_GET['operation']) {
            case '+':
                $result = $x1 + $x2;
                break;
            case '-':
                $result = $x1 - $x2;
                break;
            case '*':
                $result = $x1 * $x2;
                break;
            case  '/':
                $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
                break;
            default:
                return 'Операция не поддерживается';
        }

    }
} else {
    return 'Пожалуйста, введите число';
}

return $expression . $result;
ivashkevich 14.08.2018 в 20:41

Если с формы сейчас убрать input x1 или x2, то скрипт посыпется с warning-ами, из-за того что в массиве $_GET вообще нет ключей x1 и x2. Попробуйте исправить.

Fox-24 14.08.2018 в 22:21

Да, на сколько я знаю надо всегда проверять передаются ли параметры. Спасибо за замечание.

if (isset($_GET['x1']) && isset($_GET['x2'])) {
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
} else return 'Нет ключей. Обратитесь к разработчику этого калькулятора или попробуйте снова.';

Видимо упустил когда редактировал этот код:

if ('' == $_GET['x1'] || '' == $_GET['x2']) {
    return 'Не переданы аргументы';
}
ivashkevich 16.08.2018 в 21:49

Окей, и еще один совет: всегда используйте фигурные кавычки для конструкций if-else, даже если это одна строка.

artemjeka 07.09.2018 в 13:04
if (empty($_GET)) {
    return 'Ничего не передано!';
}
if (empty($_GET['operation'])) {
    return 'Не передана операция';
}
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Не переданы числовые аргументы';
}
$x1 = (float)$_GET['x1'];
$x2 = (float)$_GET['x2'];
$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 === (float)0) {
            $result = 'На ноль делить нельзя!';
        } else {
            $result = $x1 / $x2;
        }
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;
ivashkevich 07.09.2018 в 21:37

Если не будут переданы x1 или x2, будет ошибка, попробуйте исправить.

artemjeka 10.09.2018 в 09:08

Вроде нет ошибки. А только предупреждение выводится: "Не переданы числовые аргументы!".

ivashkevich 10.09.2018 в 23:20

А если их совсем из формы убрать?

artemjeka 11.09.2018 в 17:01

Да при пустых input'ах я проверял.

Dilik 13.09.2018 в 17:35
if (empty($_GET)) {
    return 'Nothing has been transferred!';
}
if (empty($_GET['operation'])) {
    return 'Operation not transferred';
}
if (($_GET['x1' === '']) || ($_GET['x2'] === '')) {
    return 'Arguments are not passed';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
if (!is_numeric($x1)) {
    return 'Input interger number';
}
if (!is_numeric($x2)) {
    return 'Input interger number';
}
if ($_GET['$x1'] = '0' || $_GET['$x2'] = '0') {
    return $x1 = 0 || $x2 = 0;
}

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? ($x1 / $x2) : 'you can not divide it by zero';
        break;
    default:
        return 'Operation not supported';
}
return $expression . $result;
ivashkevich 22.09.2018 в 09:41
if (($_GET['x1' === '']) || ($_GET['x2'] === '')) {

Вот здесь будет ошибка, если аргументы в форме вообще отсутствовали. Нужно проверять с помощью isset, затем проверить с помощью is_numeric, привести переменные к float, и только после этого сравнивать с 0 (не строкой, а числом).

if (!is_numeric($x1)) {
    return 'Input interger number';
}

is_numeric не гарантирует, что число будет именно целым, текст ошибки некорректен.

Benya 20.09.2018 в 19:45
<?php

if (empty($_GET)) {
    return 'Ничего не переданно!';
}

if (empty($_GET['operation'])) {
    return 'Не переданна операция';
}

if (($_GET['x1']==='') || ($_GET['x2']==='')) {
    return 'Не переданны аргументы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Введите числа!';
}else {
    $expression = $x1 . '' .$_GET['operation'] . '' . $x2 . '=';

    switch ($_GET['operation']) {
        case '+':
            $result = $x1 + $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '*':
            $result = $x1 * $x2;
            break; case '/':
        $result = $x2 != 0 ? $x1 / $x2 : 'Нельзя делить на 0';
        break;

        default:
            return 'Операция не поддерживается';
    }
}

return $expression . $result;
ivashkevich 22.09.2018 в 09:43
if (($_GET['x1']==='') || ($_GET['x2']==='')) {
    return 'Не переданны аргументы';
}

Будет ошибка, если поля в форме вообще отсутствовали, нужно проверять с помощью isset.

SBTesla 24.09.2018 в 11:08
<?php
// Проверяем переданны ли данные вобще
if (empty($_POST)) {
    return 'Ничего не передано';
}
// проверяем передана ли операция

if (empty($_POST['operation'])) {
    return 'операция не передана';
}

/* проверяем переданы ли аргументы, и проверяем числа это или нет.
проверяем можно ли передавать ноль */
if (($_POST['x1'] === '') || ($_POST['x2'] === '')) {
   return 'Не переданы аргументы';
}

if (is_numeric($_POST['x1']) || is_numeric($_POST['x2'])) {
} else {
    return 'Введите числовое значение';
}

/* создаем переменные  в которых будут лежать  наши
значения */

$x1 = $_POST['x1'];
$x2 = $_POST['x2'];

$output = $x1 . '' . $_POST['operation'] . '' . $x2 . '=';

switch ($_POST['operation']){
    case '+':
        $result = $x1 + $x2;
        break;
    case '-' :
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
        /* проверяем деление на ноль*/
    case '/':
        if ($x1 != 0) {
            return ' на ноль делить нельзя';
        }
        $result = $x1 / $x2;
        break;
    default:
        return 'операция не поддерживаеться';
}

return $output . $result;
ivashkevich 24.09.2018 в 23:14

Хорошо!

[email protected] 03.10.2018 в 18:41
<?php

if (empty($_GET)) {
    return 'Ничего не передано!';
}
if (empty($_GET['operation'])) {
    return 'Не передана операция';
}
if (($_GET['x1'] === '') || ($_GET['x2'] === '')) {
    return 'Аргументы не переданы';
}
if (!is_numeric($_GET['x1']) ||  !is_numeric($_GET['x2'])) {
    return 'В поле можно ввести только цифры';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '/':
        if ($x2 == 0){
            return 'На 0 делить нельзя!';
        }
        else {$result = $x1 /  $x2;}
        break;
    case '*':
        $result = $x1 *  $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 04.10.2018 в 07:20
if (($_GET['x1'] === '') || ($_GET['x2'] === '')) {
    return 'Аргументы не переданы';
}

Будет ошибка, если поля в форме вообще отсутствовали, нужно проверять с помощью isset.

CarfikDK 23.10.2018 в 00:15

Спасибо за урок! =)

Код из файла calc.php

<?php

if(empty($_GET))
{
    return 'Значений не передано!';
}
if(empty($_GET['operation']))
{
    return 'Операция не передана!';
}
if(empty($_GET['x1']) && $_GET['x1'] != 0 || empty($_GET['x2']) && $_GET['x2'] != 0)
{

}
if(gettype($_GET['x1']) === "string" || gettype($_GET['x2']) === "string" )
{
    return 'Введите числа!';
}

$x1= $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation'])
{
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if($x1 == 0 || $x2 == 0)
        {
            $result = 'На ноль делить нельзя'; //На самом деле выйдет бесконечность =)
        } else {
            $result = $x1 / $x2;
        }
        break;
    default:
        return 'Операция не подерживается';
}

return $expression . $result;

На счет того что добавить/улучшить:
1)Когда я попробовал ввести 2 - -2 у меня выдало "Введите числа"
2)Степень, корень, факториал

ivashkevich 23.10.2018 в 08:51

Вот тут что-то не так:

if(empty($_GET['x1']) && $_GET['x1'] != 0 || empty($_GET['x2']) && $_GET['x2'] != 0)
{

}

Вот тут стоить использовать для проверки is_numeric (так как параметр из POST-запроса это почти всегда строка):

gettype($_GET['x1']) === "string"

$x1 может быть нулем

        if($x1 == 0 || $x2 == 0)
        {
            $result = 'На ноль делить нельзя'; //На самом деле выйдет бесконечность =)
        }
CarfikDK 24.10.2018 в 19:50

Переделал

<?php

if(empty($_GET) && $_GET['x1'] != 0 && $_GET['x2'] != 0)
{
    return 'Значений не передано!';
}
if(empty($_GET['operation']))
{
    return 'Операция не передана!';
}
if(!is_numeric($_GET['x1'])|| !is_numeric($_GET['x2']))
{
    return 'Введите числа!';
}

$x1= $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation'])
{
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if($x2 == 0)
        {
            $result = 'На ноль делить нельзя'; //На самом деле выйдет бесконечность =)
        } else {
            $result = $x1 / $x2;
        }
        break;
    default:
        return 'Операция не подерживается';
}

return $expression . $result;
ivashkevich 26.10.2018 в 08:46
if(empty($_GET) && $_GET['x1'] != 0 && $_GET['x2'] != 0)

Если я передам два числа, отличные от нуля, то программа не будет работать. Вы хоть проверяйте, чтобы она хотя бы просто работала, прежде чем отправлять =)

CarfikDK 29.10.2018 в 23:42

Простите, я просто сидел в Универе на паре и почему-то подумал, что это вполне себе логичное решение =)

Вот робочий код ( как минимум у меня пашет =) )

<?php

if(empty($_GET) )
{
    return 'Значений не передано!';
}
if(empty($_GET['operation']))
{
    return 'Операция не передана!';
}
if(!is_numeric($_GET['x1'])|| !is_numeric($_GET['x2']))
{
    return 'Введите числа!';
}

$x1= $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation'])
{
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if($x2 == 0)
        {
            $result = 'На ноль делить нельзя'; //На самом деле выйдет бесконечность =)
        } else {
            $result = $x1 / $x2;
        }
        break;
    default:
        return 'Операция не подерживается';
}

return $expression . $result;
ivashkevich 30.10.2018 в 08:54

Если на форме убрать поля x1 и x2, и отправить запрос, то скрипт вот здесь вывалит ошибку.

if(!is_numeric($_GET['x1'])|| !is_numeric($_GET['x2']))

Но этот скрипт должен корректно работать, независимо от формы - нельзя доверять тому, что форма будет корректной. Поэтому нужно проверять сначала, пришли ли эти значения вообще или нет. Для этого можно использовать функцию isset().

stokato 05.11.2018 в 02:12
  • Попробуйте в качестве одного из аргументов передать 0. Какой получился результат? Почему так? Дополните код так, чтобы можно было передавать 0.
    if (empty(isset($_GET['x1'])) || empty(isset($_GET['x2']))) {
    return 'Не переданы аргументы';
    }
  • Усовершенствуйте калькулятор так, чтобы он умножал и делил.
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if($x2 != 0)
            $result = $x1 / $x2 ;
        else
            return 'Простите, хорошие интерпритаторы на ноль не делят, а я очень хороший! =)';
        break;
  • Что произойдёт, если поделить на ноль? Добавьте обработку такой ситуации.
    case '/':
        if($x2 != 0)
            $result = $x1 / $x2 ;
        else
            return 'Простите, хорошие интерпритаторы на ноль не делят, а я очень хороший! =)';
        break;
  • Что произойдёт, если в качестве аргумента передать вместо числа строку? Сделайте так, чтобы в качестве аргументов можно было отправить только числа.
    if (!is_numeric(trim($_GET['x1'])) || !is_numeric(trim($_GET['x2']))) {
    return 'В параметры передана строка, а должно быть число, исправьте и повторите ввод снова!';
    }
  • Какие ещё недостатки есть у этого кода? Как можно нарушить его работу? Что можно улучшить?

От себя добавил чтобы при проверки на строку, очищал пробелы, так как интерпретатор сам приводит к числовым значениям даже если есть пробелы слева и справа

Весь код

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty(isset($_GET['x1'])) || empty(isset($_GET['x2']))) {
    return 'Не переданы аргументы';
}

if (!is_numeric(trim($_GET['x1'])) || !is_numeric(trim($_GET['x2']))) {
    return 'В параметры передана строка, а должно быть число, исправьте и повторите ввод снова!';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if($x2 != 0)
            $result = $x1 / $x2 ;
        else
            return 'Простите, хорошие интерпритаторы на ноль не делят, а я очень хороший! =)';
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 05.11.2018 в 09:22

isset возвращает true или false, не имеет смысла запихивать его внутрь empty().
В остальном - отлично!

stokato 05.11.2018 в 10:38

Его использовал, чтобы интерпретатор обрабатывал как 0. А он определял, то ли как null, то ли еще как то. Оттолкнулся от того, что isset() проверяет на существование переменной и после этого нули уже отрабатываются, исходя из этих соображений использовал.

virtual2018 21.11.2018 в 16:42
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (!key_exists('x1', $_GET) || !key_exists('x2', $_GET)) {
    return 'Отсутсвуют аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Аргументы не могут быть строками';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 == 0) {
            return 'Ошибка деление на ноль';
        }
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 22.11.2018 в 09:33
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Аргументы не могут быть строками';
}

Не совсем корректное сообщение. Скорее так - "Аргументы должны быть числами".

Bogdan 13.12.2018 в 16:50
<?php
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

 if ($x1 === '' || $x2 === '') {   //1.Дополните код так, чтобы можно было передавать 0.
    return 'Не переданы аргументы';
}else if ($x2 == '0' && $_GET['operation'] == '/') {  //3.Что произойдёт, если поделить на ноль? Добавьте обработку такой ситуации.
    return 'На 0 делить нельзя';
}else if (!is_numeric($x1) || !is_numeric($x2)) {  //4. Сделайте так, чтобы в качестве аргументов можно было отправить только числа.
    return "Введите числа";
}

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '/':   //2.Усовершенствуйте калькулятор так, чтобы он умножал и делил.
        $result = $x1 / $x2;
        break;
    case '*':   //2.Усовершенствуйте калькулятор так, чтобы он умножал и делил.
        $result = $x1 * $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
Bogdan 13.12.2018 в 17:09

вот что вышло после оптимизации

<?php
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

if (!is_numeric($x1) || !is_numeric($x2)) {  //4. Сделайте так, чтобы в качестве аргументов можно было отправить только числа.
    return "Введите числа";
}

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '/':   //2.Усовершенствуйте калькулятор так, чтобы он умножал и делил.
        if ($x2 == '0'){
            return 'На 0 делить нельзя';
        }
        $result = $x1 / $x2;
        break;
    case '*':   //2.Усовершенствуйте калькулятор так, чтобы он умножал и делил.
        $result = $x1 * $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 14.12.2018 в 10:33

Другое дело. Не надо торопиться и скидывать первое, что пришло в голову) Еще стоить проверять с помощью isset, что переменные вообще пришли.

MrElektron 23.01.2019 в 22:54

Почему бы просто не указать атрибут pattern для формы, чтобы только числа вводились? ))

<input type="text" name="x1" pattern="^[ 0-9]+$">
ivashkevich 25.01.2019 в 09:56

Потому что форму может изменить любой желающий и поломать бекенд кривым запросом.

excent63 27.01.2019 в 14:22

Добрый день!
Немного не понял 5 задание, но улучшил немного передавая переменную как htmlspecialchars:

<?php

if (empty($_GET)){
    return 'Ничего не передано!';
}
if (empty($_GET['operation'])){
    return 'Не передана операция';
}
if (($_GET['x1'] === ' ') || ($_GET['x2'] === ' ')){
    return 'Не переданы аргументы';
}
//Чтобы в строке невозможно было передать код:
$x1 = htmlspecialchars ($_GET['x1']);
$x2 = htmlspecialchars ($_GET['x2']);

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
if (is_numeric($x1) && is_numeric($x2)) {
    switch ($_GET['operation']) {
        case '+':
            $result = $x1 + $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '*':
            $result = $x1 * $x2;
            break;
        case '/':
            $result = $x2 != 0 ? ($x1 / $x2) : 'Деление на 0 невозможно';
            break;
        default:
            return 'Операция не поддерживается.';
    }
} else {
    return 'Введите число';
}
return $expression . $result;
ivashkevich 29.01.2019 в 07:05

Привет. Четвертый пункт задания требует сделать проверку на то, что x1 и x2 являются числами. Если это сделать, то не будет надобности в htmlspecialchars - просто числа не могут быть кодом.

Пятое задание читай так - как можно текущий код поломать (передав что-либо в форму, изменив форму)? Как это можно исправить?

excent63 29.01.2019 в 07:13

Понял, при функции is_numeric и так уже ничего другого ввести не получится кроме чисел, а над тем как его можно поломать вечером подумаю)

Bugaga159 31.01.2019 в 00:51
if (empty($_GET)){
    return 'Ничего не передано!';
}
#Проверка на существование ключей в $_GET
$checkKeyInArray = function( array $listKeyInArray):bool
{  
    foreach($listKeyInArray as $keyInArray){
        if(!array_key_exists($keyInArray, $_GET) ){
            return false;
        }
    }
    return true;
};
$keyControl = ['x1', 'x2', 'operation'];
if($checkKeyInArray($keyControl)){
    if (empty($_GET['operation'])){
        return 'Не передана операция';
    }
    if (($_GET['x1'] === ' ') || ($_GET['x2'] === ' ')){
        return 'Не переданы аргументы';
    }
    //Чтобы в строке невозможно было передать код:
    $x1 = htmlspecialchars($_GET['x1']);
    $x2 = htmlspecialchars($_GET['x2']);

    $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
    if (!is_numeric($x1) && !is_numeric($x2)) {
        return 'Введите число';
    }
    switch ($_GET['operation']) {
            case '+':
                $result = $x1 + $x2;
                break;
            case '-':
                $result = $x1 - $x2;
                break;
            case '*':
                $result = $x1 * $x2;
                break;
            case '/':
                $result = $x2 != 0 ? ($x1 / $x2) : 'Деление на 0 невозможно';
                break;
            default:
                return 'Операция не поддерживается.';
        }
    return $expression . $result;
}
return 'Техническая проблема, обратитесь в техническую поддержку!';
ivashkevich 01.02.2019 в 23:56

array_key_exists - не нужно вызывать в цикле. Она сама пройдется по всему массиву.

[email protected] 31.01.2019 в 20:30
if (empty($_GET)){
        return 'Nichego net';
    }

    if (empty($_GET['operation'])) {
        return 'Nt peredna operacia';
    }
    if (($_GET['x1'] === '' ) || ($_GET['x2'] === '' )) {
        return 'Не переданы аргументы';
    }
        $x1 = $_GET['x1'];
        $x2 = $_GET['x2'];

    $expressionn = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . '=';
    //return $expressionn;

     if ((is_numeric($x1))  && (is_numeric($x2))){
            switch ($_GET['operation']) {
                case '/' :
                    $result = $x2 == 0 ? ' error' : ($x1 / $x2);
                    break;
                case  '+' :
                    $result = $x1 + $x2;
                    break;
                case  '-' :
                    $result = $x1 - $x2;
                    break;
                case  '/' :
                    $result = $x1 / $x2;
                    break;
                case  '*' :
                    $result = $x1 * $x2;
                    break;
                default :
                    return 'Operation failed';
            }
      } else {
    return 'Не верный тип';
    }

    return $expressionn . $result;
ivashkevich 01.02.2019 в 23:57

Ок!

[email protected] 09.03.2019 в 16:41

Привет! У меня вопрос по этому "Сделайте так, чтобы в качестве аргументов можно было отправить только числа." Я при создании своей формы установил четкий формат ввода, т.е. если пользователь накосячил в каких-то данных, окно все равно подсвечивается красным. В данном случае, при создании калькулятора, есть смысл устанавливать дополнительные ограничения на получаемые значения параметров из формы или достаточно того, что в форме они и так есть?

ivashkevich 09.03.2019 в 19:36

На стороне бэкенда должна быть своя проверка. Форму пользователь может изменить в своём браузере (например специально, чтобы все поломать).

[email protected] 10.03.2019 в 18:14
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if ($_GET['x1'] === '' || $_GET['x2'] === '') {
    return 'Не переданы аргументы';
}

if ($_GET['operation'] === '/' && $_GET['x2'] === '0') {
    return 'Деление на ноль невозможно';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Один из аргументов имеет неверный тип';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 11.03.2019 в 21:16

Проверку на то, что аргументы переданы стоит делать с помощью isset($_GET['arg']). Потому что если с формы эти поля не будут переданы (если их совсем убрать с формы), то при сравнении $_GET['arg'] === '' возникнет ошибка.

ashfedor 10.03.2019 в 18:29
if (empty($_GET)){
    return 'Ничего не переданно';
}
if (empty($_GET['operation'])){
    return ' Не заданно действие';
}
if (($_GET['x1']==='') || ($_GET['x2'] === '')){
    return 'Не заданны агрументы';
}
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])){
    return 'Аргументы не являются числами';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$operation = $_GET['operation'];
$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' ' . '=' . ' ';
switch ($_GET['operation']){
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? ($x1 / $x2) : ' На 0 дедить нельзя!';
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 11.03.2019 в 21:16

Проверку на то, что аргументы переданы стоит делать с помощью isset($_GET['arg']). Потому что если с формы эти поля не будут переданы (если их совсем убрать с формы), то при сравнении $_GET['arg'] === '' возникнет ошибка.

[email protected] 11.03.2019 в 21:23

Кстати, если передать 0, то будет ошибка, так как 0 считается за empty(это к вопросу в ДЗ)

ivashkevich 11.03.2019 в 21:35

Верно. Это тоже надо проверять с помощью isset.

Grewi 19.03.2019 в 00:09

v2

if (empty($_GET)) {
    return 'Ничего не передано';
}

if (!isset($_GET['x1'], $_GET['x2'], $_GET['operation'])) {
    return 'Отсутствуют данные для вычесления';
}

$x1 = str_replace(',', '.', $_GET['x1']);
$x2 = str_replace(',', '.', $_GET['x2']);
$oper = $_GET['operation'];

if (empty($oper)) {
    return 'Не передана операция';
}
if (($x1 === '') || ($x2 === '')) {
    return 'Не переданы документы';
}
if ((is_numeric($x1) === false) || (is_numeric($x2) === false)) {
    return 'Данные не являются числом';
}
if (($x2 === '0') && ($oper == '/')) {
    return 'На ноль делить нельзя!';
}

$expr = $x1 . ' ' . $oper . ' ' . $x2 . '=';

switch ($oper) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expr . ' ' . $result;
ivashkevich 19.03.2019 в 23:22

Результат isset нельзя сравнивать с null. Код проверки в самом начале нерабочий. Исправьте.

Проверка

if(empty($_GET)){

не имеет смысла после того как вы уже использовали ключи этого массива. Она должна быть в самом начале.

$_GET[operation];

Здесь в качестве ключа массива должна быть строка. Строки оформляются в кавычках. У вас же это - неопределенная константа.

Grewi 20.03.2019 в 02:28

Так правильно?

ivashkevich 20.03.2019 в 09:59

Теперь супер =)

XXX 24.03.2019 в 16:39
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}
if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (is_null($_GET['x1']) || is_null( $_GET['x2']) )  {  // 1. Передача нуля.
    return 'Не переданы аргументы';
}

$x1=$_GET['x1'];
$x2=$_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
if(is_numeric($_GET['x1']) && is_numeric($_GET['x2'])) {              //4. Проверка на строку
    switch ($_GET['operation']) {
        case '+':
            $result = $x1 + $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '^':
            $result = $x1 ** $x2;
            break;
        case '%':
            if ($_GET['x2'] != 0) {                                //3. если делить на 0.
                $result = $x1 % $x2;
            } else $result = 'На ноль делить нельзя!';
            break;
        case '/':
            if ($_GET['x2'] != 0) {                                 //3. если делить на 0.
                $result = $x1 / $x2;
            } else $result = 'На ноль делить нельзя!';
            break;
        case '*':
            $result = $x1 * $x2;
            break;
        default:
            return 'Операция не поддерживается';
    }

    if ($_GET['x2'] == 0 && $_GET['operation'] == '/' || $_GET['operation'] == '%') {            //3. если делить на 0.
        return $result;
    } else
        return $expression . $result;
}
else return 'Ведите число, а не строку!';
XXX 24.03.2019 в 22:47

У меня вопрос такой. После перезагрузки браузера перестал работать код. До этого работал. И другие варианты кода в коментах тоже не работают. В чем может быть причина?

ivashkevich 25.03.2019 в 11:32

Возможно, кеш. Ctrl + shift + R в браузере.

ivashkevich 25.03.2019 в 11:31

Ок. Только блоки кода if-else всегда должны быть в фигурных скобках.

polvanovv 30.03.2019 в 16:06

1)

if ($_GET['x1'] === '' || $_GET['x2'] === ''){
    return 'Не переданы аргументы';
}

2)

case '/':
        $result = $x1 / $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;

3)

case '/':
        $result = $x2 != 0 ? $x1 / $x2 : 'На ноль делить нельзя!';
        break;

4)

<input type="number" name="x1">
<input type="number" name="x2">

5) Он прекрасен) Если улучшать то JS наверно.

ivashkevich 01.04.2019 в 21:20
  1. Проверку на то, что аргументы переданы стоит делать с помощью isset($_GET['arg']). Потому что если с формы эти поля не будут переданы (если их совсем убрать с формы), то при сравнении $_GET['arg'] === '' возникнет ошибка.

Остальное отлично.

Boodoo 04.04.2019 в 06:23
<?php
    if(empty($_GET)) {
        return 'Ничего не передано!';
    }
    if(empty($_GET['operation'])) {
        return 'Не передана операция!';
    }
    if(!isset($_GET['x1']) || !isset($_GET['x2'])) {
        return 'Не переданы аргументы';
    }
    if(!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
        return 'Вводить можно только цифры!';
    }

    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
    $oper = $_GET['operation'];

    $exp = $x1 . ' ' . $oper . ' ' . $x2 . ' = ';

    switch($oper) {
        case '+' :
            $result = $x1 + $x2;
            break;
        case '-' :
            $result = $x1 - $x2;
            break;
        case '*' :
            $result = $x1 * $x2;
            break;
        case '/' :
            if($x1 == 0 || $x2 == 0) {
                return 'Но ноль делить нельзя!';
            }
            $result = $x1 / $x2;
            break;
        default :
            return 'Операция не поддерживается';
    }

    return $exp . $result;

Не приходит в голову, как код можно нарушить, какие недостатки у кода и как его улучшить. Опыта еще не хватает.

ivashkevich 04.04.2019 в 06:51

Отлично :)

[email protected] 06.04.2019 в 18:37
<?php

if ($_GET['one'] === '' || $_GET['two'] === '') {
  return 'Не переданы аргументы';
}

if (($_GET['one'] == 0 || $_GET['two'] == 0) && ($_GET['operation'] == '/' || $_GET['operation'] == '*')) {
  return 'При умножении и делении на 0 результат всегда будет 0';
}

$one = $_GET['one'];
$two = $_GET['two'];

$expression = $one . ' ' . $_GET['operation'] . ' ' . $two . ' = ';

switch ($_GET['operation']) {
  case '+':
    $result = $one + $two;
    break;
  case '-':
    $result = $one - $two;
    break;
  case '*':
    $result = $one * $two;
    break;
  case '/':
    $result = $one / $two;
    break;
  default:
    return 'Операция не поддерживается';
}

return $expression . $result;
?>

По улучшениям:

  1. При умножении та же песня что и при делении (всегда 0);
  2. Первые две проверки можно убрать, так как operation всегда имеет какое-либо значение, по умолчанию.
  3. Возможно можно использовать тернарный оператор, но это не точно)))
ivashkevich 08.04.2019 в 21:25

Проверку на то, что аргументы переданы стоит делать с помощью isset($_GET['arg']). Потому что если с формы эти поля не будут переданы (если их совсем убрать с формы), то при сравнении $_GET['arg'] === '' возникнет ошибка.

Делить ноль на что угодно - можно. Это корректное поведение и результатом будет 0. Калькулятор не показывает ошибки при такой операции, нужно просто вывести 0 в результате. То же и с умножением.

Делить что угодно на ноль - будет неопределенность (в пределе - бесконечность). И тут уже нужно показывать ошибку.

[email protected] 13.04.2019 в 23:42

По 1 пункту задания: если использовать код

if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}

то при передачи 0 в качестве одного из аргументов результат будет "Не переданы аргументы", потому что 0 принимается как пустое значение.

Доработка калькулятора:

<?php

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$operation = $_GET['operation'];

if (empty($_GET)) {
    return 'Ошибка! Ничего не передано!';
}
if (empty($operation)){
    return 'Операция не переданна';
}
if ($x1 == null || $x2 == null) {
    return 'Ошибка! Аргумент 1 или аргумент 2 не передан!';
}
if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Ошибка! Введите число!';
}

$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' = ';

switch ($operation) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
break;
case '/':
        if ($x2 == 0) {
            return 'Ошибка! На ноль делить нельзя';
        } else {
            $result = $x1 / $x2;
        }
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 14.04.2019 в 00:25

Проверку на то, что аргументы переданы стоит делать с помощью isset($_GET['arg']). Потому что если с формы эти поля не будут переданы (если их совсем убрать с формы), то возникнет ошибка.

[email protected] 14.04.2019 в 00:39

Я поменял

if ($x1 == null || $x2 == null) {
    return 'Ошибка! Аргумент 1 или аргумент 2 не передан!';
}

на

if (!isset($x1) || !isset($x2)) {
    return 'Ошибка! Аргумент 1 или аргумент 2 не передан!';

и теперь если я не завожу какой-нибудь из аргументов, то мне возвращается "Ошибка! Введите число!" хотя по моим расчетам должно вернуться "Ошибка! Аргумент 1 или аргумент 2 не передан!". Сижу и пока что не могу понять почему так.

ivashkevich 14.04.2019 в 00:43

Вообще-то ошибка будет здесь:

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

Попробуйте удалить одно из полей на форме (не отправить пустым, а именно удалить инпут) и отправить запрос.

[email protected] 14.04.2019 в 00:55

Удалил инпут, отправил запрос без аргумента и вот тут мне вернулось "Ошибка! Аргумент 1 или аргумент 2 не передан!", но потом вернув обратно опять тоже самое.
Почему здесь ошибка?

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
ivashkevich 15.04.2019 в 09:51

Потому что если на форме нет инпута с именем x1, то этого значения не будет в массиве $_GET. А если обратиться к несуществующему элементу, то будет ошибка.

[email protected] 14.04.2019 в 20:04

А как передать значение если мы используем checkbox или radio

ivashkevich 15.04.2019 в 08:10

У них есть value, которое также доступно, как и значения инпутов.

artemship 18.04.2019 в 18:15
<?php

if (empty($_GET)) {
    return 'Ничего не передано';
}

if (!isset($_GET['x1']) || !isset($_GET['x2']) || !isset($_GET['operation'])){
    return 'Ключи не найдены';
}

if (empty($_GET['operation'])) {
    return 'Операция не задана';
}

if (($_GET['x1'] === '' || $_GET['x2'] === '')) {
    return 'Аргументы не переданы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])){
    return 'Аргументы могут содержать только числа!';
}

if (($_GET['operation'] == '/') && ($_GET['x2'] == 0)) {
    return 'Деление на 0';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$operation = $_GET['operation'];

$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' = ';

switch ($operation) {
    case '+' :
        $result = $x1 + $x2;
        break;
    case '-' :
        $result = $x1 - $x2;
        break;
    case '*' :
        $result = $x1 * $x2;
        break;
    case '/' :
        $result = $x1 / $x2;
        break;
    default :
        return 'Операция не поддерживается';
}

return $expression . $result;

Из улучшений: можно добавить обработку ',' для дробных чисел.

ivashkevich 18.04.2019 в 19:32

Супер! Отличная домашка

[email protected] 10.05.2019 в 21:45
ivashkevich 11.05.2019 в 13:56
  1. Вместо $_GET[x1] должно быть $_GET['x1']. В качестве ключа должны использоваться строки! Вы же используете что-то, что интерпретатор пытается распознать как константу. Но такой константы не находит и поэтому берет строку с её названием. Но так делать не надо, это не очевидно и работает медленнее чем при явном использовании строк.
  2. Куда делись проверки на то, что эти значения в массиве $_GET вообще есть? Я вас такому не учил.
  3. Вот здесь
    if ($firstOperand === '0' || $secondOperator === '0') {
                return 'на ноль делить нельзя';
            }

    неправильно. Делить ноль на что-то можно.

[email protected] 11.05.2019 в 21:27
$firstOperand = $_GET['x1'];
$secondOperator = $_GET['x2'];
$operator = $_GET['operation'];
$result = 0;

if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'не введены операнды';
}
if(($firstOperand === '') || ($secondOperator === '')) {
    return 'не введены операнды';
}
if (!is_numeric($firstOperand) || !is_numeric($secondOperator)) {
    return 'доступны только числа';
}

switch ($operator) {
    case '+':
        $result = $firstOperand + $secondOperator;
        break;
    case '/':
        if ($secondOperator === '0') {
            return 'на ноль делить нельзя';
            break;
        } else {
            $result = $firstOperand / $secondOperator;
            break;
        }
    case '-':
        $result = $firstOperand - $secondOperator;
        break;
    case '*':
        $result = $firstOperand * $secondOperator;
        break;
}
// вопрос по повуду проверки переменной operator зачем её делать если по дефолту она всегда + соотвецтвенно у меня не пустой $_GET
return $firstOperand . ' ' . $operator . ' ' . $secondOperator . '= ' . $result;
ivashkevich 12.05.2019 в 09:54

По второму пункту ничего не исправили. Где проверка на то, что такие ключи в массиве вообще есть? Если с формы убрать сейчас input x1, и отправить запрос, то на строке

$firstOperand = $_GET['x1'];

возникнет ошибка. Из-за того что нет в массиве такого ключа.

Чтобы этого избежать нужно проверять это с помощью isset, empty или array_key_exists. ОБЯЗАТЕЛЬНО!

Moskva 31.05.2019 в 22:12

Код:

<?php
if (empty($_GET)){
    return 'Ничего не передано';
}

if (empty($_GET['operation'])){
    return 'Не передана операция';
}

if ((empty($_GET['x1'])) && (empty($_GET['x2']))){
    return 'Не переданы аргументы';
}

$x1= $_GET['x1'];
$x2= $_GET['x2'];

if ((is_numeric($x1)) && (is_numeric($x2))) {

    $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

    switch ($_GET['operation']) {
        case '+':
            $result = $x1 + $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '/':
            if ($x2 == 0) {
                return 'На ноль делить нельзя';
            }
            $result = $x1 / $x2;
            break;
        case '*':
            $result = $x1 * $x2;
            break;
        default:
            return 'Операция не поддерживается';
    }
    return $expression . $result;
}
else return 'Переменные должны быть числами';
ivashkevich 03.06.2019 в 18:00

Если передать в качестве аргументов передать 0 и 0, то выведется сообщение "Не переданы аргументы". А должно быть "На ноль делить нельзя".

else return 'Переменные должны быть числами';

Всегда используйте фигурные скобки для конструкций if-else, даже если одна строка. Правильно:

else {
    return 'Переменные должны быть числами';
}

В остальном норм.

Moskva 26.06.2019 в 15:52

Понял, спасибо, всё исправил как надо.

<?php
if (empty($_GET)){
    return 'Ничего не передано';
}

if (empty($_GET['operation'])){
    return 'Не передана операция';
}
if (($_GET['x1'] == 0) && ($_GET['x2'] == 0)){

    $x1= $_GET['x1'];
    $x2= $_GET['x2'];

    if ((is_numeric($x1)) && (is_numeric($x2))) {

        $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

        switch ($_GET['operation']) {
            case '+':
                $result = $x1 + $x2;
                break;
            case '-':
                $result = $x1 - $x2;
                break;
            case '/':
                if ($x2 == 0) {
                    return 'На ноль делить нельзя';
                }
                $result = $x1 / $x2;
                break;
            case '*':
                $result = $x1 * $x2;
                break;
            default:
                return 'Операция не поддерживается';
        }
        return $expression . $result;
    }
    else {
        return 'Переменные должны быть числами';
    }
}elseif ((empty($_GET['x1'])) && (empty($_GET['x2']))){
    return 'Не переданы аргументы';
}
ivashkevich 27.06.2019 в 19:03

Сначала нужно проверить, что x1 и x2 вообще есть в запросе. Это делается с помощью функции isset.

esqrx 08.06.2019 в 21:08
<?php
//Убрал проверку ввода операции так как ничего не ввести там невозможно
if (($_GET['x1'] == '') || ($_GET['x2'] == '')) {
    return 'Не переданы аргументы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/' :
        $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 09.06.2019 в 05:16

Зря убрали проверку. Запрос на бэкенд может прийти не только с вашей формы. И тогда всё пропало. Проверка обязательна! И на то, что в массиве $_GET есть ключи x1 и x2, и на то, что есть operation.
Также нет проверки на то, что x1 и x2 - числа.

Bizzzon 09.07.2019 в 22:33
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}
if (empty($_GET['operation'])) {
    return 'Не передана операция';
}
if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}

if (($_GET['number1'] == '') || ($_GET['number2'] == '')) {
    return "Допустимо вводить только числа";
}
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        return $result;
    case '-':
        $result = $x1 - $x2;
        return $result;
    case '*':
        $result = $x1 * $x2;
        return $result;
    case '/':
        if ($x2 == 0) {
            return 'Деление на 0 невозможно';
            break;
        }
        $result = $x1 / $x2;
        return $result;
    default:
        return 'Операция не поддерживается';
}

Сделал всё, кроме 0. Я думаю, что 0 не воспринимается как число, т.к. трактуется интерпретатором как 'false', но ничего не смог сделать. Подскажите мою ошибку

ivashkevich 12.07.2019 в 05:27
if (($_GET['number1'] == '') || ($_GET['number2'] == '')) {
    return "Допустимо вводить только числа";
}

А вот это что такое?

Для проверки числовых полей нужно использовать комбинацию из isset и is_number. Обязательно изучите и сделайте.

Bizzzon 12.07.2019 в 21:23
if(!is_number($_GET['number1'] || $_GET['number2'] {
     return 'Допустимо вводить только числа'
}

Так будет вернее?

ivashkevich 14.07.2019 в 06:38

Это вообще нерабочий код

Reechniy 12.07.2019 в 14:31

Добавил возведение в степень, на больше не хватило фантазии, в таком исполнении калькулятора=)

<?php
if(empty($_GET)){
    return 'Ничего не передано!';
}
if(empty($_GET['operation'])){
    return 'Не передана операция';
}
if (($_GET['x1']==='')|| ($_GET['x2']==='')){
    return 'Аргументы не переданы';
}
if (!is_numeric($_GET['x1'])|| !is_numeric($_GET['x2'])){
    return 'Переданные значения не являются числом';
}

$x1=$_GET['x1'];
$x2=$_GET['x2'];

$expression=$x1.''.$_GET['operation'].''.$x2.'=';

switch ($_GET['operation']){
    case'+';
    $result=$x1+$x2;
    break;
    case '-';
    $result=$x1-$x2;
    break;
    case'*';
    $result=$x1*$x2;
    break;
    case'/';
    if($x2!==0){
        return 'На ноль делить нельзя!';
    }else
        $result=$x1/$x2;
    break;
    case '^';
    $result=pow($x1,$x2);
    break;
    default:
        return 'Операция не поддерживается';
}
return $expression.$result;
ivashkevich 14.07.2019 в 06:41
$_GET['x1']===''

Если такого ключа в массиве нет, то будет ошибка. Обязательно проверять сначала с помощью empty или isset. В вашем случае второй вариант.

Reechniy 14.07.2019 в 14:16

ок, спасибо понял

AlexxxEy 18.07.2019 в 19:25
if(empty($_GET)){
    echo 'Ничего не передано </br>';
}elseif(empty($_GET['operation'])){
    echo 'Не передана операция </br>';
}elseif(is_numeric($_GET['x1']) == false || is_numeric($_GET['x2']) == false){
    echo 'Нельзя передавать строку </br>';
}elseif(empty($_GET['x1']) != '' && empty($_GET['x2']) != ''){
    echo 'Не переданы аргументы </br>';
}elseif(empty($_GET['x1']) === ''){
    echo 'Не передан аргумент х1 </br>';
}elseif(empty($_GET['x2']) === ''){
    echo 'Не передан аргумент х2 </br>';
}else {
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
    $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch($_GET['operation']) {
    case '+' :
        $result = $x1 + $x2;
        break;
    case '-' :
        $result = $x1 - $x2;
        break;
    case '*' :
        $result = $x1 * $x2;
        break;
    case '/' :
        if($x1 == 0){
            echo 'На ноль делить нельзя </br>';
        }else {
            $result = $x1 / $x2;
        }
        break;
    default:
        return 'Операция не может быть выполнена';
}

return $expression . $result;
}
ivashkevich 18.07.2019 в 19:35

Ужас с проверками! Вам нужно разобраться с тем, как работает empty и isset. Сейчас полный бред. Разбирайтесь, исправляйте.

kvakazuabr 20.07.2019 в 12:58

пишите здесь ваш код
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty($_GET['int x1'] + 1) || empty($_GET['int x2'] + 1)) {
    return 'Не переданы аргументы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        if ($x1 == 0 || $x2 == 0 || ($x1 == 0 && $x2 == 0)) {
            $result = 'при умножении числа на 0 или 0 на число или 0 на 0 всегда будет 0, не делайте так';
        } else {
            $result = $x1 * $x2;
        }
        break;
    case '/':
        if ($x1 == 0 || $x2 == 0 || ($x1 == 0 && $x2 == 0)) {
            $result = 'при делении 0 на число или 0 всегда  будет 0, а делить число на 0 нельзя, не делайте так';
        } else {
            $result = $x1 / $x2;
        }
        break;

    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

``
ivashkevich 20.07.2019 в 14:44
if (empty($_GET['int x1'] + 1) || empty($_GET['int x2'] + 1)) {
    return 'Не переданы аргументы';
}

Это что такое?

kvakazuabr 20.07.2019 в 15:06
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'переданые аргументы не коректны';
} так вроде все коректно отрабатывает
ivashkevich 21.07.2019 в 05:42

За исключением случая, когда x1 и x2 не переданы. Предварительно нужно ОБЯЗАТЕЛЬНО проверить аргументы с помощью isset.

kvakazuabr 21.07.2019 в 08:17

если я ничего не передаю проверка отрабатывает и выводит return 'переданые аргументы не коректны';

ivashkevich 21.07.2019 в 08:22

При этом будет notice, так как данных ключей в массиве нет. Под "ничего не передаю" нужно понимать вообще отсутствие этих полей на форме.

kvakazuabr 21.07.2019 в 13:55

не совсем понял is_numeric отсекает все те некорректные значения которые отсекает isset плюс отсекает строки зачем еще проверять isset-ом?
данных ключей в массиве нет - вы имели в виду вообще отсутсвие ключей в массиве или то что у этих ключей отсутствует значение? эти ключи в массиве есть но с пустыми значениями

ivashkevich 21.07.2019 в 14:29

Я имел в виду полное отсутствие ключей. Как если эти поля вообще убрать с формы, а затем отправить запрос. Поверьте, на реальном сайте найдутся пользователи, которые именно так и сделают.

kvakazuabr 21.07.2019 в 17:18

я вас понял

Vladimir96 18.08.2019 в 19:09

Вопросы:
1)Правильно ли я понял, что GET и POST преобразует все в строки?
2)Когда я заполняю форму то на странице результата я вижу такую ссылку http://calculate.loc/result.php?numOne=3&index=%2B&numTwo=4
а если убрать все данные и ввести вот так http://calculate.loc/result.php, мне выдаст кучу ошибок, ведь форму получается просто проигнорили)
Это норм или мой любимый калькулятор смогут взломать как картонную коробочку?)

3)Почему в условии if вы пишите return a не echo? И как вообще return выводит строки, когда он только должен возвращать?))

Домашнее задание
Чтобы калькулятор принимал только числа, я на страницу с html формой поменял атрибут на type="number";

<?php
    $numOne = $_GET['numOne'];
    $numTwo = $_GET['numTwo'];
    $index = $_GET['index'];

    if(empty($numOne) && empty($numTwo)) {
        return 'Вы ничего не вписали';
    }

    if(empty($numOne) && $numOne != 0) {
        return 'Не ввели первое число';
    }

    if(empty($numTwo) && $numTwo != 0) {
        return 'Не ввели второе число';
    }

    switch ($index) {
        case '+':
            $calculatorResult = $numOne + $numTwo;
            break;
        case '-':
            $calculatorResult = $numOne - $numTwo;
            break;
        case '/':
            if($numOne == 0) {
                $calculatorResult = 0;
                break;
            }
            if ($numTwo == 0) {
                $calculatorResult = 'Деление на ноль невозможно';
                break;
            }
            $calculatorResult = $numOne / $numTwo;
            break;
        case '*':
            if($numOne == 0 || $numTwo == 0){
                $calculatorResult = 0;
                break;
            }
            $calculatorResult = $numOne * $numTwo;
            break;
        default:
            echo 'Похоже ты сломал калькулятор, ты божественный хакер!';
    }
    $result =  $numOne . ' ' . $index . ' ' . $numTwo . '  = ' . $calculatorResult;
    return $result;
ivashkevich 18.08.2019 в 19:39
  1. Верно
  2. Поэтому данные, приходящие с форнтенда, всегда нужно проверять. Не должно быть ошибок, в уроке мы добавляли проверки на наличие параметров в запросе.
  3. Ознакомьтесь с тем, как работают require и include в связке с return

Валидация на форме это хорошо, но обязательно надо проверять запрос на стороне бэкенда. Для проверки стоило использовать функцию is_numeric. В остальном все хорошо.

Dreft 02.09.2019 в 14:06
<?php
    if (empty($_GET)) {
        return "Ничего не передано.";
    }

    if (empty($_GET['x1']) || empty($_GET['x2'])) {
        return "Не переданы аргументы";
    }

    if (empty($_GET['operation'])) {
        return "Не выбрано действие";
    }

    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];

    $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

    if (is_numeric($x1) && is_numeric($x2)) {
        switch ($_GET['operation']) {
            case '+':
                $res = $x1 + $x2;
                break;
            case '-':
                $res = $x1 - $x2;
                break;
            case '*':
                $res = $x1 * $x2;
                break;
            case '/':
                if ($x1 == 0 || $x2 == 0) {
                    return "На ноль делить нельзя";
                }
                $res = $x1 / $x2;
                break;
            default:
                return 'Неверная операция';
        }
        return $expression . $res;
    }
    return 'Введите числа';
    • Добавил бы возврат на страницу с формой при ошибке, с выводом ошибки на эту страницу.
    • Вывод результата на страницу с формой
ivashkevich 02.09.2019 в 18:48

(empty($_GET['x1'] != ' ') оператор empty используется не так.

Dreft 02.09.2019 в 18:54

А сейчас?

ivashkevich 02.09.2019 в 18:55

Ок

happyviolence 03.09.2019 в 21:41

А как быть, если я хочу воспользоваться методом GET, а не POST. И пытаюсь сделать форму, в которую можно будет записать числа и получить результат на той же страничке? При таком написании все результаты равны нулю. Что я делаю не правильно?

$x1 = NULL;
$x2 = NULL;

if (isset($_GET['operation'])) { //если элемент массива operation существует
    if ((isset($_GET['x1']))&& isset($_GET['x2'])) {
        switch ($_GET['operation']) {
            case '+':
                $result = $x1 + $x2;
                break;
            case '-':
                $result = $x1 - $x2;
                break;
            case '*':
                $result = $x1 * $x2;
                break;
            case '/':
                if (0 == $x2) {
                    $result = 'На ноль делить нельзя!';
                } else {
                    $result = $x1 / $x2;
                }
                break;
        }
    } else {
        echo ('аргументы не заданы');
    }
    echo $_GET['x1'] . ' ' . $_GET['operation'] . ' ' . $_GET['x2'] . ' = ' . $result;
}
?>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Калькулятор</title>
</head>
<body>
    <form action="/index.php" method="get">
        <input type="number" name="x1" required>
        <select name="operation">
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/">/</option>
        </select>
        <input type="number" name="x2" required>
        <button type="submit">=</button>
    </form>
</body>
</html>
ivashkevich 04.09.2019 в 21:19

Дебажить пробовал?

XXX 07.09.2019 в 14:34
<?php
if (empty($_GET)) {
    return 'Ничего не переданно!';
}
if (empty($_GET['operation'])) {
    return 'Не переданна операция';
}
if (!isset($_GET['x1']) || !isset($_GET['x2'])) {     // Передача нуля
    return 'Не переданны аргументы';
}
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {   // Проверка на строку
    return 'Ведите число!';
}
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' ' . '=' . ' ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':                                                //Деление на ноль
        if($x2 !='0'){
            $result = $x1 / $x2;
            break;
        }
        return $result = 'На ноль делить нельзя!';
    default:
        return 'Операция не поддерживается';
}

return  $expression .$result;
ivashkevich 09.09.2019 в 20:36

$x2 !='0' - при нестрогом сравнении можно опустить кавычки. А вообще здесь лучше в самом начале привести операнды к типу float.

В остальном - супер.

Clawson 10.09.2019 в 19:12

Функция empty() возвращает true, когда переменная не существует и имеет пустое или нулевое значение. Поэтому в данном примере следует использовать проверку только на null (Например функция is_null()).

При делении на 0 вызывается Warning: Division by zero. Следует отлавливать передачу "0" второму аргументу, когда выбрана операция деления.

При передаче в качестве аргумента строки будет выводится Warning: A non-numeric value при выполнении арифметических выражений. Чтобы отловить передачу нечисловой строки можно воспользоваться функцией is_numeric().

<?php
if (empty($_GET)){
    return 'Ничего не передано';
}

if (empty($_GET['operation'])){
    return 'Не передана операция';
}

if (is_null($_GET['x1']) || is_null($_GET['x2'])){
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Используйте в качестве аргументов только числа';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 == 0){
            return 'На 0 делить нельзя';
        }
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}
return $x1 . $_GET['operation'] . $x2 . ' = ' . $result;

5.
Улучшить.. Хорошо бы проверку на корректность ввода добавить еще на стороне клиента, дабы не обращаться к серверу, если пользователь накосячил. При этом проверку на серве тоже следует оставить на тот случай, если проверка в клиентской части косячная.
Еще можно использовать функцию number_format($result, 2), чтобы задать точность и избежать проблем при выполнении операций с дробными числами. Чтобы 36-35.99 равнялось 0.01, а не 0.009999999999998 :D

ivashkevich 10.09.2019 в 20:55

Супер!

Ooleg 14.09.2019 в 11:43

С вводом ноля и чисел разобрался, деление и умножение добавил, а вот как ещё сломать не придумал(

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Не переданы аргументы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' ' . ' = ';

switch ($_GET['operation']) {
    case '+' :
        $result = $x1 + $x2;
        break;
    case '-' :
        $result = $x1 - $x2;
        break;
    case '*' :
        $result = $x1 * $x2;
        break;
    case  '/' :
        if ($x2==0){
            return 'Операция не поддерживается';
        }
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 14.09.2019 в 19:27

Если x1 или x2 не придут в запросе, то будет ошибка. Обязательно нужно это проверить.

Ooleg 14.09.2019 в 19:49

Сколько не пробовал выдаёт, что не переданы аргументы, а не ошибку. Как сделать чтобы они не пришли и увидеть ошибку?

ivashkevich 14.09.2019 в 19:50

isset

Ooleg 14.09.2019 в 20:57

Всё равно не понял, зачем использовать isset? Ведь у меня и так выдаётся сообщение, что не переданы аргументы, а не ошибка.

ivashkevich 14.09.2019 в 21:12

Они могут не придти, если их убрать на форме. Это может сделать любой посетитель сайта. Более того, он может сделать форму хоть прямо у себя на компе и отправлять запрос на ваш сервис. А сервис будет тонуть в ошибках.

Ooleg 15.09.2019 в 11:46

Добавил isset, но у меня и без него выводилось сообщение о непереданных аргументах, специально убирал одно поле в форме ввода для проверки.

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Ой, что-то пошло не так, только цифры пожалуйста)';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' ' . ' = ';

switch ($_GET['operation']) {
    case '+' :
        $result = $x1 + $x2;
        break;
    case '-' :
        $result = $x1 - $x2;
        break;
    case '*' :
        $result = $x1 * $x2;
        break;
    case  '/' :
        if ($x2==0){
            return 'Операция не поддерживается';
        }
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 16.09.2019 в 18:37

Значит у вас выключен показ ошибок.

Ooleg 16.09.2019 в 19:24

Спасибо за разъяснения, хочется понимать, а не просто за вами копировать.

[email protected] 18.09.2019 в 08:11

При отсутствии указания метода выбирается "Get" ?

ivashkevich 18.09.2019 в 17:52

Гуглить пробовал?)

[email protected] 18.09.2019 в 16:15

Добрый день,такое решение задачи неверно? (пункт про ввод только цифр)

<html>
<head>
    <title>Калькулятор</title>
</head>
<body>
<form action="/result.php">
    <input onkeypress="return keyPress('0123456789')" type="number" name="x1">
    <select name="operation">
        <option value="+">+</option>
        <option value="-">-</option>
        <option value="*">*</option>
        <option value="/">/</option>
    </select>
    <input onkeypress="return keyPress('0123456789')" type="number" name="x2">
    <input type="submit" value="Посчитать">
</form>
</body>
</html>
ivashkevich 18.09.2019 в 17:49

Обязательно нужно проверять данные на бэкенде (на PHP, в нашем случае). Форму пользователь может изменить прямо у себя в браузере.

dliashchenko 26.09.2019 в 21:51
<?php
if ($_GET['x2'] == 0 && $_GET['operation'] == "/"){
    return 'На ноль делить нельзя!';
}
if ($_GET['x1'] == '' || $_GET['x2'] == '' ){
    return 'Вы ввели пустой аргумент!';
}

$x1 = ($_GET['x1']);
$x2 = ($_GET['x2']);

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

if (!is_numeric($x1) || !is_numeric($x2)){
    return 'Один или несколько аргументов введены в неправильном формате. Аргумент должен быть числом!';
}

switch ($_GET['operation']){
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается!';
 }

return $expression . $result;
ivashkevich 27.09.2019 в 18:10

Куда делись проверки empty/isset?

H3licoptero 30.09.2019 в 17:24
if (empty($_GET['x1']) && empty($_GET['x2'])) {
    return 'Ничего не передано!';
}

if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Один из аргументов не передан.';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция.';
}

if ($_GET['x1'] === null || $_GET['x2'] === null) {
    return 'Аргументы не преданы.';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Только числа в качестве аргументов.';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;

Пришлось немного подсмотреть. Хочется, конечно, всё самостоятельно делать. И всё же очень крутые уроки, прям очень!!!) Спасибо большое!

ivashkevich 01.10.2019 в 09:13
if ($_GET['x1'] === null || $_GET['x2'] === null) {
    return 'Аргументы не преданы.'

В каком случае это возможно?

H3licoptero 01.10.2019 в 21:52

Да, какой-то шлак. Даже объяснить не могу, зачем сделал это. Сейчас проверил и понял, что не работает. Когда ввожу ноль в форму не видит этот аргумент, и не по причине этого условия. Я попытался использовать несколько вариантов с нулём(пробовал в условии null, пробовал в условии 0, пробовал функцию isset для проверки на отличие от null) и результат не меняется: всегда игнорит ноль. Если убрать второе условие, ноль всё равно не видит, а операцию деления на ноль выполняет. Магия прям. Пытался разобраться чем отличается ноль и null, понял только, что разница в том, что 0 - число, null - переменная без значения, и всё же вопрос почему в строке не определена переменная не разрешился. Короче, HELP!

ivashkevich 03.10.2019 в 00:07

null - это отсутствие какого-либо значения. 0 - это числовое значение.

isset(0) вернёт true. В то же время isset отлично подходит для проверки того, есть ли ключ в массиве - isset($array['some_key']). Для нашего случая подходит, в отличие от empty, который вернёт true, как для null, так и для 0, так и для пустой строки.

H3licoptero 01.10.2019 в 21:55
if (empty($_GET['operation'])) {
    return 'Не передана операция.';
}

if ($_GET['x1'] === '' && $_GET['x2'] === '') {
    return 'Ничего не передано.';
}

if ($_GET['x1'] === '' || $_GET['x2'] === '') {
    return 'Не передан один из аргументов.';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Только числа в качестве аргументов.';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;

Попробовал ещё один вариант, вроде работает нормально.

ivashkevich 03.10.2019 в 00:16

Если с формы убрать поля x1 и x2, то скрипт будет падать с ошибкой. Такого допускать нельзя. Нужно обязательно проверить на бекенде, что данные пришли.

H3licoptero 03.10.2019 в 12:54
if (empty($_GET['operation'])) {
    return 'Не передана операция.';
}

if ($_GET['x1'] === '' && $_GET['x2'] === '') {
    return 'Ничего не передано.';
}

if ($_GET['x1'] === '' || $_GET['x2'] === '') {
    return 'Один из аргументов не передан.';
}

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Один из аргументов не передан.';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Только числа в качестве аргументов.';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;

Дубль 3. Проверки на бекенде нужно делать железно и для этого мы и используем функции is_numeric и isset(в данном случае) и если что-нибудь поменяется во фронте, эти функции отработают, так? Я попробовал убрать в input-ах имена переменных и в случае без isset возвращает вариант с is_numeric. После добавления isset, возвращает вариант с ним, стало быть проверяет, что данные есть. Результат не считает(вероятно потому, что убрав имена из полей мы прописанную логику нарушили) но и ошибку не выдаёт: так и должно быть? Ещё я попробовал после возвращения имен в полях закомментировать isset и ноль как число работает. Вероятно из-за того, что я убрал проверки с empty, ноль теперь работает, даже если закомментировать всё, кроме ['operation']. Когда делал задание используя empty, бился долго и не знал, что и 0, и пустую строку, и null, empty возвращает со значением true. Читал доку и как-то невнимательно, видать. После Ваших замечаний понял, почитал доку ещё - закрепил. Простите, что так много текста, просто пытаюсь разобраться, чтоб дальше не тормозить. Такое решение нормальное?

ivashkevich 03.10.2019 в 17:31

И снова будет ошибка. Просто убери поля из формы и отправь запрос. Он должен корректно обработаться.

H3licoptero 03.10.2019 в 21:10

Ошибку не выдаёт. Может у меня что-то не подключено? Хотя по предыдущим урокам всё как по маслу шло, только я тупил) Видать, что-то не то делаю или не понимаю что сделать. Если я уберу поля из формы(HTML), то как введу данные?) или речь о полях с пустыми строками в условиях?

ivashkevich 04.10.2019 в 14:29

Речь о том, что данные и не надо вводить. Представь, что пользователь взял и изменил форму и удалил поля. Прямо в браузере это можно сделать. А потом взял и отправил кривой запрос, просто чтобы поломать скрипт. Поля вообще не придут в запросе и когда ты напишешь

$x1 = $_GET['x1'];

то тут возникнет ошибка, так как такого ключа в массиве попросту нет. Если ошибки не видишь, значит их вывод у тебя выключен и нужно их включить в php.ini.

H3licoptero 04.10.2019 в 22:06

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
display_errors = On
display_startup_errors = On
log_errors = On

Ведь так должно быть? Это я скопировал из своего php.ini. Погуглил, вроде похоже) Везде практически одинаковые советы. И ошибки при этом не выдает. Мне нужно использовать проверку на то, что GET вообще пуст?

if (empty($_GET)) {
   return 'Ничего не передано.';
}

Оспаде, я запутался.

ivashkevich 05.10.2019 в 00:04

Нотисы тоже нужно включить. Почитай пожалуйста сам про это всё. И не забудь перезапустить OpenServer после изменений в php.ini

Evilinside 17.10.2019 в 10:39

Здравствуйте, подскажите в чём причина такой проблемы?

В файле index.php такой код:

<html>
<head>
    <title>Калькулятор</title>
</head>
<body>
<form action="/result.php">
    <input type="text" name="x1">
    <select name="operation">
        <option value="+">+</option>
        <option value="-">-</option>
    </select>
    <input type="text" name="x2">
    <input type="submit" value="Посчитать">
</form>
</body>
</html>

И с ним выдаёт ошибку 404. Если сменить путь на просто <form action="result.php">, то всё работает, НО не почему-то в файле result.php работает только

$result = require __DIR__ . '/calc.php';

и если сменить на $result = require DIR . 'calc.php';, то выдаст ошибку:
Страница недоступнаСайт localhost пока не может обработать этот запрос.
HTTP ERROR 500

Все файлы находятся в 1ой директории, в одной папке

ivashkevich 17.10.2019 в 10:49

Путь из атрибута action формы используется браузером, это то, что в адресной строке. А то что через require - это путь на сервере. Это абсолютно разные вещи!

Ты index.php в браузере по какому адресу открываешь?

Evilinside 17.10.2019 в 10:59
ivashkevich 17.10.2019 в 11:34

А OpenServer не настраивал?

Evilinside 17.10.2019 в 11:39

К сожалению, нет. Занимаюсь на работе, на рабочем пк ( да, звучит странно) тут стоит iis express. На днях собираюсь брать ноут для себя, и вот тогда уже поставлю open server)

ivashkevich 17.10.2019 в 11:56

Ставьте. Это вообще не дело)

Evilinside 17.10.2019 в 16:29
if (empty($_GET)){

    return "Ничего не передано!";
}

if (isset($_GET['x1']) && is_numeric($_GET['x1'])) {

$x1 = $_GET['x1'];
}else
    return 'Число 1 не передано или не является числом!';

if (isset($_GET['x2']) && is_numeric($_GET['x2'])) {

 $x2 = $_GET['x2'];
}else{
    return 'Число 2 не передано или не является числом!';
}

if (empty($_GET['operation'])) {

    return 'Операция не передана!';
}

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 === 0 ){
            return 'На ноль делить нельзя!';
        }else
        $result = $x1 / $x2;
        break;

    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

Хотелось бы добавить, что условие

if (empty($_GET['operation'])) {

    return 'Операция не передана!';
}

Не может выполниться, тк у нас всегда по умолчанию стоит знак "+", поэтому изменил в форме 1ый атрибут option и поставил:

 <option value=""></option>
ivashkevich 17.10.2019 в 16:32
        if ($x2 === 0 ){
            return 'На ноль делить нельзя!';
        }else
        $result = $x1 / $x2;

Для блоков if-else всегда используйте фигурные скобки. В остальном все хорошо.

Evilinside 17.10.2019 в 16:42

Принял, спасибо) Ох и повозился я с тем, чтобы при пустой строке в инпутах при помощи isset не было результата типа "пустая строка + 1 = 1")

kvakazuabr 19.10.2019 в 10:57
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if(empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2']) ) {
    return 'Аргументы не являются числом';
}
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        if ($x1 == 0 || $x2 == 0 || ($x1 == 0 && $x2 == 0)) {
            $result = ' при умножении числа на 0 или 0 на число или 0 на 0 всегда будет 0, не делайте так';
        } else {
            $result = $x1 * $x2;
        }
        break;
    case '/':
        if ($x1 == 0 || $x2 == 0 || ($x1 == 0 && $x2 == 0)) {
            $result = 'при делении 0 на число или 0 всегда  будет 0, а делить число на 0 нельзя, не делайте так';
        } else {
            $result = $x1 / $x2;
        }
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 19.10.2019 в 11:16

Если не передать x1 или x2 (полностью убрав поля с формы), то будут ошибки.

kvakazuabr 19.10.2019 в 14:59

исправил

ivashkevich 19.10.2019 в 15:24

Теперь если передать 0, то будет писать что аргументы не переданы. Прочитай в документации про isset.

kvakazuabr 19.10.2019 в 19:43

если оставить проверку is_numeric все корректно отрабатывает и если даже нет инпутов ошибки нет

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

// if(isset($_GET['x1']) || isset($_GET['x2'])) {
//     return 'Не переданы аргументы';
// }

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2']) ) {
    return 'Аргументы не переданы или являются не числом';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        if ($x1 == 0 || $x2 == 0 || ($x1 == 0 && $x2 == 0)) {
            $result = ' при умножении числа на 0 или 0 на число или 0 на 0 всегда будет 0, не делайте так';
        } else {
            $result = $x1 * $x2;
        }
        break;
    case '/':
        if ($x1 == 0 || $x2 == 0 || ($x1 == 0 && $x2 == 0)) {
            $result = 'при делении 0 на число или 0 всегда  будет 0, а делить число на 0 нельзя, не делайте так';
        } else {
            $result = $x1 / $x2;
        }
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 20.10.2019 в 21:07

Ты инпуты вообще удалил с формы, и нет ошибок? Значит они выключены и их надо включить в php.ini. Потому что происходит обращение к элементу массива по несуществующему ключу. А это ошибка уровня Notice.

sar16520 19.10.2019 в 11:50
<?php

if(empty($_GET)){
    return('Ничего не переданно');
}
if(empty($_GET['operation'])){
    return('Операция не передана');
}
$x1= $_GET['x1'];
$x2= $_GET['x2'];
$operation= $_GET['operation'];

if(!is_numeric($x1) || !is_numeric($x2)){
    return('Введите число');
}

$expression= $x1. ' '. $operation. ' '. $x2. ' = '. $result;

switch($_GET['operation']){
    case '+':
            $result= $x1 + $x2;
            break;
    case '-':
            $result= $x1 - $x2;
            break;
    case '*':
            $result= $x1 * $x2;
            break;
    case '/':
            if($x2 == 0){
                return 'На ноль делить незя';
            }elseif($x1 == 0){
                return 0;
            }else{
                $result= $x1 / $x2;
            }
            break;
    default:
        'операция не поддерживается!';
}
return $expression.  $result; ;
ivashkevich 19.10.2019 в 12:02

Нужно проверить что x1 и x2 пришли в запросе.

sar16520 19.10.2019 в 13:54

Вот так?

<?php

if(empty($_GET)){
    return('Ничего не переданно');
}
if(empty($_GET['operation'])){
    return('Операция не передана');
}
if (empty($_GET['x1']) && empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}
$x1= $_GET['x1'];
$x2= $_GET['x2'];
$operation= $_GET['operation'];
if(!is_numeric($x1) || !is_numeric($x2)){
    return('Введите число');
}

$expression= $x1. ' '. $operation. ' '. $x2. ' = ';

switch($_GET['operation']){
    case '+':
            $result= $x1 + $x2;
            break;
    case '-':
            $result= $x1 - $x2;
            break;
    case '*':
            $result= $x1 * $x2;
            break;
    case '/':
            if($x2 == 0){
                return 'На ноль делить незя';
            }elseif($x1 == 0){
                return 0;
            }else{
                $result= $x1 / $x2;
            }
            break;
    default:
        'операция не поддерживается!';
}
return $expression.  $result;
ivashkevich 19.10.2019 в 15:23

Теперь если передать 0, то будет писать что аргументы не переданы. Прочитай в документации про isset.

[email protected] 24.10.2019 в 22:39
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (($_GET['x1']==="") || ($_GET['x2'])==="") {
    return 'Не переданы аргументы';
}

$x1 = $_GET['x1'];
$x2 =$_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2==0)  {
            return 'На ноль делить нельзя!';
        }
        else {
            $result = $x1/$x2;
        }
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

4е задание:
поменять в index.php type на number.
ivashkevich 25.10.2019 в 05:38
(($_GET['x1']==="")

Нужно сначала проверить что x1 и x2 пришли в запросе. Если их убрать с формы и отправить запрос, это должно корректно обработаться. А сейчас возникнет ошибка. Смотрите в сторону empty/isset.

И ещё нет проверки на то, что это числа.

babur 13.11.2019 в 15:10

Добрый вечер! и снова я с вами проверьте дз пож?

<?php
if (empty($_GET)){
    return 'Ничкго не передано';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty($_GET['x1']) === 'null' || empty($_GET['x2']) === 'null'){
    return 'Не переданы аргументы';
}
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

//проверка на число: int or string
//если условии истины то дальше идет на switch, если нет то возвращает return    
if (!is_numeric($x1) || !is_numeric($x2)){
    return 'x1 и x2 должны быть числами';
}

switch ($_GET['operation']){
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 != 0) {
            $result = $x1 / $x2;
        } else {
            return 'На ноль нельзя делить!';
        }
        break;
    default:
        return 'Операция не поддерживается';
}
$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

return $expression . $result;
ivashkevich 13.11.2019 в 17:15
if (empty($_GET['x1']) === 'null' || empty($_GET['x2']) === 'null'){

Полная ерунда, изучите как работает empty и isset. Почитайте официальную документацию.

andreskrip 15.11.2019 в 18:30
<?php
//проверка на пустой запрос
if (empty($_GET)) {
    return 'Ничего не передано!';
}
//проверка на существование индексов х1, х2 и operation в запросе
if (isset($_GET['x1']) && isset($_GET['x2']) && isset($_GET['operation'])) {
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
} else {
    return 'Запрос некорректно сформирован. Обновите страницу и повторите.';
}
//проверка на пустой оператор
if (empty($_GET['operation'])) {
    return 'Не передана операция';
}
//проверка на пустые аргументы (и передача 0 в калькулятор)
if (is_null($_GET['x1']) || is_null($_GET['x2'])) {
    return 'Не переданы аргументы';
}
//проверка на строковые выражения
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Поддерживаются только числа';
}

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 != 0) {
            $result = $x1 / $x2;
            break;
        }
        return 'Деление на ноль!';
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 15.11.2019 в 19:24

Прочитайте документацию по isset и empty. Много логики ненужной.

[email protected] 30.11.2019 в 02:29
<?php

if (empty($_GET)) {
    return 'Ничего не переданно';
}

if (empty($_GET['operation'])) {
    return 'Операция не переданна';
}

if (isset($_GET['x1']) && isset($_GET['x2'])) { //Задание 5. Сам не додумался, подсмотрел у других
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
} else {
    return 'Ошибка в неполной передаче данных, должны быть переданы 2 числа';
}

if ($_GET['x1'] == '' || $_GET['x2'] == '') { //Задание 1.
    return 'Аргументы 1 или 2 не переданы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) { //Задание 4.
    return 'Введите корректные числа';
}

$operation = $_GET['operation'];

$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' = ';

switch ($operation) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '/': //Задание 3.
        if ($x2 == '0') {
            return 'На ноль делить нельзя';
        } else {
            $result = $x1 / $x2;
        }
        break;
    case '*': //Задание 2.
        $result = $x1 * $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

Сперва полез в index.php сменить тип с text на number, но понял что это не то. Т.к. дробные числа не получиться написать.
Кстати, а есть ли необходимость в первых двух условиях, если и так все условия обработаны?

ivashkevich 01.12.2019 в 10:41
if (isset($_GET['x1']) && isset($_GET['x2'])) { //Задание 5. Сам не додумался, подсмотрел у других
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
} else {

Вы вот здесь уже задали переменные x1 и x2. Зачем используете дальше по коду значения из $_GET? А потом опять присваиваете значения.

О каких условиях вы спрашивали?

[email protected] 01.12.2019 в 19:52
if (empty($_GET)) {
    return 'Ничего не переданно';
}

if (empty($_GET['operation'])) {
    return 'Операция не переданна';
}

Об этих. Поправил код.

ivashkevich 01.12.2019 в 21:17

Ну, первое конечно можно убрать, но тогда сообщение не будет полностью описывать проблему.

Ну а без проверки операции на пустоту программа и вовсе выдаст ошибку на строке

operation = $_GET['operation'];

если не будет передана операция.

Так что, обе строки нужны.

[email protected] 15.12.2019 в 18:12
<?php
/**
 * Created by PhpStorm.
 * User: LUCKYPAS
 * Date: 15.12.2019
 * Time: 16:15
 */
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}
function MyString($text)
{
    $temp = trim($text); // обрубаем текст
    $temp = stripslashes($temp); // убираем слешы
    $temp = htmlspecialchars($temp, ENT_QUOTES);// преобразование в штмл сущности
    return $temp;
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$x1 = MyString($x1);
$x1 = MyString($x2);

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
if (is_numeric($x1) && is_numeric($x2)) {// проверка на числа
    switch ($_GET['operation']) {
        case '+':
            $result = $x1 + $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '/':
            if($x2 != 0){
                $result = $x1 / $x2;
            } else {
                return 'На ноль нельзя делить';
            }
            break;
        case '*':
            if($x1 != 0 || $x1 != 0){
                $result = $x1 * $x2;
            } else {
                return 'На ноль нельзя умножать';
            }
            break;
        case '%':
            $result = $x1 % $x2;
            break;

        default:
            return 'Операция не поддерживается';
    }
} else {
    echo "Введите цифры";
}
return $expression . $result;
ivashkevich 17.12.2019 в 08:20
if (empty($_GET['x1']) || empty($_GET['x2']))

Не даст передать нули в качестве аргументов!

function MyString($text)

Имена функций пишутся с маленькой буквы! Для чего эта функция? Тут мы должны принимать на вход число. Для чего там кодирование html тегов?!

Переделайте.

Salexandr 19.12.2019 в 00:41
if (is_numeric($x1) && is_numeric($x2)) {
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? $x1 / $x2 : 'Только не на ноль!!!';
        break;
    default:
        return 'Такой операции еще нет';
}
    $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
    return $expression . $result;}
    else {
        return 'Вводите числа, это же калькулятор';
    }
ivashkevich 19.12.2019 в 07:30

Где проверки на то, что значения были переданы? Если с формы убрать инпуты и отправить запрос, то будут ошибки.

Salexandr 19.12.2019 в 21:40
if (empty($_GET)) {
    return 'Передали пустую форму';
}
if (empty($_GET['operation'])) {
    return 'Выберите арифметическую операцию';
}
if (($_GET['x1'] === '') || ($_GET['x2'] === '')){
    return 'Забыли аргументы';
}
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
if (is_numeric($x1) && is_numeric($x2)) {
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? $x1 / $x2 : 'Только не на ноль!!!';
        break;
    default:
        return 'Такой операции еще нет';
}
    $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
    return $expression . $result;}
    else {
        return 'Вводите числа, это же калькулятор';
    }
ivashkevich 21.12.2019 в 20:22

Если убрать с формы x1 и отправить запрос, то снова будет ошибка. Проверки на наличие ключа в массиве снова нет.

[email protected] 25.12.2019 в 18:56

Правильно ли я понимаю, что при ф-и риквае, файл1 который вшиваю в файл2, имеет доступ к переменным файл2?
То есть в файле2 пишем риквае файл1

ivashkevich 26.12.2019 в 19:07

А код слабо написать?) Риквае какие-то)
Ответ на вопрос - да.

[email protected] 02.01.2020 в 09:20
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (!is_numeric($_GET['x1'])) {
    return 'Значение x1 не является числом';
}

if (!is_numeric($_GET['x2'])) {
    return 'Значение x2 не является числом';
}

if (($_GET['x2'] == 0)  &&  ($_GET['operation'] == ':')) {
    return 'Не допустимое деление на ноль';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case ':':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 03.01.2020 в 03:56

Где проверка на то что x1 и x2 вообще переданы?

[email protected] 04.01.2020 в 07:19
<?php
if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (!is_numeric($_GET['x1'])) {
    return 'Значение x1 не является числом';
}

if (!is_numeric($_GET['x2'])) {
    return 'Значение x2 не является числом';
}

if (($_GET['x2'] == 0)  &&  ($_GET['operation'] == ':')) {
    return 'Не допустимое деление на ноль';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case ':':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 06.01.2020 в 16:12

Если передать в х1 или х2 ноль, то будет писать, что не переданы аргументы.

YuraG 12.01.2020 в 12:21

Вот что получилось!

<?php

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Операция не передана!';
}

if ((empty($_GET['op1']) && !is_numeric($_GET['op1'])) || empty($_GET['op2']) && !is_numeric($_GET['op2'])) {
    return 'Не передан аргумент!';
}

if (!is_numeric($_GET['op1']) || !is_numeric($_GET['op2'])) {
    return 'Передано не число!';
}

$x1 = intval($_GET['op1']);
$x2 = $_GET['op2'];
$operator = $_GET['operation'];

switch ($operator) {
    case '+':
        $result = "$x1 + $x2 = " . ($x1 + $x2);
        break;
    case '-':
        $result = "$x1 - $x2 = " . ($x1 - $x2);
        break;
    case '*':
        $result = "$x1 * $x2 = " . ($x1 * $x2);
        break;
    case '/':
        if ($x2 === '0') {
            $result = 'Делить на 0 нельзя!';
        } else {
            $result = "$x1 / $x2 = " . ($x1 / $x2);
        }
        break;
    default:
        return 'Нет такой операции';
}

return $result;

ПО 5 заданию затрудняюсь ответить.

ivashkevich 12.01.2020 в 15:45
(empty($_GET['op1']) && !is_numeric($_GET['op1']))

Вместо этого используйте isset, с дальнейшей проверкой is_numeric. А то так дважды приходится is_numeric вызывать.

$x1 = intval($_GET['op1']);
$x2 = $_GET['op2'];

Почему одно приводите, а другое нет? И почему к целому числу, а не к float? И почему не через (int)$value, как было в предыдущих уроках?

YuraG 12.01.2020 в 19:28
<?php

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Операция не передана!';
}

if (!isset($_GET['op1']) || !isset($_GET['op2'])) {
    return 'Не передан аргумент!';
}

if (!is_numeric($_GET['op1']) || !is_numeric($_GET['op2'])) {
    return 'Передано не число!';
}

$x1 = (float)$_GET['op1'];
$x2 = (float)$_GET['op2'];

$operator = $_GET['operation'];

switch ($operator) {
    case '+':
        $result = "$x1 + $x2 = " . ($x1 + $x2);
        break;
    case '-':
        $result = "$x1 - $x2 = " . ($x1 - $x2);
        break;
    case '*':
        $result = "$x1 * $x2 = " . ($x1 * $x2);
        break;
    case '/':
        if ($x2 == 0) {
            $result = 'Делить на 0 нельзя!';
        } else {
            $result = "$x1 / $x2 = " . ($x1 / $x2);
        }
        break;
    default:
        return 'Нет такой операции';
}

return $result;

в чем разница isset и empty
empty на мой взгляд более универсальна из - за проверок на null 0 '' и тп.?

ivashkevich 13.01.2020 в 08:34

Отлично.
В вашем вопросе уже есть ответ. Нам не нужна проверка на 0.

eNergy 14.01.2020 в 13:55
<?php
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
    $operation = $_GET['operation'];

if (empty($_GET)) {
    return 'Введите данные';
} 
if (!isset($x1) || !isset($x2)) {
    return 'Введите числа';
}
if ($x1 == 0 || $x2 == 0 && $operation == '/') {
    return 'На ноль делить нельзя';
}

$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' = ';

switch ($operation) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result =  $x1 - $x2;
        break;  
    case '*':
        $result =  $x1 * $x2;
        break;  
    case '/':
        $result =  $x1 / $x2;
        break;          
}

return $expression . $result;

1) Функция empty получила значение '0', а данное значение для нее является пустым, поэтому выдало сообщение 'Введите числа'. Поменял функцию empty на isset
2) Сделал. Добавил в два input'a в index.php и два case в calc.php
3) Вышла ошибка warning о делении на ноль. Добавил дополнительное условие
4) Вышла ошибка warning обнаружено нечисловое значение. Изменил тип для input'a, с text на number и добавил атрибут step="any", чтобы считать числа float
5) a) В option у нас нет пустого значения, поэтому условие operation можно убрать
b) В файле calc.php можно вначале добавить переменные для x1, x2 и operation, чтобы код легче читался
c) Из switch убрать default, т.к. операция будет выбрана в любом случае
d) Можно добавить еще операторы для вычислений

ivashkevich 15.01.2020 в 06:19
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
    $operation = $_GET['operation'];

if (empty($_GET)) {
    return 'Введите данные';
} 
if (!isset($x1) || !isset($x2)) {
    return 'Введите числа';
}

Сначала обратились к элементам массива, затем проверили их существование. Это грубая ошибка, которая приведет к ошибкам кода. Если убрать с формы x1 и x2 и отправить запрос, то всё рухнет в ошибках.

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

Изменил тип для input'a, с text на number и добавил атрибут step="any", чтобы считать числа float

Этого недостаточно. Любой злодей может изменить форму как ему угодно, прямо у себя в браузере. Нужно всегда валидировать значения на бекенде.

В option у нас нет пустого значения, поэтому условие operation можно убрать

И снова можно изменить форму через инструменты разработчика/создать новую у себя локально и отправлять запросы, ломающие скрипт. Ни к чему хорошему это не приведет.

Из switch убрать default, т.к. операция будет выбрана в любом случае

И снова нет, по той же причине.

IgorG 21.01.2020 в 16:02
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty($_GET['x1']) && empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Одно или более из переданных данных не является числом';
}
$x1 = ($_GET['x1']);
$x2 = ($_GET['x2']);

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if($x2 != 0){
            $result = $x1 / $x2;
        } else {
            return 'На ноль нельзя делить';
        }
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

Не пойму, почему операция "число" поделить на "не целое число" (например 1 / 0.2) приводит к "Операция не поддерживается"?

ivashkevich 24.01.2020 в 07:57
if (empty($_GET['x1']) && empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}

А если не передан только один аргумент? Это разве ок?
А если передать два нуля, разве ничто не передано?

IgorG 24.01.2020 в 08:01

if (empty($_GET['x1']) || empty($_GET['x2'])) {
return 'Не переданы аргументы';

Так ?

А если два нуля страха, вроде как, нет. На 0 деление защищено. А остальные операции выдадут 0. Или я не прав ?

ivashkevich 24.01.2020 в 08:18

Уже лучше, только теперь другая ошибка на этой же строке. Если мы передадим в качестве аргументов нули, то программа на этом месте остановится и скажет "Не переданы аргументы". Хотя это абсолютно нормальные аргументы, являющиеся числами. Калькулятор позволяет складывать нули.

IgorG 24.01.2020 в 08:23

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
return 'Не переданы аргументы';
Как вариант =) ?

ivashkevich 24.01.2020 в 08:33

Да, теперь отлично

ChelovekAndrey 25.01.2020 в 16:29
<?php
    if(empty($_GET)){
        return 'Нам нечего считать';
    }
    if(empty($_GET['operation'])){
        return 'Не передана операция';
    }
    if(empty((float)$_GET['x1'])|| empty((float)$_GET['x2'])){
        if($_GET['x1']==='0' || $_GET['x2']==='0'){
            if ($_GET['x1']==='0'){
                $_GET['x1']=0;
            };
            if ($_GET['x2']==='0'){
                $_GET['x2']=0;
            }
        } else {
            return 'Не переданы аргументы';
        }
    }
    $x1=$_GET['x1'];
    $x2=$_GET['x2'];

    $expresion= $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

    switch ($_GET['operation']){
        case '+':
            $result = $x1 + $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '*':
            $result = $x1 * $x2;
            break;
        case '/':
            if($x2===0){
                return 'Деление на ноль невозможно';
            } else {
                $result = $x1 / $x2;
            }
            break;
        default:
            return 'Операция не поддерживается';
    }
    return $expresion . $result;
?>
ChelovekAndrey 28.01.2020 в 12:27

Не сильно перекрутил с if'ами?

ivashkevich 28.01.2020 в 18:42
    if(empty((float)$_GET['x1'])|| empty((float)$_GET['x2'])){

Для чего здесь приведение к float?

Вообще всё можно сделать гораздо проще. Изучите конструкции isset и is_numeric. Жду вашего отдельного комментария с упрощенным вариантом.

ChelovekAndrey 30.01.2020 в 00:48

Так лучше?

    if(empty($_GET)){
        return 'Нам нечего считать';
    }
    if(empty($_GET['operation'])){
        return 'Не передана операция';
    }
    if(!isset($_GET['x1']) || !isset($_GET['x2'])){
        return 'Не переданы аргументы';
    }
    if (is_numeric($_GET['x1']) && is_numeric($_GET['x2'])){
        $x1=$_GET['x1'];
        $x2=$_GET['x2'];
    } else {
        return 'Переданы не числовые аргументы';
    }

$expresion= $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

    switch ($_GET['operation']){
        case '+':
            $result = $x1 + $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '*':
            $result = $x1 * $x2;
            break;
        case '/':
            if($x2!=0){
                $result = $x1 / $x2;
            } else {
                return 'Это невозможно!!!';
            }
            break;
        default:
            return 'Операция не поддерживается';
    }
    return $expresion . $result;
ivashkevich 31.01.2020 в 13:15

Всё отлично, кроме

return 'Это невозможно!!!';

Нужно писать так, чтобы пользователю было понятно, что не так.

ChelovekAndrey 03.02.2020 в 21:21

Понял. Изменил на 'Делить на ноль нельзя'.
Ещё вопрос по поводу isset, он смотрит конкретно на то что бы в х1 и х2 было наполнение или в целом на существование такой детали массива?

ivashkevich 04.02.2020 в 13:18

Что мешает прочесть документацию? =)

ChelovekAndrey 04.02.2020 в 23:22

А я прочел, даже много раз, до меня просто долго доходило))
У меня такое бывает, но сейчас уже разобрался что к чему, спасибо.
Как я понял isset проверяет существование переменной, либо ключа в массиве, но не обращает внимание на присутствие "содержимого" и в случаях с:
$hello = 'привет';
или
$hi='';
В обоих случаях isset вернет true
Верно?

ivashkevich 06.02.2020 в 02:58

'' - это пустая строка. Отсутствие значения - это null. И вот на нём isset уже вернёт false. Не нужно использовать термин "содержимое". Используйте термин "значение".

X-Nick 06.02.2020 в 23:10
<?php
if (isset($_GET['x1'], $_GET['x2'], $_GET['operation'])) {
    if (($_GET['x1'] == '') || ($_GET['x2'] == '')) {
        return 'Не переданы аргументы';
    }
    elseif (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
        return 'допустимы только целые числа';
    }
    if (empty($_GET)) {
        return 'Ничего не передано!';
    }
    if (empty($_GET['operation'])) {
        return 'Не передана операция';
    }
}
$x1 = (int) $_GET['x1'];
$x2 = (int) $_GET['x2'];
$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if($x2 != 0) {
            $result = $x1 / $x2;
        }
        else {
            return 'На ноль делить нельзя';
        }
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;
ivashkevich 12.02.2020 в 12:15
<?php
if (isset($_GET['x1'], $_GET['x2'], $_GET['operation'])) {

А если не переданы значения? Типа ок? На следующей же строке после закрывающей скобки блока этого условия произойдет ошибка.

$x1 = (int) $_GET['x1'];

Так как происходит обращение к несуществующему ключу.

X-Nick 12.02.2020 в 15:56
<?php
if (isset($_GET['x1'], $_GET['x2'])) {
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
    if(($x1 == '') || ($x2 == '')) {
        return 'Не передан один или оба аргумента';
    }
    elseif(!is_numeric($x1) || !is_numeric($x2)) {
        return 'допустимы только целые числа';
    }
}
else
    return 'Операнд/ы не передан/ы!';
if (empty($_GET)) {
    return 'Ничего не передано!';
}
if (empty($_GET['operation'])) {
    return 'Не передана операция';
}
$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if($x2 != 0) {
            $result = $x1 / $x2;
        }
        else {
            return 'На ноль делить нельзя';
        }
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;
ivashkevich 12.02.2020 в 20:18
else
    return 'Операнд/ы не передан/ы!';

Ну ёлки-палки! Ну где вы увидели, чтобы писали конструкции if-else без фигурных скобок? Пишите их всегда, придерживайтесь того же стиля, что и в моих уроках. Рано вам было это говорить, но раз уж копируете код не пойми откуда, то ознакомьтесь со стандартами PSR. И всегда следуйте им при оформлении. Я в своих уроках их всегда придерживаюсь, откуда вы умудряетесь хватать такие ужасные примеры?

ivashkevich 12.02.2020 в 20:19

В остальном по логике теперь всё ок

X-Nick 13.02.2020 в 18:39

раз уж копируете код не пойми откуда

Я в очередной раз не понимаю о чем речь. С чего Вы взяли, что я откуда-то что-то копировал. а не сам писал??

текст цитаты

ОК

откуда вы умудряетесь хватать такие ужасные примеры?

Уточните, в чем ужас, чтобы я понимал себе на будущее. Вы про отсутствие фигурных скобок и о том, что не учтен вариант отсутствия переменных?

ivashkevich 14.02.2020 в 07:28

Да) Возможно, вы до этого изучали другие языки, или смотрели устаревшие материалы по PHP. Но пожалуйста, старайтесь придерживаться такого же стиля, что я даю в своих уроках. Он на данный момент актуален.

Aleks 08.02.2020 в 13:30
<?php

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Операция не передана';
}

if (isset($_GET['x1']) && (isset($_GET['x2']))) {
} else {
    return 'Аргументы не переданы';
}

if (is_numeric($_GET['x1']) && (is_numeric($_GET['x2']))) {
} else {
    return 'Можно передавать только числа';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$expression =  $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;
ivashkevich 12.02.2020 в 12:23

Супер!

bratko 12.02.2020 в 10:47

Подскажи пожалуйста, как сделать, чтоб результат отображался на этой же странице, где сама форма в index.php?
Т.е. ставим перед кнопкой Посчитать знак "=" и выводим результат тут же, при клике на кнопку Посчитать.

Я попробовал просто в index.php сделать подключение:

<?php
$result = require __DIR__ . '/1/calc.php';
?>

и в нужном месте вывести:

<?= $result ?>

Но потом меня сбило с толку, что делать с form action="" что тут писать тогда?!
Правильно ли вообще я думаю? В данном случае после подключения файла выводится ошибка:
https://cloud.mail.ru/public/EL5G/U99mFpcYx
и в результат сразу выводит информацию, даже не кликнув по кнопке Посчитать

ivashkevich 12.02.2020 в 13:13

В form action пишется адрес, на который нужно отправить запрос. В вашем случае это index.php

bratko 12.02.2020 в 13:23

Хорошо, а по поводу остального?

ivashkevich 12.02.2020 в 13:41

А что вам ещё непонятно?) Рассказывайте

bratko 12.02.2020 в 13:43

В данном случае после подключения файла выводится ошибка:
https://cloud.mail.ru/public/EL5G/U99mFpcYx
и в результат сразу выводит информацию, даже не кликнув по кнопке Посчитать. Как это исправить?

ivashkevich 12.02.2020 в 13:45

Нужно проверять что необходимые данные пришли в запросе, и только потом подключать файл, как вариант. В ошибке же всё написано. Нужно обрабатывать запрос.

bratko 12.02.2020 в 14:48

Проверку сделал:

<?php
if (!empty($_GET)) {
    $result = require __DIR__ . '/1/calc.php';
}
?>

Теперь ругается на:

<?= $result ?>

в файле index.php
Вот скриншот: https://prnt.sc/r17mua
Не пойму, что теперь делать?

ivashkevich 12.02.2020 в 20:11

Эта переменная объявляется только если пришел запрос с query-параметрами, а ты ее используешь всегда, даже когда запрос без параметров. О чем в ошибке и написано.

bratko 13.02.2020 в 17:55

как решить проблему?

ivashkevich 14.02.2020 в 07:26

Либо объявлять переменную всегда, либо не использовать её, если она не объявлена.

Fornit 18.02.2020 в 00:26

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

if (!isset($x1)) {
    if (!isset($x2)) {
            return 'Аргументы не переданы';
    } else {
            return 'Не передан первый аргумент';
    }
}

if (!isset($x2)) {
        return 'Не передан второй аргумент';
}

if (!is_numeric($x1)) {
    if (!is_numeric($x2)) {
        return 'Аргументы не являются числами';
    } else {
        return 'Первый аргумент не является числом';
    }
}

if (!is_numeric($x2)) {
    return 'Второй аргумент не является числом';
}
$x1 += 0;
$x2 += 0;

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']){
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 == 0) {
            return 'Попытка деления на 0';
        }
        $result = $x1 / $x2;
        break;
    case '^':
        $result = pow($x1, $x2);
        break;
}
return $expression . $result;
?>
ivashkevich 18.02.2020 в 18:23
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

Если аргументы не передать, то уже здесь возникнет ошибка. Попробуйте убрать инпуты для них с формы и отправить запрос.

[email protected] 21.03.2020 в 14:51

добрый день, сам сделал только 1 и 2, третье подсмотрел, всё как у всех, так что флудить не буду. Ломал голову пару вечеров по поводу третьего, но прежде чем писать код на 10 стр. решил подглядеть, оказалось, что всего то одна строка как тут case '/' :
$result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
break;

ivashkevich 21.03.2020 в 18:05

Ок

[email protected] 27.03.2020 в 16:32
  switch ($_GET['operation']) {
    case '+' :
        $result = $x1 + $x2;
        break;
    case '-' :
        $result = $x1 - $x2;
        break;
    case '*' :
        $result = $x1 * $x2;
        break;
    case '/' :
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}
[email protected] 27.03.2020 в 16:32

Над другими заданиями пока размышляю)

ivashkevich 27.03.2020 в 19:04

Ну обработку деления на 0 уж надо бы добавить, не?)

[email protected] 28.03.2020 в 12:12
<?php
if (($_GET['x1'] === '') || ($_GET['x2'] === '')) {
    return 'Аргументы не переданы';
}
[email protected] 28.03.2020 в 12:13
<?php
 case '/' :
        $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;
?>
ivashkevich 28.03.2020 в 12:43

Перестаньте уже писать закрывающий тег.

Почему в итоге выводите как $result если поделили на 0? Это ведь ошибка, значит нужно сразу сделать return, а у вас программа продолжает выполняться как ни в чем не бывало. И повторюсь еще раз - не нужно в одну и ту же переменную складывать разные типы данных. $result - для числа, а вы туда текст ошибки пихаете.

ivashkevich 28.03.2020 в 12:41

Ну нее, так не годится. Сначала нужно проверить, что такие ключи в массиве вообще существуют, иначе можно нарваться на ошибки.

studentDev 04.04.2020 в 14:49
<?php
    //Request's
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];

    //Block errors
    if(!is_numeric($x1) && !is_numeric($x2)) {
        return "Неверный синтаксис! - Калькулятор сломался! :,(";
    } elseif(!is_numeric($x1) || !is_numeric($x2)) {
        return "Неверный синтаксис! - Калькулятор сломался! :,(";
    }

    if(empty($_GET['operation'])) {
        return "operation не был передан! - Калькулятор сломался! :,(";
    }

    if(!empty($_GET['x1'] === '') || !empty($_GET['x2'] === '')) {
        return "x1 или x2 не были переданны! - Калькулятор сломался! :,(";
    }

    if($_GET['x2'] == 0 / true && $_GET['operation'] == ":") {
        return "На ноль делить нельзя! - Калькулятор сломался! :,(";
    }
    //Block errors

    $calculator = $_GET['x1'] . " " . $_GET['operation'] . " " . $_GET['x2'] . " = ";
    switch($_GET['operation']) {
        case "+":
            $result = $x1 + $x2;
            break;
        case "-":
            $result = $x1 - $x2;
            break;
        case "*":
            $result = $x1 * $x2;
            break;
        case ":":
            $result = $x1 / $x2;
            break;
        case "%":
            $result = $x1 % $x2;
            break;
    }
    return $calculator . $result;
    ?>
ivashkevich 05.04.2020 в 19:13
$x1 = $_GET['x1'];

Сначала нужно убедиться, что эти ключи вообще в массиве есть. Иначе тут будет ошибка, если в запросе эти поля не придут.

    if(!is_numeric($x1) && !is_numeric($x2)) {
        return "Неверный синтаксис! - Калькулятор сломался! :,(";
    } elseif(!is_numeric($x1) || !is_numeric($x2)) {
        return "Неверный синтаксис! - Калькулятор сломался! :,(";
    }

Достаточно будет только второй проверки, она покрывает оба кейса. Контекста нет - нужно явно писать, что пошло не так.

    if(!empty($_GET['x1'] === '') || !empty($_GET['x2'] === '')) {
        return "x1 или x2 не были переданны! - Калькулятор сломался! :,(";
    }

Это невозможно, если до сюда дошли, то оба аргумента numeric, а значит уже не могут быть пустыми строками.

    if($_GET['x2'] == 0 / true && $_GET['operation'] == ":") {
        return "На ноль делить нельзя! - Калькулятор сломался! :,(";
    }

0 / true - ерунда полная

    ?>

Закрывающий тег не нужен! Сколько раз повторять)

studentDev 06.04.2020 в 12:02
<?php

//Request's
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];

    //Block check's

    if(array_key_exists('x1', $_GET) && array_key_exists('x2', $_GET)) {
        echo "<script>console.log('OK - KEY')</script>";
    } else {
        echo "<script>console.log('WRONG - KEY')</script>";
    }

    if(!is_numeric($x1) || !is_numeric($x2)) {
        return "Был замечен пустой или строчный аргумент!";
    }

    if(empty($_GET['operation'])) {
        return "operation не был передан!";
    }

    if($_GET['x2'] == 0 && $_GET['operation'] == ":") {
        return "На ноль делить нельзя! - Калькулятор сломался! :,(";
    }

    var_dump($_GET);
    echo "</br>";
    //Block check's

    $calculator = $_GET['x1'] . " " . $_GET['operation'] . " " . $_GET['x2'] . " = ";
    switch($_GET['operation']) {
        case "+":
            $result = $x1 + $x2;
            break;
        case "-":
            $result = $x1 - $x2;
            break;
        case "*":
            $result = $x1 * $x2;
            break;
        case ":":
            $result = $x1 / $x2;
            break;
        case "%":
            $result = $x1 % $x2;
            break;
    }
    return $calculator . $result;
ivashkevich 06.04.2020 в 15:50

Повторюсь:
Сначала нужно убедиться, что эти ключи вообще в массиве есть. Иначе тут будет ошибка, если в запросе эти поля не придут.

studentDev 07.04.2020 в 12:00

Всё, исправил код...

ivashkevich 08.04.2020 в 07:46
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];

Ошибка здесь, в самой первой строке. Ничего не исправили.

studentDev 08.04.2020 в 08:12
$x1 = $_GET['x1'] ?? null;
$x2 = $_GET['x2'] ?? null;

Вот так?

ivashkevich 08.04.2020 в 08:32

Например да. Но конкретно по вашему коду достаточно выше этих строк вынести проверку с использованием array_key_exists. Жаль, что самостоятельно не получилось у вас к этому придти. Поправьте и пришлите исправленный вариант.

studentDev 08.04.2020 в 12:53
<?php
    //Request's
    $x1 = $_GET['x1'] ?? null;
    $x2 = $_GET['x2'] ?? null;

    //Block errors
    if(!is_numeric($x1) || !is_numeric($x2)) {
        return "Был замечен пустой или строчный аргумент!";
    }

    if(empty($_GET['operation'])) {
        return "operation не был передан!";
    }

    if($_GET['x2'] == 0 && $_GET['operation'] == ":") {
        return "На ноль делить нельзя!";
    }
    //Block errors

    $calculator = $_GET['x1'] . " " . $_GET['operation'] . " " . $_GET['x2'] . " = ";
    switch($_GET['operation']) {
        case "+":
            $result = $x1 + $x2;
            break;
        case "-":
            $result = $x1 - $x2;
            break;
        case "*":
            $result = $x1 * $x2;
            break;
        case ":":
            $result = $x1 / $x2;
            break;
        case "%":
            $result = $x1 % $x2;
            break;
    }
    return $calculator . $result;

В принципе всё работает :/

ivashkevich 08.04.2020 в 14:58

Для строк используются одинарные кавычки.

По-хорошему нужно еще проверять, что в запросе пришёл корректный operation.

studentDev 06.04.2020 в 12:03

Хех на счёт "0 / true" соглашусь, я написал полную дичь :D

[email protected] 11.04.2020 в 08:30
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не понимаю, что делать';
}

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Как минимум один из аргументов пуст';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

#деление на 0:
if ($_GET['x2'] == 0 and $_GET['operation'] == '/') {
    return 'На ноль делить нельзя!';
}

#Вводим только числа:
if ($_GET['x1'] !== preg_match("[0-9]", '') or $_GET['x2'] !== preg_match("[0-9]", '')) {
    return 'С тем, что Вы ввели, в математику нельзя!';
}

return $expression . $result;

?>

Можно добавить возведение в степень и прочие более сложные операции.
Можно нарисовать кнопки, чтобы в них можно было тыкать, вместо того, чтобы вводить инпуты (ну, мало ли, у человека только мышь есть)
Сломать можно, думаю, слишком длинным вводом

ivashkevich 11.04.2020 в 21:20

Отлично.
Закрывающий тег в конце файла только не надо ставить.

[email protected] 12.04.2020 в 18:51

Здравствуйте, форма передаёт GET запрос в result.php, почему вам удалось получить все аргументы GET запроса из другого файла(вызывая $_GET в calc.php), почему не возникло ошибки?

ivashkevich 13.04.2020 в 14:45
$_GET доступно отовсюду
n.yurasheva 12.04.2020 в 18:53
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}
if (empty($_GET['operation'])) {
    return 'Не передана операция';
}
//Дополните код так, чтобы можно было передавать 0.
if (!isset($_GET['x1']) || !isset($_GET['x2']) || !isset($_GET['operation'])){
    return 'Не переданы ключи';
}
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
if ($x1 === '' || $x2 === '') {
    return 'Не переданы аргументы';
}
//Разделитель дробной части может быть ','. Заменим ',' на '.' (например, 0,6=0.6).
if (stristr($x1, ",") != false) {
    $x1 = str_replace( ",", ".", $x1);
}
if (stristr($x2, ",") != false) {
    $x2 = str_replace(",", ".", $x2);
}
//Чтобы в качестве аргументов можно было отправить только числа.
if (!is_numeric($x1)) {
    return 'Первое значение не число';
} else {
    $x1 = floatval($x1); //приводим к float
}
if (!is_numeric($x2)) {
    return 'Второе значение не число';
} else {
    $x2 = floatval($x2); //приводим к float
}
//Зачем приводим к float:
//Если вводим, например, 00000.3 или .3, то программа это воспринимает как 0.3 и выполняется
//Результат вычислений: 00000.3 + 4 = 4.3 или .3 + 4 = 4.3
//Т.е. при выводе нужно заменить 00000.3 и .3 на 0.3
$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 != 0) {
            $result = $x1 / $x2;
        } else {
            return 'На 0 делить нельзя!';
        }
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;

Пыталась с помощью strpos проверить есть ли "," в строке.
strpos(',7', ',') != false будет false
strpos('0,7', ',') != false будет true
Почему так происходит?

ivashkevich 13.04.2020 в 14:46
$x1 = trim($_GET['x1']);

Сначала нужно проверить, что в массиве вообще есть такой ключ. Иначе будет ошибка

ivashkevich 13.04.2020 в 15:04

Да и вообще непонятно для чего тут пробелы обрезать, если должна быть проверка на числа. Она их и так не пропустит.

n.yurasheva 13.04.2020 в 21:28

А теперь?

ivashkevich 14.04.2020 в 19:25
(empty($_GET['x1']) && ($_GET['x1'] != '0')

Если параметр не придет с формы, по-прежнему будет ошибка.

n.yurasheva 16.04.2020 в 17:17

Можно подробнее, какая ошибка? Сейчас если поле пустое, то выводится сообщение:
"Не переданы аргументы". Если 0, то считает.

ivashkevich 17.04.2020 в 08:54

Если убрать полностью поле x1 с формы и отправить запрос, то в массиве $_GET просто не будет ключа x1.
Далее произойдёт следующее - empty($_GET['x1']) вернёт true, так как за ним следует логический оператор &&, интерпретатор пойдет вычисляет значение справа от этого оператора и вот здесь:

$_GET['x1'] != '0'

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

Сначала нужно удостовериться, что вообще ключ в массиве есть. Это можно сделать либо с помощью isset, либо с помощью array_key_exists.

n.yurasheva 21.04.2020 в 18:56

Спасибо за объяснение. А теперь верно?

ivashkevich 21.04.2020 в 19:10
if (!isset($_GET['x1']) || !isset($_GET['x2']) || !isset($_GET['operation'])){
    return 'Не переданы ключи';

Какие ключи? Нужно больше деталей.
А для operation выше уже проверили с помощью isset.

if ($x1 === '' || $x2 === '') {
    return 'Не переданы аргументы';
}

Для чего эта проверка, если ниже проверим на то, что это числа.

if (stristr($x1, ",") != false) {

Для строк используются одинарные кавычки. Зачем использовать функцию не по назначению? Для поиска символов используйте strpos. Сравнивать при этом нужно строго, то есть с !== а не !=, чтобы избежать приведения нуля к false.

    $x1 = floatval($x1); //приводим к float

У нас же был урок по приведению данных:

    $x1 = (float)$x1;

Комментарии здесь ни к чему, и так всё понятно.

Fill 13.04.2020 в 13:57
<?php
//Проверка на пустой массив
if (empty($_GET)) {
    return 'Ничего не передано!';
}
// Получем данные из GET и обрезаем теги, далее пользуемся только переменными
$x1 = strip_tags($_GET['x1']);
$x2 = strip_tags($_GET['x2']);
$operation = strip_tags($_GET['operation']);
//Проверка заполнения операции
if (empty($operation)) {
    return 'Не передана операция';
}
//Проверка на числа
if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Не переданы аргументы';
}

$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' = ';

switch ($operation) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 == 0) { //Проверка деления на ноль
            return 'Делить на ноль нельзя';
        }
        $result = $x1 / $x2;
        break;
    case '^':
        $result = $x1 ** $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 13.04.2020 в 15:04
$x1 = strip_tags($_GET['x1']);

Сначала нужно проверить, что в массиве вообще есть такой ключ. Иначе будет ошибка.
Да и вообще непонятно для чего тут теги обрезать, если должна быть проверка на числа. Она их и так не пропустит.

ruslankandiba 14.04.2020 в 11:17
<?php

$argumentOne = $_GET['argumentOne'];
$argumentTwo = $_GET['argumentTwo'];
$operation = $_GET['operation'];

if (empty($_GET)){
    return 'Nichego ne peredano';
}

if (empty($operation)){
    return 'Operaciya ne vibrana';
}

if ($argumentOne === '' || $argumentTwo === ''){
    return 'Argumenti ne peredani';
}

if (!is_numeric($argumentOne) || !is_numeric($argumentTwo)) {
    return 'Neverniy format';
}

$display = $argumentOne .' '. $operation .' '. $argumentTwo . ' = ';

switch ($operation) {
    case '+':
        $result = $argumentOne + $argumentTwo;
        break;

    case '-':
        $result = $argumentOne - $argumentTwo;
        break;

    case '*':
        $result = $argumentOne * $argumentTwo;
        break;
    case '/':
        if($argumentTwo == 0){
            return 'na 0 delit nelza';
        } else {
            $result = $argumentOne / $argumentTwo;
        }
        break;
}

return $display . $result;

Такой вот вопрос: В чем разница между проверкой на ввод числа на фронте и бэке ? Лучше ставить type="number" в инпуте, или всё же проверять с помощью php?

ivashkevich 14.04.2020 в 19:32
$argumentOne = $_GET['argumentOne'];
$argumentTwo = $_GET['argumentTwo'];
$operation = $_GET['operation'];

if (empty($_GET)){
    return 'Nichego ne peredano';
}

Ну ага, сначала обратились к потенциально несуществующим ключам массива, а потом проверили его на пустоту. В итоге если поле из формы убрать и отправить запрос, то можно утонуть в ошибках.

[email protected] 14.04.2020 в 22:19
<?php

if (empty($_GET)) {
    return 'Ничего не найдено';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty($_GET['x1']) || empty($_GET['x2'])) {
    if ($_GET['x1'] != 0 & $_GET['x2'] != 0) {
        return 'Не переданы аргументы';
    }
}
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Вы вводите не числа, внимательнее!';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 != 0) {
            $result = $x1 / $x2;
            break;
        } else {
            $result = 'Деление на 0! Ужасно!';
            break;
        }
    default:
        return 'Operation is not defined';
}

return $expression . $result;

Я вот сделал так и решительно не понимаю, что можно улучшить, кроме уж совсем совершенствования калькулятора для подсчета, например, длинного выражения, но такое я пока не умею делать(

ivashkevich 15.04.2020 в 11:08
if (empty($_GET['x1']) || empty($_GET['x2'])) {
    if ($_GET['x1'] != 0 & $_GET['x2'] != 0) {

Если аргументы вообще не передать (удалить их с формы и отправить такой запрос), то будет ошибка, потому что таких ключей в массиве не будет.

Timurik 15.04.2020 в 09:06
  1. Заменить:

    if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Не переданы аргументы';

    на:

    if ($_GET['x1'] == '' || $_GET['x2'] == '') {
    return 'Не переданы аргументы';
  2. В:
    switch ($_GET['operation'])

    добавить:

    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
  3. Изменить:
    case '/':
        $result = $x1 / $x2;
        break;

    на:

    case '/':
        if ($x2 != 0) {
            $result = $x1 / $x2;
        } else {
            $result = 'Деление на ноль запрещено';
        }
        break;
  4. В файле index.php изменить:
    <input type="text" name="x1">

    и

    <input type="text" name="x2">

    на:

    <input type="number" name="x1" pattern="^[0-9]+$">

    и

    <input type="number" name="x2" pattern="^[0-9]+$">

    атрибут pattern с выражением "^[0-9]+$" разрешает отправлять форме только числа.

5.Можно добавить операции, например возведение в степень.
Я бы изменил:

default:
        return 'Операция не поддерживается';

на:

default:
        return 'Операция '.$_GET['operation'] .' не поддерживается';

для того, чтобы было понятно какая операция не выполняется.

ivashkevich 15.04.2020 в 11:40
if ($_GET['x1'] == '' || $_GET['x2'] == '') {
return 'Не переданы аргументы';

Если аргументы вообще не передать (удалить их с формы и отправить такой запрос), то будет ошибка, потому что таких ключей в массиве не будет.

    } else {
        $result = 'Деление на ноль запрещено';
    }

Тогда уж return, по аналогии с другими ошибками.

Валидация на фронте не спасет, я могу прямо в браузере ее поменять как хочу, в консоли разработчика. Нужно проверять, что это число именно на бэке, и делать это всегда.

return 'Операция '.$_GET['operation'] .' не поддерживается';

Опасно выводить вот так любые данные, прилетевшие с фронта, там может быть вредоносный XSS-код

Timurik 15.04.2020 в 13:44
if ($_GET['x1'] == '' || $_GET['x2'] == '') {
return 'Не переданы аргументы';

заменил на:

if (count($_GET) != 3 ) {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Аргументы не являются числами';
}

я не придумал пока что другого варианта,
тут же учёл проверку "Является ли аргумент числом".

    } else {
        $result = 'Деление на ноль запрещено';
    }

изменил на:

        } else {
            return 'Деление на ноль запрещено';
        }
return 'Операция '.$_GET['operation'] .' не поддерживается';

исправил на:

return 'Операция не поддерживается';

спасибо.

ivashkevich 15.04.2020 в 17:39

Еще раз повторюсь. Если аргументы вообще не передать (удалить их с формы и отправить такой запрос), то будет ошибка, потому что таких ключей в массиве не будет. Нельзя брать и обращаться к ключам массива, пока не убедились, что они там есть. Пока это не исправите дальше даже смотреть не буду.

Timurik 15.04.2020 в 18:23

Спасибо за подсказку.
Вроде я нашел:

if (!array_key_exists('x1', $_GET) || !array_key_exists('x1', $_GET)) {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Аргументы не являются числами';

проверил работу при удалении аргумента(ов) из формы

ivashkevich 16.04.2020 в 06:06

Красава! :) Совсем другое дело

Timurik 16.04.2020 в 11:08

Спасибо!

[email protected] 24.04.2020 в 11:53
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}
if (empty($_GET['operation'])) {
    return 'Не передана операция';
}
if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Не переданы аргументы!';
}
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Некорректный аргумент!';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$expression = $x1. ' '. $_GET['operation']. ' '. $x2. ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 == 0) {
            return 'На ноль делить нельзя!';
        }
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression. $result;
ivashkevich 24.04.2020 в 12:03

Какая красота! Идеальная домашка с первого раза!

2yeezy4me 01.05.2020 в 12:06
<?php
if (empty($_GET))
    return 'Ничего не передано!';

if (empty($_GET['operation']))
    return 'Не передана операция';

if (($_GET['x1'] === null) || ($_GET['x2'] === null))
    return 'Аргументы не переданы';

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2']))
    return 'Введите числа';

if (isset($_GET['x1']) && isset($_GET['x2'])) {
    $x1 = intval($_GET['x1']);
    $x2 = intval($_GET['x2']);
}
$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/' :
        $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;

    default:
        return 'Операция не поддерживается';

}

return $expression . $result;
ivashkevich 01.05.2020 в 15:20

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

titelivus 01.05.2020 в 17:09
  1. "Не переданы аргументы". Это получилось из за того что выражение:
if (empty($_GET['x1']) || empty($_GET['x2'])) {
    return 'Не переданы аргументы';
}

выполнилось, потому что функция empty($_GET['x1'] вернула TRUE, а функция empty(): Возвращает FALSE, если переменная существует и содержит непустое ненулевое значение. В противном случае возвращает TRUE. Мы передали в нее 0, соответственно она вернула TRUE.

Исправить можно так:

if ((empty($_GET['x1']) && $_GET['x1'] != 0) || (empty($_GET['x2']) && $_GET['x2'] != 0)) {
    return 'Не переданы аргументы';
}

2.

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty($_GET['x1']) || empty($_GET['x2'])) {
    if ($_GET['x1'] != 0 || $_GET['x2'] != 0) {
        return 'Не переданы аргументы';
    }
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '/':
        $result = $x1 / $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
  1. Выдаст ошибку: На ноль делить нельзя.

Доработка:

switch ($_GET['operation']) {
    case '/':
        if ($x2 == 0) {
            return 'На ноль делить нельзя!!!';
        }
        $result = $x1 / $x2;
        break;

4.

<input type="number" name="x1" step="any">
<input type="number" name="x2" step="any">
  1. Свой скромный функционал он выполняет на ура.
ivashkevich 02.05.2020 в 15:41

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

Stimi 02.05.2020 в 02:18
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (($_GET['x1'] === '') || ($_GET['x2'] === '')) {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Ввод только чисел';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '/':
        if ($x2 == 0) {
            return 'На 0 делить нельзя';
        } else {
            $result = $x1 / $x2;
        }
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 02.05.2020 в 16:15

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

Stimi 03.05.2020 в 19:37
<?php

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Операция не передана!';
}

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Не передан аргумент';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Ввод только чисел';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '/':
        if ($x2 == 0) {
            return 'На 0 делить нельзя';
        } else {
            $result = $x1 / $x2;
        }
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 03.05.2020 в 21:06

А чего приведение сразу не добавили?) Но в целом всё ок, работать будет без ошибок.

Stimi 03.05.2020 в 21:51

Имеется в виду приведение к float?

ivashkevich 06.05.2020 в 13:01

Ага

Sviatoslav 03.05.2020 в 20:16

Мой пример. Из проблем заметил, что не воспринимает запятую, только десятичную точку при вводе аргументов типа float.

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if ((empty($_GET['x1']) and _GET['x1'] != 0) || (empty($_GET['x2']) and _GET['x2'] != 0)) {
    return 'Не переданы аргументы';
}
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Введите корректные аргументы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 == 0) {
            $result = "<a href='https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D0%BD%D0%BE%D0%BB%D1%8C'>Деление на ноль недопустимо</a>";
            break;
        }
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 03.05.2020 в 21:07

and нужно заменить на &&

ivashkevich 03.05.2020 в 21:09

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

Sviatoslav 04.05.2020 в 21:35

Учитывая дополнительный урок, получилось так:

<?php

if (empty($_GET)) {
    return 'Ничего не передано';
}

if (empty($_GET['operation'])) {
    return 'Операция не передана';
}

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

$operations = $_GET['operation'];

if ($x1 === null || $x2 === null) {
    return 'Аргументы 1 или 2 не переданы';
}

if ($x1 === false || $x2 === false) {
    return 'Введите число';
}

switch ($operations) {
    case '+':
        $result = $x1 + $x2;
        break;
    case  '-':
        $result = $x1 - $x2;
        break;
    case  '/':
        $result = $x2 !== 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;
    case  '*':
        $result = $x1 * $x2;
        break;

    default:
        return 'Операция не поддерживается';
}

$expression = $x1 . ' ' . $operations . ' ' . $x2 . ' = ';

return $expression . $result;
ivashkevich 06.05.2020 в 13:39

Для чего написали ?? null после filter_input?

Sviatoslav 06.05.2020 в 18:28

После Вашого вопроса задумался и понял, что это лишнее. Если в filter_input подать строку, то переменной присвоит значение null. А это неправильно. Я правильно понял свою ошибку?

ivashkevich 08.05.2020 в 19:41

Дело в том, что вы проверяете с помощью null-coalesce оператора что там null и присваиваете... null! Бесполезное действие получается.

Sviatoslav 09.05.2020 в 12:43

Теперь понял. Спасибо за ответ. Если убрать null-coalesce оператор, то остальное правильно?

ivashkevich 10.05.2020 в 09:00

Да, но лучше исправляйте и потом уже спрашивайте, потому что иногда выходит так что говорим вроде бы об одном с учениками, а они имеют в виду совсем другое

[email protected] 06.05.2020 в 09:47

Самостоятельно получилось выполнить где-то только 50%, пришлось прибегнуть к помощи комментов.
Урок очень понравился. Из усовершенствований хотелось бы чтоб дробные числа вводились через "," как в стандартном калькуляторе.

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Введите числа! (для ввода дробной части используйте знак ".")';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? $x1 / $x2 : 'На ноль делить нельзя!';
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 06.05.2020 в 14:01

Отлично. Еще советую дополнительно изучить дополнительный урок Обработка форм в PHP

[email protected] 07.05.2020 в 16:19
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Аргументы не переданы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 != 0) {
            $result = $x1 / $x2;
        } else {
            return 'На ноль не делится';
        }
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;
ivashkevich 08.05.2020 в 20:14

Отличная, образцовая домашка!

[email protected] 07.05.2020 в 16:29

Сам смог добавить умножение и деление. При возведении в степень в результате появлялся пустой квадратик. Поэтому не стал добавлять. Урок понравился очень. Форматирую с Ctrl+Alt+L. Я просто делаю copy-paste своего кода в комменты. Может из-за этого нарушается форматирование?

ivashkevich 08.05.2020 в 20:15

В этой домашке всё хорошо с форматированием

IePyton 14.05.2020 в 13:21
<?php
if (empty($_GET)) {
    return 'Ничего не передано';
}

if (empty($_GET['operation'])) {
    return 'Пустой оператор';
}

if (!empty($_GET['x1']) || !empty($_GET['x2'])) {

$x1 = (int)$_GET['x1'];
$x2 = (int)$_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 == 0) {
            return 'На ноль делить нельзя!';
        } else {
            $result = $x1 / $x2;
        }
        break;

    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

}

return 'Пустые все или один из аргументов';
ivashkevich 14.05.2020 в 15:14

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

IePyton 14.05.2020 в 18:05

Тяжело дается тема, много нового

<?php
if (empty($_GET)) {
    return 'Ничего не передано';
}

if (empty($_GET['operation'])) {
    return 'Пустой оператор';
}

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

$operations = $_GET['operation'];

if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Введите числовое значение';
} else {

    switch ($_GET['operation']) {
        case '+':
            $result = $x1 + $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '*':
            $result = $x1 * $x2;
            break;
        case '/':
            if ($x2 == 0) {
                return 'На ноль делить нельзя!';
            } else {
                $result = $x1 / $x2;
            }
            break;

        default:
            return 'Операция не поддерживается';
    }
}

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
return $expression . $result;
ivashkevich 15.05.2020 в 18:18

Супер!

IePyton 21.05.2020 в 15:07

Предыдущие задачи решены, есть в комментах, теперь новые:

https://codingzone.io/problems/9/solution/825
https://codingzone.io/problems/10/solution/842

ivashkevich 22.05.2020 в 08:04

Интересный ход мыслей для второй задачи) Я решал так https://codingzone.io/ru/problems/10/solution/594

superbobr 22.05.2020 в 21:27

Если передать 0, то пишет, что не переданы аргументы. Это происходит потому, что функцией empty cледующие значения воспринимаются как пустые:
"" (пустая строка), 0 (целое число), 0.0 (число с плавающей точкой), "0" (строка), NULL, FALSE, array() (пустой массив)(цитата из официальной документации). Решил проблему конструкцией !isset, предварительно почитав комменты :) Если поделить на ноль, то "результат вычислений:
10 / 0 = INF". Исправил. Если добавить строку, калькулятор не работает корректно. Исправил.

<?php

if (!isset($_GET)) {
    return 'Ничего не передано!';
}

if (!isset($_GET['operation'])) {
    return 'Не передана операция';
}

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Не переданы аргументы';
}

if ($_GET['x2'] == 0 && $_GET['operation'] == '/') {
    return 'На ноль делить нельзя!';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Можно вводить только числа!';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

https://codingzone.io/problems/9/solution/980
https://codingzone.io/problems/10/solution/981

ivashkevich 23.05.2020 в 19:56

Отлично!

Hellbound 27.05.2020 в 20:10

При передаче 0 функция empty воспринимает его как пустое значение, поэтому (уже после того как прочитал комменты и дополнительный урок) добавил isset.
При делении на ноль, то выводится 3 / 0 = INF, добавил для этого условие if
При вводе строки калькулятор работает не совсем корректно, добавил для этого условие if с функцией is_numeric
В качестве улучшения можно добавить распознавание запятой в десятичных дробях или добавление кнопок вместо самостоятельного ввода, больше никаких улучшений не надумал.

<?php
if (empty($_GET)) {
    return 'Ничего не передано';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Необходимо ввести число';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '/':
        if ($x2 == 0) {
            return 'Ошибка, деление на ноль';
        }
        $result = $x1 / $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

Доп. задание 1 -https://codingzone.io/ru/problems/9/solution/1624 или так https://codingzone.io/ru/problems/9/solution/1627 (не знаю, какой вариант лучше)
Доп. задание 2 - https://codingzone.io/ru/problems/10/solution/1630

Возник так же вопрос - какую литературу стоит читать касательно PHP и стоит ли вообще? Просто слышал такое мнение от людей, которые себя программистами называли, что читать по программированию ничего не стоит и чуть ли не бесполезно

ivashkevich 27.05.2020 в 21:12
$_GET == ''

Некорректно сравнивать массив с пустой строкой.

В остальном ок.

По codingzone сравниваете с тем, что даётся по кнопке show our solution

По поводу литературы - этих курсов будет достаточно для начала, вряд ли в книгах будет что-то нужное и при этом этого не будет на phpzone

Hellbound 27.05.2020 в 22:58

Исправил, вместо сравнения использовал empty.
Да, в codingzone я увидел образцовое решение, просто не могу понять, стоит ли писать такой код, который только из встроенных функций и состоит или лучше все-таки какую-то часть писать самому, не полагаясь на функции.

ivashkevich 28.05.2020 в 20:33

Весь смысл в написании алгоритма самостоятельно, за исключением функций для преобразования ввода и вывода.

[email protected] 30.05.2020 в 16:45
ivashkevich 01.06.2020 в 07:31

Норм!

happyviolence 01.06.2020 в 21:14
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if ($_GET['x1'] === '' || $_GET['x2'] === '') {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Передано не число';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/';
        if ($x2 == 0){
            return 'на ноль делить нельзя!';
        } else {
            $result = $x1 / $x2;
        }
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

Что можно улучшить, не знаю. Может сделать вывод результата на той же страничке, где вводим числа? Чтоб при нажатии кнопки "посчитать" справа выводился ответ?

ivashkevich 02.06.2020 в 11:12

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

[email protected] 06.06.2020 в 22:13
<?php
if (empty($_GET)) {
    return 'Ничего не передано';
}
if (empty($_GET['operation'])) {
    return 'Операция не передана';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$operation = $_GET['operation'];

if ($x1 === null || $x2 === null) {
    return 'Ключ аргумента отсутствует';
}
if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Введите число';
}

switch ($operation) {
    case '+';
        $result = $x1 + $x2;
        break;
    case '-';
        $result = $x1 - $x2;
        break;
    case '*';
        $result = $x1 * $x2;
        break;
    case '/';
        if ($x2 != 0) {
            $result = $x1 / $x2;
        } else {
            return 'делить на "0" запрещено';
        }
        break;
    default:
        return 'операция не поддерживается';
}

$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' = ';

return $expression . $result;
ivashkevich 07.06.2020 в 13:01

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

UtillitE 06.07.2020 в 16:00

Привет, решение задачи

  1. https://codingzone.io/ru/problems/9
ivashkevich 08.07.2020 в 14:21

Привет. Это просто ссылка на задачу. Если все тесты прошли - мне нет смысла смотреть) Если не прошли и непонятно почему - готов помочь

UtillitE 10.07.2020 в 15:32

Тесты прошла, задачи решила!

ivashkevich 12.07.2020 в 05:40

Супер!

UtillitE 10.07.2020 в 15:11

Привет, вот что получилось.

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}
if ($_GET['x1'] == '' || $_GET['x2'] == '') {
    return 'Не переданы аргументы';
}
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
if (is_numeric($x2) && is_numeric($x1)) {
    switch ($_GET['operation']) {
        case '+':
            $result = $x1 + $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '*':
            $result = $x1 * $x2;
            break;
        case '/':
            if ($x2 != 0) {
                $result = $x1 / $x2;
            } else {
                return 'На 0 делить нельзя';
            }
            break;
        default:
            return 'Операция не поддерживается';
    }
} else {
    return 'Введите числа';
}
return $expression . $result;
ivashkevich 12.07.2020 в 05:40

Нельзя передать 0 в качестве аргументов.

UtillitE 18.07.2020 в 11:13

Привет, прочитав комментарии, исправила свою ошибку.

GeoOK 27.07.2020 в 07:38

calc.php

<?php

if ((empty($_GET['x1']) && $_GET['x1'] != '0') && (empty($_GET['x2']) && $_GET['x2'] != '0') && (empty($_GET['operation']) && $_GET['operation'] != '0')) {
    return 'Ничего не передано';
}

if (empty($_GET['operation'] && $_GET['operation'] != '0')) {
    return 'Не передана операция';
}

if ((empty($_GET['x1']) && $_GET['x1'] != '0') || (empty($_GET['x2']) && $_GET['x2'] != '0')) {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Допускаются только числа';
}

$x1 = $_GET ['x1'];
$x2 = $_GET ['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 == 0) {
            return 'Деление на ноль невозможно';
        }
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;

А как теперь высылать ссылки на решения с задач? Или уже этого не нужно? Я смотрю вы уже codingzone под свой домен перенесли...

ivashkevich 27.07.2020 в 18:48

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки.

А как теперь высылать ссылки на решения с задач?

А зачем? Если тесты прошли, значит всё ок, к тому же там есть сразу моё решение, с которым вы можете свериться.

GeoOK 31.07.2020 в 15:51

Ок, спасибо! В том уроке и ответил

dimadima 04.09.2020 в 17:20
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty (isset($_GET['x1'])) || empty (isset($_GET['x2'] ))) {
    return 'Не переданы аргументы';
}
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2']) ){
    return 'Бывает';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($x2 != 0){
            $result = $x1 / $x2;
        }
        else
            return 'error';
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 06.09.2020 в 14:31
(empty (isset(

это так не работает. Изучите детально эти конструкции и перепишите правильно.

        else
            return 'error';

Всегда используйте фигурные скобки для блоков if-else.

Sergey503 17.10.2020 в 19:12
<?php

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

// isset — Определяет, была ли установлена переменная значением отличным от NULL
if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Аргументы не переданы';
}

// is_numeric — Проверяет, является ли переменная числом или строкой, содержащей число
if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Только числа';
}

if (isset($_GET['x1']) && isset($_GET['x2'])) {
    $x1 = ($_GET['x1']);
    $x2 = ($_GET['x2']);
}

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+' :
        $result = $x1 + $x2;
        break;
    case '-' :
        $result = $x1 - $x2;
        break;
    case '*' :
        $result = $x1 * $x2;
        break;
    case '/' :
        if ($x1 != 0 && $x2 != 0) {
            $result = $x1 / $x2;
        } else {
            return "Деление на ноль невозможно";
        }
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 18.10.2020 в 15:28
if (isset($_GET['x1']) && isset($_GET['x2'])) {
    $x1 = ($_GET['x1']);
    $x2 = ($_GET['x2']);
}

эта проверка не имеет смысла, так как выше мы уже проверили:

if (!isset($_GET['x1']) || !isset($_GET['x2'])) {
    return 'Аргументы не переданы';
}
Larisa 06.11.2020 в 22:02
<?php

if (empty($_GET)){
    return 'Ничего не передано';
}
if (empty($_GET['operation'])) {
    return 'Операция не передана';
}
if (($_GET['x1'] === '') || ($_GET['x2'] === '')) {
    return 'Аргументы не переданы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$operation = $_GET['operation'];

$expression = $x1 . ' ' . $operation . ' ' . $x2 . ' ' . ' = ';
switch ($operation) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
}

return $expression. $result;
ivashkevich 08.11.2020 в 15:05

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

Deo 07.11.2020 в 17:00

У меня почему то

<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

При пустых формах всё равно возвращает 1.

ivashkevich 08.11.2020 в 15:15

Ну запрос-то от этого не пустой) Пустые строки передаются из полей.

Deo 08.11.2020 в 15:42

А, понял - при клике "Посчитать" я попадаю не на адрес:
http://myproject.loc/result.php
который возвращает строку 'Ничего не передано!',
а на адрес:
http://myproject.loc/result.php?x1=&operation=%2B&x2=
который возвращает 1.

ivashkevich 08.11.2020 в 15:50

Значит не здесь возвращается. Посмотрите дебаггером, на какой строке происходит возврат. Здесь 1 никак не может вернуться

pixel 07.11.2020 в 20:28
<?php
    $x1 = $_GET['x1'];
    $x2 = $_GET['x2'];
    $operation = $_GET['operation'];
    $result = '';
    if (is_numeric($x1) && is_numeric($x2)) {
        switch ($operation) {
            case '+':
                $result = $x1 + $x2;
                break;
            case '-':
                $result = $x1 - $x2;
                break;
            case '/':
                if ($x2 == 0) {
                    $result = 'Делить на 0 нельзя!';
                    return $result;
                } else {
                    $result = $x1 / $x2;
                    break;
                }
            case '*':
                $result = $x1 * $x2;
                break;
            default:
                $result = 'Введена неизвестная операция';
                return $result;
        }
    } else {
        $result = 'Введены не числовые переменные';
        return $result;
    }
    return $x1 . ' ' . $operation . ' ' . $x2 . ' = ' . $result;
ivashkevich 08.11.2020 в 15:33

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

pixel 07.11.2020 в 21:14
<?php
$line = '7 0 39 0 282 2 4 0 45';
    $array = explode(' ', $line);

    $countZero = 0;
    $resultArray = [];
    foreach ($array as $item) {
        if ($item == 0) {
            $countZero++;
            continue;
        }
        $resultArray[] = $item;
    }
    while ($countZero != 0) {
        $resultArray[] = 0;
        $countZero--;
    }
    echo '<pre>';
    var_dump($resultArray);
    echo '</pre>';
ivashkevich 08.11.2020 в 15:35

Не нужно скидывать код, если прошли все тесты. Если же тесты не прошли и вам что-то непонятно - задавайте вопрос)

[email protected] 14.11.2020 в 13:42

Код файла Calc:

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if ($_GET['operation'] == '/' && $_GET['x2'] == '0') {
    return 'На ноль делить нельзя';
}

if (!isset($_GET['x1']) || !isset($_GET['x2']) || $_GET['x1'] == "" || $_GET['x2'] == "") {
    return 'Не переданы аргументы';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 15.11.2020 в 08:06

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

annferny 30.11.2020 в 18:21
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (!isset($_GET['x1']) || !isset($_GET['x2']) || !isset($_GET['operation'])) {
    return 'Аргументы не переданы';
}

if (($_GET['x1'] === '' || $_GET['x2'] === '')) {
    return 'Аргументы не переданы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Можно вводить только числовые значения';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        if ($_GET['x2'] == 0) {
            return 'На ноль делить нельзя';
        }
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 01.12.2020 в 19:31

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

annferny 02.12.2020 в 15:33

Добрый день, я прошла указанный урок. Но не понимаю, где у меня допущены ошибки. Если не брать во внимание упрощение через filter_input и приведение к типу float, то основной обсуждаемой ошибкой в уроке было игнорирование isset. Но у меня он учтен. Поэтому могу попросить точно ткнуть пальцем, что тут не так?)

ivashkevich 04.12.2020 в 20:39

Прошу прощения. Действительно, всё в порядке

kan22 08.12.2020 в 21:22
<?php

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (empty($_GET['x1']) && $_GET['x1']!=0) {
    return 'Не переданы первый аргумент';
}

if (empty($_GET['x2']) && $_GET['x2']!=0) {
    return 'Не переданы второй аргумент';
}

if ($_GET['operation']=="/" && $_GET['x2']==0) {
    return 'Делить на ноль нельзя';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Некорретные данные';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*' :
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 13.12.2020 в 07:22

Проблема - нельзя задать аргументы, равные нулю.

dimadima 08.02.2021 в 13:49
<?php

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

if (is_null($_GET['x1']) || is_null($_GET['x2'])) {
    return 'Не переданы аргументы';
}

if (!is_numeric($_GET['x1']) || !is_numeric($_GET['x2'])) {
    return 'Не является числом';
}

    $x1 =  $_GET['x1'];
    $x2 = $_GET['x2'];

    $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

    switch ($_GET['operation']) {
        case '+':
            $result = $x1 + $x2;
            break;
        case '*':
            $result = $x1 * $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '/':
            if ($x2 != 0){
                $result = $x1 / $x2;
            }else {
                return 'На ноль делить нельзя';
            }
            break;
        default:
            return 'Операция не поддерживается';
    }

    return $expression . $result;
ivashkevich 09.02.2021 в 06:49

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

dimadima 09.02.2021 в 11:01
<?php

if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

$x1 = $_GET['x1'] ?? null;
$x2 = $_GET['x2'] ?? null;

if ($x1 === null || $x2 === null) {
    return 'Аргументы 1 или 2 не переданы';
}

if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Не является числом';
}

    $x1 = (float)$x1;
    $x2 = (float)$x2;

    $expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

    switch ($_GET['operation']) {
        case '+':
            $result = $x1 + $x2;
            break;
        case '*':
            $result = $x1 * $x2;
            break;
        case '-':
            $result = $x1 - $x2;
            break;
        case '/':
            if ($x2 != 0){
                $result = $x1 / $x2;
            }else {
                return 'На ноль делить нельзя';
            }
            break;
        default:
            return 'Операция не поддерживается';
    }

    return $expression . $result;
ivashkevich 14.02.2021 в 15:06

Теперь отлично

dimadima 09.02.2021 в 11:02

Получается вот так? Но написанное мной тоже работало, или это не совсем корректно написано?

ivashkevich 14.02.2021 в 15:07

is_null не используется сейчас. вы проверили, с прошлым вариантом пустой POST-запрос не приводил к ошибкам?

Vladimir96 16.02.2021 в 22:24
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

if (empty($_GET['operation'])) {
    return 'Не передана операция';
}

$x1 = $_GET['x1'];
$x2 = $_GET['x2'];

// проверка на число
if(!is_numeric($x1) && !is_numeric($x2)) {
    return 'Введите число';
}

// если передали ноль или пустоту
if (empty($x1) || empty($x2)) {
    // при сложении или вычитании в первый аргумент
    if ($x1 === '0' && $x2 !== '0') {
        return $x2;
    }

    // при сложении или вычитании во второй аргумент
    if ($x1 !== '0' && $x2 === '0') {
        return $x1;
    }

    // если ноль поделили на число
    if ($x1 === '0' && $_GET['operation'] === '/') {
        return 0;
    }

    // если число поделили на ноль
    if ($x2 === '0' && $_GET['operation'] === '/') {
        return 'На ноль делить нельзя';
    }

    // если передали ноль и знак умножения
    if ($x1 === '0' || $x2 === '0' && $_GET['operation'] === '*') {
        return 0;
    }

    return 'Не переданы аргументы';
}

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';

switch ($_GET['operation']) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 20.02.2021 в 04:59

Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

Vladimir96 23.02.2021 в 22:00

Вроде теперь все ок

$x1 = filter_input(INPUT_GET, 'x1', FILTER_SANITIZE_NUMBER_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_SANITIZE_NUMBER_FLOAT);
$operations = $_GET['operation'] ?? null;

if ($operations === null) {
    return 'Введите операцию';
}

if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Введите число';
} else {
    $x1 = (float)$_GET['x1'];
    $x2 = (float)$_GET['x2'];
}

if ($x2 === 0.0 && $operations === '/') {
    return 'На ноль делить нельзя';
} 

$expression = $x1 . ' ' . $operations . ' ' . $x2 . ' = ';

switch ($operations) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 28.02.2021 в 06:03
} else {
    $x1 = (float)$_GET['x1'];
    $x2 = (float)$_GET['x2'];
}

А нужно ли делать дополнительно приведение после

$x1 = filter_input(INPUT_GET, 'x1', FILTER_SANITIZE_NUMBER_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_SANITIZE_NUMBER_FLOAT);

?

Vladimir96 28.02.2021 в 17:29

Этот код только в качестве примера которым я проверял, будет ли работать или нет.

$var = filter_input(INPUT_GET, 'number', FILTER_SANITIZE_NUMBER_FLOAT);
echo $var + $var;

код выше выдал ошибку, потому что переменные не числа, поэтому я сделал приведение типов после проверки на число, но был еще такой вариант

$var = filter_input(INPUT_GET, 'number', FILTER_SANITIZE_NUMBER_FLOAT) ? (float)$_GET['number'] : false;
echo $var + $var;

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

serega19860511 26.04.2021 в 22:42
if ((isset($_GET['x1']) && $_GET['x1'] == '') || (isset($_GET['x2']) && $_GET['x2'] == '')) {
    return 'Не переданы аргументы';
}

/*$x1 = filter_input(INPUT_GET, $_GET['x1'], FILTER_VALIDATE_INT);вот тут не получилось
$x2 = filter_input(INPUT_GET, $_GET['x2'], FILTER_VALIDATE_INT);совладать с этой функцией
var_dump( $x1);
if ($x1 === null || $x2 === null) {
    return 'Аргументы 1 или 2 не переданы';
}*/

$x1 = $_GET['x1'];// можно привести к (int), но тогда и строка будет приравниваться к нулю
$x2 = $_GET['x2'];// а уже не то что нужно???
$operation = $_GET['operation'];

$expression = $x1 . ' ' . $_GET['operation'] . ' ' . $x2 . ' = ';
if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Необходимо ввести число';
}

switch ($operation) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 == 0 ? 'На ноль делить нельзя' : $x1 / $x2;
        break;
    default:
        return 'Операция не поддерживается';
}
return $expression . $result;
ivashkevich 28.04.2021 в 19:25
serega19860511 28.04.2021 в 21:28

Читал, но возможно что-то упустил. Опять я косячу?

ivashkevich 01.05.2021 в 17:38

Непонятно почему не смогли совладать с filter_input. В чем вопрос?

Логические задачи с собеседований