Чат Telegram
Группа ВКонтакте
Новый комментарий


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

vadymbilyi@gmail.com 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 проверяете, что он существует. Это лишнее. Все остальное - огонь!

ppixx@mail.ru 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() позволяет проверить, что в переменной именно числовое значение.

tvan@yandex.ru 23.06.2018 в 18:09

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

ivashkevich 23.06.2018 в 19:00

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

tvan@yandex.ru 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, даже если это одна строка.

ArtemijeKA 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, будет ошибка, попробуйте исправить.

ArtemijeKA 10.09.2018 в 09:08

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

ivashkevich 10.09.2018 в 23:20

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

ArtemijeKA 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

Хорошо!

vadymbilyi@gmail.com 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().

demyanovpaul@yandex.ru 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().
В остальном - отлично!

demyanovpaul@yandex.ru 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 - не нужно вызывать в цикле. Она сама пройдется по всему массиву.

red.shuhov48@gmail.com 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

Ок!

rashik-2009@yandex.ru 09.03.2019 в 16:41

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

ivashkevich 09.03.2019 в 19:36

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

babls2332@gmail.com 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'] === '' возникнет ошибка.

babls2332@gmail.com 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

Отлично :)

volodia.pavloff201343@gmail.com 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 в результате. То же и с умножением.

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

pavliggs@mail.ru 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']). Потому что если с формы эти поля не будут переданы (если их совсем убрать с формы), то возникнет ошибка.

pavliggs@mail.ru 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'];

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

pavliggs@mail.ru 14.04.2019 в 00:55

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

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

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

samurad1310@gmail.com 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

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

krollik1000000@gmail.com 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 'на ноль делить нельзя';
            }

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

krollik1000000@gmail.com 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

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

prinzplanloser0514@gmail.com 18.09.2019 в 08:11

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

ivashkevich 18.09.2019 в 17:52

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

prinzplanloser0514@gmail.com 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.

anton-gogo@mail.ru 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 пришли в запросе.

anton-gogo@mail.ru 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.

zuxarevaalina88@gmail.com 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. Много логики ненужной.

Omigod@live.ru 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? А потом опять присваиваете значения.

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

Omigod@live.ru 01.12.2019 в 19:52
if (empty($_GET)) {
    return 'Ничего не переданно';
}

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

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

ivashkevich 01.12.2019 в 21:17

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

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

operation = $_GET['operation'];

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

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

Логические задачи с собеседований