Не понимаю конструкцию со строкой

Den1xxx

Постоялец
Регистрация
15 Янв 2014
Сообщения
290
Реакции
168
Здравствуйте
На сервере сайт на Вордпрессе, при отмене платежа Пейпал генерируется в логах ошибка вида
Код:
[21-Sep-2020 11:03:29 UTC] PHP Warning:  A non-numeric value encountered in /home/site/public_html/wp-content/plugins/woo-paypalplus/src/Ipn/PaymentValidator.php on line 177
Соответственно строчка в PaymentValidator.php
PHP:
$paypalTotal = $this->sanitize_string_amount((string)$currency) * -1;
И вот я чего-то совсем в это не въезжаю в это.
Справа строка умножается на минус 1 или что это происходит?
Чего-то не въезжаю, помогите.
 
Попробуйте "$this->sanitize_string_amount((string)$currency)" выделить в переменную и вардампнуть
УПД
Что-то там возвращается из метода sanitize_string_amount и это умножается на -1, верно
 
Попробуйте "$this->sanitize_string_amount((string)$currency)" выделить в переменную и вардампнуть
Если б мог, сделал бы. Как Вы это себе представляете практически?
Заплатить платеж Пейпал, потом отменить его и получить ошибку?
Можно конечно перевести платежи в тестовые и отловить этот варнинг.
Но я думаю заказчик не одобрит остановку платежей из-за ерунды)))
Что-то там возвращается из метода sanitize_string_amount и это умножается на -1, верно
Вот этого и не понимаю. Строка на число умножается? И что получится?
 
Как Вы это себе представляете практически?
Можете создать табличку для отладки и туда писать
Можете создать тестовый товар ввиде коня в вакууем и купить его
Кто купит по мимо вас, сам себе буратино

Да, пхп позволяет перемножать string в котором заведомо число на число и получить тип integer на выходе
Предположительно, sanitize_string_amount вазвращает что такое, что не поддается приведению к типу через умножение
 
Предположительно, sanitize_string_amount вазвращает что такое, что не поддается приведению к типу через умножение
Провел эксперимент
PHP:
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

echo '1121'*-1;
Результат: -1121, ошибок нет и в логах нет.
PHP Version 7.2.29

Сама функция в файле выглядит так:
PHP:
    public function is_valid_refund()
    {
        $currency = $this->request->get(self::CURRENCY_DATA_KEY, FILTER_SANITIZE_STRING);

        $total = $this->sanitize_string_amount((string)$this->order->get_total());
        $paypalTotal = $this->sanitize_string_amount((string)$currency) * -1;

        $total = $this->format($total);
        $paypalTotal = $this->format($paypalTotal);

        return ($paypalTotal === $total);
    }
Это старая версия плагина. Поскольку до меня сайт уже был обвешан плагинами и при их обновлении новая версия не работает, пользуюсь старой.
Новая версия функции такая:
PHP:
public function is_valid_refund()
    {
        $amount = (string)$this->request->get(self::AMOUNT_DATA_KEY, FILTER_SANITIZE_STRING);
        $total = $this->sanitize_string_amount((string)$this->order->get_total());

        $paypalTotal = $amount * -1;
        $paypalTotal = $this->sanitize_string_amount((string)$paypalTotal);

        $total = $this->format($total);
        $paypalTotal = $this->format($paypalTotal);

        return ($paypalTotal === $total);
    }
Для просмотра ссылки Войди или Зарегистрируйся

И опять зачем-то приведение к строке, а потом умножение на число.
А потом приведение опять к строке, мля.
Как бы для меня эта ситуация не проблема и можно исправить, но только я не понимаю, зачем это сделано.
Хотел бы разобраться для понимания.
//PS Корни этого очевидно здесь Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Скинте метод sanitize_string_amount, погадаем)
Может он возвращает 'тасяча', тогда перемножение и вызовет ошибку
 
Не, там все проще.
Тест №2
PHP:
<?
error_reporting(E_ALL);
ini_set('display_errors', '1');

echo 'test'*-1;

Результат:
Warning: A non-numeric value encountered in G:\OSP\OpenServer\domains\bestloft.local\test.php on line 6
0

То есть если PHP может распознать число в строке, то при последующей операции сложения/умножения/вычитания/деления предупреждений не будет.
Если же в строке числом вообще не пахнет, будет ворнинг или нотис
Т.е. 'test' — warning, '1test' — notice, при этом первое приведется к 0, второе к 1.
Кстати пустая строка '' тоже приводит к предупреждению, может и она возвращается.
Ну а если там '123' то приведётся к числу 123.
Применительно к изначальному в начале функции
PHP:
$currency = $this->request->get(self::CURRENCY_DATA_KEY, FILTER_SANITIZE_STRING);
Я подозреваю, что по запросе в базу о валюте должна прилетать строка названия валюты
Тогда как в новом варианте у разраба
PHP:
$amount = (string)$this->request->get(self::AMOUNT_DATA_KEY, FILTER_SANITIZE_STRING);
там уже прилетает сумма платежа, что является числом.
Походу, это был какой-то косяк с плагином — он не возвращал заплаченное при отмене имхо)))
А на минус единицу число умножалось, т.к. это вычет денег.
Но вот зачем разраб упорно приводит к строке переменную, чтобы потом провести арифметическую операцию, для меня осталось загадкой)
Возможно, иногда прилетал массив с запроса? ХЗ.
ЗЫ метод sanitize_string_amount весьма-весьма интересен)
PHP:
    private function sanitize_string_amount($amt)
    {
        assert(is_string($amt));

        return str_replace(',', '.', $amt);
    }
Любит с.ка разраб строки видимо)))
 
Последнее редактирование:
Сюда еще загляните - Для просмотра ссылки Войди или Зарегистрируйся
И вообще это не безопасно - Для просмотра ссылки Войди или Зарегистрируйся
...с методом х..ю сморозил
Могу поискать как сам юзал, если не решите вопрос
 
Любит с.ка разраб строки видимо)))
видимо, там в сумме могла встретиться запятая вместо точки, пробелы для отделения разрядов и так далее, разные интернациональные форматы. Может, даже символ $ ? ))) вот разраб и подстраховывается
 
Назад
Сверху