Чат в Telegram
Новый комментарий

Timurik Patron 19.04.2020 в 20:11

Я вот так сделал

<?php

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

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

$operations = $_GET['operation'];

$x1 = (float)filter_input(INPUT_GET, 'x1');
$x2 = (float)filter_input(INPUT_GET, '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 'Операция не поддерживается';
}

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

return $expression . $result;

единственное теперь при неправильном вводе не будет сообщений, а аргумент будет принимать значение 0.0

ivashkevich 19.04.2020 в 20:27

Как-то не очень хорошо ознакомились с функцией. У неё ещё 2 аргумента есть.

единственное теперь при неправильном вводе не будет сообщений, а аргумент будет принимать значение 0.0

Такие решения не принимаются. Должен быть полностью рабочий код.

Timurik Patron 19.04.2020 в 20:54

Исправил:

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

if ($x1 === false || $x2 === false) {
    return 'Аргументы 1 и/или 2 не переданы или не являются числами';
}

или необходимо разделить сообщения?

ivashkevich 20.04.2020 в 04:44

Можно разделить, будет дополнительнвм плюсом. Но в целом, это именно то, что я хотел увидеть)

Timurik Patron 20.04.2020 в 08:02

Спасибо.

titelivus 02.05.2020 в 18:52
<?php

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

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

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

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

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

$operations = $_GET['operation'];

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

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

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

return $expression . $result;

Если в любом аргументе ничего не передать и нажать на "Посчитать": Выведется сообщение: "Введите число!". Но логично было бы: "Аргументы 1 или 2 не переданы". Хотя мы ничего не передавали, но на самом деле мы передали пустую строку, а функция filter_input() обработала ее и вернула false. Тем самым выражение:

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

не сработает =*(

но можно сделать так:

<?php

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

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

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

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

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

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

$operations = $_GET['operation'];

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

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

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

return $expression . $result;

Хотя я уверен что есть способ поделикатнее, но это не точно =)

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

Бум! И снова ошибка!

titelivus 04.05.2020 в 04:46

А в чем ошибка, если отправить пустую строку, то есть ничего не писать просто нажать на кнопку посчитать, выведет Аргументы 1 или 2 не преданы. Все верно же.

ivashkevich 06.05.2020 в 13:05

Упс, видимо вам я еще не скидывал) Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки

desperatik@mail.ru 06.05.2020 в 23:02
if (empty($_GET)) {
    return 'Ничего не передано';
}

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

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

$operations = $_GET['operation'];

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

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

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

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

return $expression . $result;
ivashkevich 08.05.2020 в 19:49

Отлично!

garetziro@gmail.com 05.06.2020 в 22:41

$x2 = $_GET['x2'] ?? null;

Если я правильно понял, то это читается так, что если $_GET['x2'] равно null, то ее значение будет null.
Зачем задавать null если значение и так null?

ivashkevich 06.06.2020 в 08:45

Потому что без применения этого оператора будет ошибка уровня NOTICE, если этого ключа в массиве не будет.

garetziro@gmail.com 08.06.2020 в 21:50
if ($_GET['x1'] === '' || $_GET['x2'] === '')

То есть в данном случае мы просто проверяем - не передано ли в полях что-либо, но не проверяем есть ли сами поля, верно?
В таком случае, если да, то, возможно, следует взять на вооружение и всегда использовать
либо empty, либо сравнение с null или isset, верно?

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

garetziro@gmail.com 08.06.2020 в 22:16

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

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);
if ($x1 === null || $x2 === null) {
    return 'Аргументы 1 или 2 не переданы';
}
ivashkevich 09.06.2020 в 12:55

Норм!

X-Nick 19.12.2020 в 13:13

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

Не пройдет проверку на пустую строку, т.к. пустая строка это не null

ivashkevich 09.06.2020 в 12:55

В таком случае, если да, то, возможно, следует взять на вооружение и всегда использовать
либо empty, либо сравнение с null или isset, верно?

Совершенно верно

Как-то не совсем усвоил - зачем нужно проверять.

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

Ваше приложение не должно содержать ошибок. Вот прям совсем.

garetziro@gmail.com 09.06.2020 в 20:28

Спасибо за ответ!

GeoOK Patron 31.07.2020 в 15:48

Получилось так. Немного не допер, как сделать аналогичный, но кастомный фильтр для $_GET['operation'], через FILTER_CALLBACK. Как-то там сильно наворочено. Или это еще рано?

<?php

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

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);
$operation = $_GET['operation'] ?? null;

if ($x1 === null || $x2 === null || $operation === null) {
    return 'Ничего не передано';
}

if ($x1 === false && $x2 === false && empty($operation)) {
    return 'Ничего не передано';
}

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

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

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

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

return $expression . $result;
ivashkevich 02.08.2020 в 17:30
if ($x1 === null || $x2 === null || $operation === null) {
    return 'Ничего не передано';
}

if ($x1 === false && $x2 === false && empty($operation)) {
    return 'Ничего не передано';
}

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

Зачем столько проверок? Какое значение будет в x1, если не удастся распарсить число?

