К этому посту больше нельзя оставлять новые комментарии
Timurik 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 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 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 и исправьте ошибки

[email protected] 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

Отлично!

[email protected] 05.06.2020 в 22:41

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

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

ivashkevich 06.06.2020 в 08:45

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

[email protected] 08.06.2020 в 21:50
if ($_GET['x1'] === '' || $_GET['x2'] === '')

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

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

[email protected] 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, верно?

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

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

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

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

[email protected] 09.06.2020 в 20:28

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

GeoOK 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 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 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 12.08.2020 в 08:59

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

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

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

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

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

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

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

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

MikeSiebel 09.10.2020 в 11:44

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

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

ivashkevich 12.10.2020 в 07:36

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

MikeSiebel 12.10.2020 в 09:31

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

ivashkevich 12.10.2020 в 11:23

??

ivashkevich 12.10.2020 в 11:24

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

MikeSiebel 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 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 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 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 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 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

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

zarin 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 'На ноль делить нельзя';

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

zarin 21.01.2021 в 06:47

Исправил

ivashkevich 21.01.2021 в 07:17

Супер!

mavrito 22.03.2021 в 19:13
if (empty($_POST)) {
    return 'Nothing have been passed';
}

if (empty($_POST['option'])) {
    return 'No operator have been selected';
}
$operator = $_POST['option'];
$x = $_POST['var1'] ?? null;
$y = $_POST['var2'] ?? null;

if ($x === null) {
    return 'First variable has not been passed';
} elseif ($y === null) {
    return 'Second variable has not been passed';
}

$x = filter_var($x, FILTER_SANITIZE_SPECIAL_CHARS);
$y = filter_var($y, FILTER_SANITIZE_SPECIAL_CHARS);

if (filter_var($x, FILTER_VALIDATE_INT) === false) {
    return $x . ' is not a number';
}
if (filter_var($y, FILTER_VALIDATE_INT) === false) {
    return $y . ' is not a number';
}

switch ($operator) {
    case '+':
        $result = $x + $y;
        break;
    case '-':
        $result = $x - $y;
        break;
    case '*':
        $result = $x * $y;
        break;
    case '/':
        if ($y == 0) {
            return 'You cant divide by zero';
        }
        $result = $x / $y;

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

}

return $x . ' ' . $operator . ' ' . $y . ' = ' . $result;

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

ivashkevich 26.03.2021 в 17:34

filter_input вместо раздельной обработки POST-запроса и filter_var

X-Nick 08.05.2021 в 17:41
$x1 = $_GET['x1'] ?? null;
$x2 = $_GET['x2'] ?? null;

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

Здравствуйте! Можете объяснить логику сего действа?
Фактически, это проверка на отсутствие полей вообще. Но в случае проверки x1/x2 на пустую строку(на что как бы намекает текст ошибки - что аргумент 1 или 2 не передан) это работать не будет, т.к. для строгого равенства пустая строка не null. Тут спасает проверка функцией is_numeric, которая выдаст ошибку(введите число) в случае пустой строки и без которой строгое сравнение работать не будет. Но корректно ли это? Это же вроде разные проверки - на пустоту и на число/не число. Вообще не совсем понятно, зачем тут строгое сравнение, как и во многих других случаях по курсу, где можно обойтись без него.
Насколько я понимаю, можно было бы просто в приведенном выше коде использовать нестрогое сравнение:

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

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

Строгое сравнение должно быть по умолчанию. Смысл писать == null и подразумевать под этим проверку на пустую строку? Это делает код непонятным и непредсказуемым. Хотите проверить на пустую строку - напишите === ''. Пустой массив === [].

OneMoreTime 24.05.2021 в 15:27

Тогда нужно делать явную проверку на пустую строку, используя строгое равенство(=== ''), иначе проверка в Вашем коде выше работает не корректно. Я так думаю...))

FirstLast 21.05.2021 в 15:06
<?php

if (empty($_GET)) {
    return 'вы не ввели данные';
}

При отсутствии исходных данных в калькуляторе не возвращает это сообщение. Все остальное работает.
php-8

ivashkevich 23.05.2021 в 00:03

Так может данные все же есть? Пустые строки - тоже данные. Что выводит var_dump($_GET)?

FirstLast 23.05.2021 в 09:19

Начал следующий урок и понял в чем тут дело.

FirstLast 23.05.2021 в 12:19
array(2) { ["login"]=> string(5) "admin" ["password"]=> string(8) "P@ssWOrd" }

Извините, что не по теме. Подскажите, как сделать, чтобы PHPStorm выводил функцию var_damp как у Вас, построчно, а не одной строкой (плохо читабельно). Google мои вопросы не совсем понимает. Будет круто, если найдется ссылка с дополнительными лайфхаками по настройкам. Спасибо!

jetsaus 18.07.2021 в 18:52

Добрый вечер!
Существует ли возможность функцией filter_input() обработать регулярное выражение, например "[+-/*//]" для контроля ввода операций калькулятора, в доках функции что-то не увидел про регулярки. И есть ли смысл это делать в данном коде, ведь операции обрабатываются switch'ем.

<?php
// Обработчик калькулятора для домашнего задания
if (empty($_GET)) {
    return 'Ничего не передано';
}
if (empty($_GET['operation'])) {
    return 'Операция не передана';
}

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

$operations = $_GET['operation'] ?? null;

$x1 = filter_input(INPUT_GET, 'x1', FILTER_VALIDATE_FLOAT);
$x2 = filter_input(INPUT_GET, 'x2', FILTER_VALIDATE_FLOAT);
if (($x1 === false) && ($x2 === false)) {
    return 'Аргументы не переданы или они "не-число"';
}
if ($x1 === false) {
    return 'Аргумент 1 не передан или он "не-число"';
}
if ($x2 === false) {
    return 'Аргумент 2 не передан или он "не-число"';
}

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

Кажется здесь проще простым сравнением обойтись.

if ($x1 === null) {
    return 'Аргумент 1 не передан';
}
if (($x1 === false) && ($x2 === false)) {
    return 'Аргументы не переданы или они "не-число"';
}

не нужно на один и тот же параметр 2 проверки делать

Arhimedovich 24.12.2021 в 17:54
<?php

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

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

$operations = $_GET['operation'];

$x1 = filter_input(INPUT_GET, "x1", FILTER_VALIDATE_INT);
$x2 = filter_input(INPUT_GET, "x2", FILTER_VALIDATE_INT);
if ($x1 && $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;
} else echo 'Аргументы не переданны';
ivashkevich 04.01.2022 в 05:07

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

dirty-monk 18.01.2022 в 16:31
<?php
if (empty($_GET)) {
    return 'Ничего не передано!';
}

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

if (!isset($_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 (!is_numeric($x1) || !is_numeric($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 '/':
        $result = $x2 != 0 ? ($x1 / $x2) : 'Деление на ноль';
        break;
    default:
        return 'Операция не поддерживается';
}

return $expression . $result;
ivashkevich 19.02.2022 в 19:16

В случае деления на ноль нужно делать return по аналогии с остальными ошибками

[email protected] 28.05.2022 в 13:11
<?php

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

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

if ($_GET['x1'] === '' || $_GET['x2'] === ''){
    return 'Введите всё аргументы';
}

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

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

$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 = $x2 !== 0 ? ($x1 / $x2) : 'На ноль делить нельзя';
        break;
    default:
        $result = 'Операция не поддерживается';
}

return $expression . $result;

Здравствуйте, есть что дополнить?

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