Ответы пользователя по тегу PHP
  • Почему неправильно определяется дата?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Месяц назад от 31 мая какое число было? 30 апреля? Ок. А месяц вперёд от 30 апреля будет 30 мая или 31 мая? А месяц вперёд от 31 мая что будет, 30 июня или 1 июля?
    Если надо просто определить предыдущий месяц, то используйте 'first day of previous month'.
    Ответ написан
    Комментировать
  • Как работать с таким форматом даты в PHP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $dateTime = new DateTime('2021-05-18T15:30:00.000-04:00');
    var_dump($dateTime);
    $dateTime->setTimezone(new DateTimeZone('Europe/Moscow'));
    var_dump($dateTime);
    
    // object(DateTime)#1 (3) {
    //   ["date"] => string(26) "2021-05-18 15:30:00.000000"
    //   ["timezone_type"] => int(1)
    //   ["timezone"] => string(6) "-04:00"
    // }
    //object(DateTime)#1 (3) {
    //  ["date"] => string(26) "2021-05-18 22:30:00.000000"
    //  ["timezone_type"] => int(3)
    //  ["timezone"] => string(13) "Europe/Moscow"
    //}
    
    $timestamp = strtotime('2021-05-18T15:30:00.000-04:00');
    var_dump($timestamp); // int(1621366200)
    date_default_timezone_set('Europe/Moscow');
    $dateTime = date('c', $timestamp);
    var_dump($dateTime); // string(25) "2021-05-18T22:30:00+03:00"
    Ответ написан
    Комментировать
  • Как реализовать безопасную авторизацию и аутентификацию на PHP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Можно много вариантов придумать.
    Statefull - храним сессии в БД (session_set_save_handler), через session_set_cookie_params устанавливаем нужный срок жизни сессионной куки.
    Stateless - используем JWT, refresh-токену задаём нужный срок жизни.
    Ответ написан
    Комментировать
  • Как решит проблему с курсом валют?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    foreach($rates['currency'] as $rate) {
        if($rate['from'] === $amountCurrency && $rate['to'] ===  $targetCurrency) {
            $directRate = $rate;
        }
        if($rate['from'] === $targetCurrency && $rate['to'] ===  $amountCurrency) {
            $reversedRate = $rate;
        }
    }
    Поскольку строки с $rate['from'] === "USD" и $rate['to'] === "RUB" в массиве нету, то $directRate останется равной null.
    Поскольку в массиве есть две строки с $rate['from'] === "RUB" и $rate['to'] === "USD", то в $reversedRate будет записана последняя из этих строк, {"from":"RUB","to":"USD","operationType":"buy","value":"75.65"}.
    if ($directRate) {
        ....
    }
    Этот блок не выполнится, так как в $directRate записан null.
    if ($reversedRate) { // На эту строку не обращать внимания
        if ($reversedRate['operationType'] == 'buy') {
            $amountConverted = $reversedRate['value'];
        } elseif ($directRate['operationType'] == 'sell') {
            $amountConverted = $reversedRate['value'];
        }
    }
    Здесь сработает ветка с $reversedRate['operationType'] == 'buy' и в $amountConverted запишется "75.65".
    Всё работает в точности так, как вы написали в своей программе.
    Для того, чтобы что-то переписать, надо знать, что именно вы рассчитываете получить при таких входных данных и почему.
    Предположу, что в случае совпадения пары валют вам нужна ветка buy, а в случае обратного их расположения - ветка sell. Тогда будет так:
    $conversionRate = null;
    foreach($rates['currency'] as $rate) {
        if (($rate['operationType'] === 'buy' &&
             $rate['from'] === $amountCurrency &&
             $rate['to'] ===  $targetCurrency) ||
            ($rate['operationType'] === 'sell' &&
             $rate['from'] === $targetCurrency &&
             $rate['to'] ===  $amountCurrency)
        ) {
            $conversionRate = $rate['value'];
        }
    }
    var_dump($conversionRate);
    Ответ написан
  • Как исправить ошибка при импорте Бд в phpmyadmin?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вам же русским по розовому пишет - база данных не выбрана.
    Выберите нужную базу данных.
    Ответ написан
    Комментировать
  • Как реализовать SMTP отправку почты PHP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Поскольку вы не дожидаетесь ответа сервера, то ваши команды уходят на сервер до того, как он будет готов их принять.
    Ответ написан
    Комментировать
  • Какой способ подсчёта суммы в БД лучше и перспективнее для большого объёма?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Естественно, в SQL.
    Ответ написан
    Комментировать
  • Не выполняется проверка логина. В чём ошибка?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    mysqli::query
    Возвращает false в случае неудачи. В случае успешного выполнения запросов SELECT, SHOW, DESCRIBE или EXPLAIN mysqli_query() вернёт объект mysqli_result.

    Соответственно, возвращается объект mysqli_result (результат из нуля строк - это тоже корректный результат и вернётся объект), в строке if ($row) приводится к true, условие выполняется, клиенту возвращается "true".
    А вообще логика крайне странная. Сначала вы пытаетесь найти логин в базе данных, а затем проверяете его регуляркой. Логично наоборот, хотя бы с точки зрения времени выполнения.
    Ну и приучите себя использовать подготовленные выражения с плейсхолдерами, это лучшая защита от SQL-инъекций.
    Ответ написан
    1 комментарий
  • По какому волшебству в Laravel работает Hash::check() - ведь хэши генерируемые Hash::make() всегда разные?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если посмотрите на хэш, то его можно разделить на несколько частей
    $2y$10$jSAr/RwmjhwioDlJErOk9OQEO7huLz9O6Iuf/udyGbHPiTNuB3Iuy
    2y - тип хэша, BCRYPT.
    10 - алгоритмическая сложность bcrypt.
    jSAr/RwmjhwioDlJErOk9 - 21 символ соли.
    OQEO7huLz9O6Iuf/udyGbHPiTNuB3Iuy - собственно хэш.
    При генерации хэша задаётся случайная соль, поэтому хэш каждый раз разный.
    При проверке пароля параметры хэширования берутся из строки проверяемого хэша, поэтому при правильном пароле хэши совпадут.
    Ответ написан
    1 комментарий
  • Как сделать период дат для if else php?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $simpleDate = date('m-d');
    if ($simpleDate >= '12-20' || $simpleDate <= '01-11') {
        ...
    }

    P.S. А вообще, можно сделать гораздо универсальнее. Описать в конфиге интервалы и соответствующие им логотипы.
    class Config
    {
        public const LOGOS = [
            ['from' => '01-01', 'to' => '01-11', 'logo' => 'logo-newyear.png'],
            ['from' => '04-25', 'to' => '05-03', 'logo' => 'logo-firstmay.png'],
            ...,
            ['from' => '12-20', 'to' => '12-31', 'logo' => 'logo-newyear.png']
        ];
    }
    ...
    $simpleDate = date('m-d');
    $logoName = 'logo-standard.png';
    foreach (Config::LOGOS as $logoDef) {
        if ($simpleDate >= $logoDef['from'] && $simpleDate <= $logoDef['to']) {
            $logoName = $logoDef['logo'];
        }
    }
    Ответ написан
    Комментировать
  • Где применяются key(), next(), current()?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас не полный список функций, есть ещё reset(), end(), each() и prev().
    Двигаться по массиву таким образом можно в обе стороны, в отличие от foreach.
    Ответ написан
    2 комментария
  • Как аргументом передать функцию?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    <?php
    function foo() {
        print "Foo\n";
    }
    
    function baz($fn) {
        $fn();
    }
    
    baz('foo'); // Foo
    Ответ написан
    3 комментария
  • Как лучше хранить и считывать полученный token?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если токен - это именно токен (например, JWT), то на сервере его хранить не надо. Токен подписывается и передаётся клиенту. После получения запроса с токеном сервер проверяет подпись, распаковывает токен и использует данные из него.
    Ответ написан
  • Баг ли это в uasort / usort?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас неверно формируется значение пользовательской функции для сортировки.
    Она должна выдавать значение, меньшее нуля, если $a < $b, ноль, если $a == $b, большее нуля, если $a > $b.
    У вас же она выдаёт 0 и для $a < $b и для $a == $b.
    uasort($ar, static fn($a, $b) : int => $a[0] - $b[0]);

    А то, что в разных версиях разный результат, может быть просто потому, что немного поменяли внутренний алгоритм usort/uasort.
    Ответ написан
    Комментировать
  • Как мне проверить, если ли этот префикс?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $exploded_prefix = explode(':', $prefix, 2);
    if ($exploded_prefix[0] === 'test' && count($exploded_prefix) === 2) {
        ...
    }
    Ответ написан
  • Почему в данном PHP коде не наследутся public метод?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Наследуется - не значит "копируется". Просто при вызове $test->inherited() в классе child функция не будет найдена и будет попытка вызова функции из родительского класса base.
    Ну а класс base, как уже написал Лентюй, не видит overriden() из child, поскольку она приватная.
    Ответ написан
    Комментировать
  • Что означает такая конструкция new class($kernel) extends HttpCache {} в коде ниже?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    На базе класса HttpCache создаётся анонимный класс, в конструктор которого передаётся переменная $kernel, сразу же создаётся экземпляр этого класса (new) и вызывается его метод getStore();
    Ответ написан
    Комментировать
  • Как получить данные передаваемые post запросом VUE(axios)+PHP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Раз передаёте как application/json, значит стандартный массив $_POST не будет заполняться. Надо принимать данные самостоятельно.
    $json = file_get_contents('php://input');
    $data = json_decode($json, true);
    Ответ написан
    1 комментарий
  • Выбрать максимальное значение из БД и вывести его?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Кому должно? Если у вас вместо числа в базу записано его строковое представление, в котором вмести точки стоит запятая, ну так ССЗБ.
    При попытке преобразования такой строки в число, как только будет встречена запятая, преобразование завершится.
    Ответ написан
    5 комментариев
  • Как из foreach исключить или взять последние данные по дате?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы берёте даты в UTC, а выводите их в своём часовом поясе.
    "2014-07-09T00:04:00.000Z" = "2014-07-09T03:04:00.000+03:00"
    "2014-07-09T23:59:00.000Z" = "2014-07-10T02:59:00.000+03:00"
    Ответ написан
    3 комментария