GeoOK Patron 03.08.2020 в 07:39

Зачем столько проверок?

Ну как бы логика была такая.

1) Проверяем сам массив на наличие данных:

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

2) Если массив не пуст, теперь проверяем есть ли заданные переменные в массиве:

if ($x1 === null || $x2 === null || $operation === null) {
    return 'Ничего не передано';
}

3) Если есть все переменные, проверяем есть ли во всех переменных аргументы:

if ($x1 === false && $x2 === false && empty($operation)) {
    return 'Ничего не передано';
}

*Хотя согласен, этот пункт можно опустить

Просто все эти 3 пункта могут быть выполнены, только если вмешиваться в работу программы, через строку, поэтому и описал все случаи одним комментарием, так сказать для "взламывателей" )))

Пользователь же, который будет "честно" работать через форму, фактически будет работать только вот с этими условиями:

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

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

Какое значение будет в x1, если не удастся распарсить число?

Ну если верить описанию filter_input, то при удачной фильтрации возвращается само число, при неудачной фильтрации, возвращается false, а при отсутствии самой переменной, возвращается null. А если использовать флаг FILTER_NULL_ON_FAILURE, то наоборот. Во всяком случае, я так понял.

ivashkevich 05.08.2020 в 08:06

Просто все эти 3 пункта могут быть выполнены, только если вмешиваться в работу программы, через строку, поэтому и описал все случаи одним комментарием, так сказать для "взламывателей" )))

всё правильно

Пользователь же, который будет "честно" работать через форму, фактически будет работать только вот с этими условиями:

ни в коем случае не полагайтесь на это

я просто у вас спросил, для чего, не просил ничего переписывать)

if ($x1 === false && $x2 === false && empty($operation)) {

а если только одно передано, а второе false? Тогда проверка не сработает. Нужно с помощью ИЛИ проверять, а не И.

GeoOK Patron 10.08.2020 в 13:14

а если только одно передано, а второе false? Тогда проверка не сработает.

Почему не сработает? Тогда сработает эта проверка, так как здесь, как раз все описано с помощью ИЛИ

if ($x1 === null || $x2 === null || $operation === {

А эта проверка,

if ($x1 === false && $x2 === false && empty($operation)) {

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

ни в коем случае не полагайтесь на это

Спасибо. Принято!

ivashkevich 11.08.2020 в 13:29

Дело в том, что в этой проверке

if ($x1 === null || $x2 === null || $operation === {

вот это:

нужна только на случай, если удалить все аргументы единовременно

тоже будет проверено. И проверка с && не имеет смысла

GeoOK Patron 12.08.2020 в 08:59

Не соглашусь. Эта проверка

if ($x1 === null || $x2 === null || $operation === {

проверяет только наличие переменных, а не аргументов в этих переменных (судя по описанию фильтра):

Т.е. если удалить эту проверку

if ($x1 === false && $x2 === false && empty($operation)) {

и удалить все аргументы в строке "result.php?x1=&operation=&x2="

То выйдет ошибка
Результат вычислений:
Введите число

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

MikeSiebel Patron 09.10.2020 в 11:44

Добрый день! Спасибо.
Освоил урок не без помощи комментариев. Пока возился, возник вопрос немного не в тему. Я добавил в калькуляторе, в файлах index.php и calc.php, две операции % и **. Всё работает. Но при вводе операции отображение вот такое.описание картинки

Подскажите, что с этим можно сделать.

ivashkevich 12.10.2020 в 07:36

Ну так у тебя там слеш и написан)

MikeSiebel Patron 12.10.2020 в 09:31

Да уж! Спасибо.

ivashkevich 12.10.2020 в 11:23

??

ivashkevich 12.10.2020 в 11:24

А, отвечай на комментарий, а не создавай новую ветку, а то не понял к чему ты это написал)

MikeSiebel Patron 12.10.2020 в 11:25

ok

Larisa 08.11.2020 в 16:30
<?php

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

$operations = $_GET['operation'];

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

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

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

return $expression . $result;
ivashkevich 08.11.2020 в 16:51
$x1 = (float)$x1;

Не нужно после FILTER_VALIDATE_FLOAT

Ошибки нужно возвращать просто строкой, а не записывать их в переменную $result. Там только результат успешной операции.

Larisa 08.11.2020 в 17:25
<?php

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

$operations = $_GET['operation'];

if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Аргументы х1 или х2 не переданы';
}
switch ($operations) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x2 != 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;
    case '/':
        $result = $x1 / $x2;
        break;
}

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

return $expression . $result;
Larisa 08.11.2020 в 17:26

Спасибо, исправила!

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

Ошибка в $result всё равно записывается

Larisa 09.11.2020 в 20:02
<?php

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

}
$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

$operations = $_GET['operation'];

if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Аргументы х1 или х2 не переданы';
    }
if ($x2 == 0) {
    return 'На ноль делить нельзя';
}
switch ($operations) {
    case '+':
        $result = $x1 + $x2;
        break;
    case '-':
        $result = $x1 - $x2;
        break;
    case '*':
        $result = $x1 * $x2;
        break;
    case '/':
        $result = $x1 / $x2;
        break;
}

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

return $expression . $result;
Larisa 09.11.2020 в 20:03

Исправила

ivashkevich 10.11.2020 в 19:13

Теперь ноль прибавить нельзя

Larisa 11.11.2020 в 23:22
<?php

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

$operations = $_GET['operation'];

if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Аргументы х1 или х2 не переданы';
}
switch ($operations) {
    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 'Операция не поддерживается';
}

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

return $expression . $result;
Larisa 11.11.2020 в 23:24

Снова поправила!

ivashkevich 13.11.2020 в 02:33

Теперь ок)

Larisa 13.11.2020 в 22:44

Спасибо, большое!

happyviolence Patron 19.11.2020 в 17:31
<?php
if (empty($_GET)) {
    return 'Ничего не передано';
}

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

//проверяем существование в массиве значения по указанному ключу
$x1 = $_GET['x1'] ?? null;
$x2 = $_GET['x2'] ?? null;

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

$operations = $_GET['operation'];

//проверяем, что введенные данные являются числами
if (!is_numeric($x1) || !is_numeric($x2)) {
    return 'Введите число';
}

//фильтруем значения, полученные методом GET

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

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

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

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

return $expression . $result;

Не очень понимаю, правильный ли кусок кода я заменила на filter_input?

ivashkevich 19.11.2020 в 20:58
is_numeric($x1)
filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT)

Нужно выбрать что-то одно.

ivashkevich 19.11.2020 в 21:00
$result = $x2 !== 0 ? ($x1 / $x2) : 'На ноль делить нельзя';

Ошибку не нужно записывать в результат. Сразу возвращайте её, как и ошибки выше

happyviolence Patron 20.11.2020 в 15:30
<?php
if (empty($_GET)) {
    return 'Ничего не передано';
}

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

//проверяем существование в массиве значения по указанному ключу
$x1 = $_GET['x1'] ?? null;
$x2 = $_GET['x2'] ?? null;

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

$operations = $_GET['operation'];

//фильтруем значения, полученные методом GET

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

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

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

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

return $expression . $result;

исправила)

ivashkevich 23.11.2020 в 17:29
$x1 = $_GET['x1'] ?? null;
$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);

Для чего в двух местах получаете значение?

happyviolence Patron 24.11.2020 в 15:25
<?php
if (empty($_GET)) {
    return 'Ничего не передано';
}

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

//фильтруем значения, полученные методом GET
$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT, FILTER_NULL_ON_FAILURE);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT, FILTER_NULL_ON_FAILURE);

//проверяем существование в массиве значения по указанному ключу
if ($x1 === false || $x2 === false) {
    return 'Аргументы 1 или 2 отсутствуют';
}

if ($x1 === null || $x2 === null) {
    return 'Переданные аргументы 1 или 2 не являются числами!';
}

$operations = $_GET['operation'];

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

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

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

return $expression . $result;

Убрала.

ivashkevich 25.11.2020 в 21:17
//проверяем существование в массиве значения по указанному ключу
if ($x1 === false || $x2 === false) {

Нет здесь никаких ключей)

А почему сравниваете с false, а потом с null? В каких случаях будут эти значения?

happyviolence Patron 26.11.2020 в 12:56

Комментарий забыла исправить.
Использую флаг null_on_failure, непонятно зачем, его убрала.

//фильтруем значения, полученные методом GET
$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

//проверяем, что переменные определены в массиве GET
if ($x1 === null || $x2 === null) {
    return 'Аргументы 1 или 2 отсутствуют';
}

//проверяем, что переданное значение прошло фильтрацию
if ($x1 === false || $x2 === false) {
    return 'Переданные аргументы 1 или 2 не являются числами!';
}
ivashkevich 26.11.2020 в 12:59

Отлично!

annferny Patron 02.12.2020 в 15:28
<?php

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

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

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

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

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

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

$operations = $_GET['operation'];

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

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

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

return $expression . $result;

Добрый день. У меня получился такой код, но он не совсем корректно работает. А именно: если задать пустое поле, то оно распознается как false, а не как null. И в результате выдается сообщение: "Введите число".

ivashkevich 04.12.2020 в 20:38

Для этого можно расширить одно из условий, проверив что на входе не пустая строка

bigblitz@mail.ru 20.01.2021 в 14:13

Добрый день.

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

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

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);

$operations = $_GET['operation'];

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

if (($x2 === 0.0) && ($_GET['operation'] === '/')) {
    return 'На ноль делить нельзя';
}
if ($x1 === false || $x2 === false) { 
    return 'Аргументы должны быть числами';
}

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

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

return $expression . $result;
ivashkevich 21.01.2021 в 06:12
if ((($x1 === 0.0) || ($x2 === 0.0)) && ($_GET['operation'] === '/')) {
    return 'На ноль делить нельзя';

На ноль нельзя. Но ноль на другие числа можно.

bigblitz@mail.ru 21.01.2021 в 06:47

Исправил

ivashkevich 21.01.2021 в 07:17

Супер!

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