Задать вопрос
Ответы пользователя по тегу PHP
  • Как сохранить функцию php при срабатывании скрипта js?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ написан
    Комментировать
  • Как сделать проверку статуса платежа и дальнейшее выполнение функций?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Страница result не имеет вообще никакого отношения к успешности платежа. На неё любой придурок и так может перейти, руками, без всякой оплаты.
    Успешность оплаты подтверждается либо колбеком банка, либо отдельным запросом в банк. После которых полученная информация записывается в базу данных, а затем "выполнение кода продолжается" и код начинает отправлять всякие СМС и емейлы. После получения подтверждения, а не на странице result.

    Соответственно, на любой странице, куда попадает пользователь, будь это страница result, или "на главную страницу с выбором услуги" код должен проверять состояние платежа по базе данных. Если заказ оплачен успешно, то так и писать. Если колбек ещё не пришел, то можно самостоятельно запросить информацию о статусе платежа.
    Ответ написан
    Комментировать
  • Как правильно перекодировать массив php в json?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Проблема, как всегда, исключительно в том, что снежинки не умеют в интернет

    Казалось бы, набери в браузере: php json_encode кракозябры и получи ответ меньше, чем за секунду
    но по какой-то неведомой причине разработчики, родившиеся через 50 лет после появления интернета, почему-то не умеют им пользоваться
    Ответ написан
    1 комментарий
  • Нужен ли цикл для рекурсии?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос в заголовке бессмысленный.
    Цикл и рекурсия - это два разных алгоритма, которые между собой не связаны.

    Для нахождения делителей никакая рекурсия не нужна, достаточно цикла.
    С рекурсией можно изъевернуться, но это уже будет проходить по классу жестких извращений.
    Ответ написан
    Комментировать
  • Как в php вывести переменную или константу внутри конструкции?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нужно вместо "moscow" вставить переменную или константу.
    А если что-то надо вывести, то это надо делать внутри фигурных скобок
    Ответ написан
    2 комментария
  • Как вывести данные из двух таблиц?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ошибка детская, она вот в этом: "Есть 2 таблицы, в которых одинаковые поля".
    Очень часто новички, которые не понимают, как работает база данных, делают подобное.
    И всегда потом приходится переделывать, даже если очень не хочется.
    Потому что в БД не должно быть таблиц с одинаковыми полями. Собственно, сообразительные новички уже на этом вопросе, "как выбрать из двух таблиц" начинают понимать, что у них что-то пошло не так.

    Так что надо просто сделать одну таблицу, записать в неё данные из всех таблиц с одинаковыми полями, и выбирать из неё обычным способом.

    Имя таблицы, кстати, тоже очень странное. Наверняка там внутри тоже треш и угар и вот её-то как раз и надо разделить, только не горизонтально, а вертикально. Судя по составу полей, нужна одна таблица city и одна таблица people, в которой указывается только city id
    Ответ написан
    2 комментария
  • Как автоматически заполнить форму пришедшими данными?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Никто не подскажет, потому что сам по себе ваш код рабочий.
    Скорее всего, вы выводите данные не сразу, а в каком-то другом скрипте, например после редиректа, но почему-то ожидаете, что РНР будет таскать за вами массив $_POST по всему сайту, и при этом помнить, какой именно $_POST вам нужен в данный конкретный момент, среди всех форм, оправленных всеми пользователями на сайте.

    Единственное, что можно добавить к теме "заполнить форму пришедшими данными" - это что выводимые данные должны в обязательном порядке экранироваться.

    <form method="POST" action="">	 
      <input type="hidden" name="label" value="<?= htmlspecialchars($_POST["label"]) ?>" />
      <input type="hidden" name="amount" value="<?= htmlspecialchars($_POST["amount"]) ?>" />
      <input type="submit" name="ok" value="" id="button" />
    </form>
    Ответ написан
    8 комментариев
  • PHP: как снизить нагрузку на сервер при выполнение тяжёлого скрипта?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    ну если в лоб, то nice
    и, действительно, непонятно при чем тут пхп.
    что такого делает ваш скрипт, что не может сделать imagemagick?
    Ответ написан
  • Почему не работают PHP сессии после загрузки сайта на хостинг?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сессии надо смотреть не через print_r, а через инструменты разработчика.
    Выдает ли сервер куку PHPSESSID?
    Что в ней написано?
    Возвращает ли браузер куку PHPSESSID?
    Что в ней написано?
    Что выдает session_id после старта сессии при получении этой куки?
    ну и в /tmp не помешает заглянуть.

    Я не удивлюсь, что уже на первом пункте все ломается, потому что говнокод и HTML идет вперёд логики.
    Ответ написан
    Комментировать
  • Как можно улучшить организацию дев окружения и деплоя при разработке библиотеки?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Докер.

    Вообще очень странно, что вы так долго могли усидеть на такой неудобной конструкции.
    99% разработчиков тестируют код локально, ничего никуда не "синхронизируя" и не "заливая".

    Железо при этом не имеет значения, а окружение как раз задается докером.
    Правда, говорят что под виндой (и, вроде бы, маком) какие-то до сих пор проблемы с докером, но в целом это совершенный уже мейнстрим.
    Если надо просто поколупаться в небольшом кусочке кода, то я запускаю встроенный сервер.
    Но для рабочих проектов - уже много лет только докер (но разрабатываю я под линуксом).

    Как вариант - можно попробовать Continuous Integration, который весь этот список от пуша до composer update на удалённом будет выполнять автоматом.
    Ответ написан
    6 комментариев
  • Как правильно подходить к возвращаемым типам функциях php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хорошие вопросы.
    Разумеется, увеличивать количество запросов к БД ради красивой типизации - это абсолютно не вариант.

    Как можно увидеть, в приведенной цитате написано не однозначно, а "скорее всего".
    И поэтому надо конечно стараться, чтобы функция возвращала какое-то одно значение, но не делать этого любой ценой. Поэтому getUserDataFromDatabase вполне может возвращать array|false, а getUserIdFromDatabase - int|false, хотя я бы с ней не заморочивался, первой вполне достаточно. А userIsPresentInDb вообще не нужна, вместо неё можно использовать одну их предыдущих.

    Другое дело, что нужного результата можно добиться и другим способом.
    Ведь вполне можно вернуть пустой массив. И таким образом формально соблюсти типизацию.

    return $result ?: []; // дёшево и сердито

    Но это будет всё равно не очень красиво. В одной стороны - да, для проверки, вернула ли функция непустое значение, такой вариант вполне сгодится. Но с другой стороны все равно как-то неаккуратненько. Ведь мы на самом деле ждём не абы какой массив, а вполне определённый, с конкретным набором полей. То есть, если эта функция вернет массив вида [0, 42, 100500], то это будет явно не то, что нам нужно, но при этом типизация и слова поперёк не скажет.

    Если думать от типизации, то функция getUserDataFromDatabase, возвращающая какой-то абстрактный массив - это нонсенс, бессмыслица. Эта функция должна возвращать юзера. Поэтому в идеале надо придумать способ указать, что функция возвращает не абстрактный, а конкретный массив определенного формата. Тем более, что такой способ как раз есть, ведь типизованный массив - это же объект! И для данного случая даже специальный паттерн есть - ValueObject (хотя в случае с пользователем лучше будет все-таки делать полноценный класс, содержащий не только данные, но и методы, например auth(), который сравнивает хэш пароля с введенным).

    Соответственно, в идеале функция должна возвращать объект, представляющий пользователя.

    И уже в этом объекте поле id может либо либо быть нулём, либо иметь какое-то положительное значение. Или даже объект может содержать отдельное свойство, заполнен/не заполнен.

    И вот в этом случае типизация заиграет совсем новыми красками, и будет использоваться на 100%
    function getUserFromDb( int $userId ) : UserObject {
            return $result ? UserObject::fillFromArray($result) : new UserObject();
    };
    $user = getUserFromDb();
    if (!$user->id) {
        // нинашли :'(
    }


    Но опять же, как пишет ниже Сергей delphinpro, зависит от задачи.
    И решив проблему правильной типизации значения, которое функция вернет, если нашла пользователя, можно вернуться к вопросу о том, что возвращать, если функция ничего не нашла. И в этом случае вполне подходящим вариантом будет вернуть null
    function getUserFromDb( int $userId ) : ?UserObject {
        return $result ? UserObject::fillFromArray($result) : null;
    };
    
    if ($user = getUserFromDb()) {
        // нашли :)
    }
    Ответ написан
    6 комментариев
  • Как сделать сделать поиск по строке php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    stripos и strpos работают правильно

    А если вам вдруг кажется, что они работают неправильно, то надо привести пример.
    И тогда вам сразу объяснят, что вы делаете неправильно
    Ответ написан
    4 комментария
  • Есть ли смысл в csrf токене при использовании samesite cookie?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нет, не нужна, но надо помнить, что samesite=laх не защищает от поддельных GET запросов.
    Хотя конечно в первую очередь GET запросы не должны использоваться для изменения состояния сервера
    Хотя вот коллеги поправляют, что ещё зависит от браузера, поддерживает ли он этот стандарт.
    Ответ написан
  • Почему возникает ошибка Call to a member function fetch_all() on null?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я с очень большим трудом могу представить себе код, который может вывести эту ошибку.
    Сам по себе метод query() не возвращает null. При ошибке, с отключенными исключениями, он вернет false, и ошибка будет другая.
    Если режим исключений включен, то я не представляю, как здесь можно поймать исключение, при вызове по цепочке.

    У меня получился только такой говнокод, но он, во-первых, заведомо бессмысленный и сам по себе, а во-вторых, совсем не похож на код, который автор нарисовал в вопросе.
    $result = null;
    try {
        $result = $mysqli->query("SELECT ...");
    } catch(Throwable $ex) {}
    $result->fetch_all(MYSQLI_ASSOC);
    Ответ написан
    Комментировать
  • По какой причине сайт не работает на хостинге?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Путь истинный:
    1. Зайти в панельку своего хостинга, найти там, где лежат лог ошибок
    2. В нем всё написано.
    3. Во всех непонятных ситуациях повторить пп. 1-2

    Добавлять строчку ini_set('display_errors', 1); не следует. На хостинге вывод ошибок должен быть выключен. И даже в качестве временной меры это добавлять бессмысленно - ошибки всегда будут, надо учиться работать с логами.
    Ответ написан
    Комментировать
  • Как преобразовывать заглавную букву в главную и обратно при поиске как в гугле?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Никак не преобразовывать. Все прекрасно ищется и так.
    Ответ написан
    Комментировать
  • Как сократить время до получения первого байта от сервера на хостинге?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    То что вам нужно, называется "профайлинг".
    Его можно делать с помощью разных инструментов, таких как Xdebug, но можно и коряво, вручную расставляя код типа такого
    $microtime = microtime(1);
    // что-то делаем
    $timer['sql'] = microtime(1) - $microtime;
    Потом куда-то выводим этот таймер, чтобы никто не видел.

    Но в принципе тут и без профайлинга можно сказать, что тормозит запрос в БД.
    На шаредах всегда так. Хотя кривые руки при работе с БД тоже скорее всего виноваты.
    Ответ написан
    6 комментариев
  • Форма обратной связи по SMTP работает, вводя только мою почту? Как исправить?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вам же человеческим языком пишут, что нельзя подставлять липу в $mail->setFrom($email);
    Или просто уберите эту строчку, или пишите в нее СВОЮ ПОЧТУ.

    Как вариант, можете перед setFrom добавить addReplyTo()
    Ответ написан
    6 комментариев
  • Как вынести запросы rest api на постоянное соединение?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ тут очень простой - никак.
    Мало того, что вешать все запросы на одно соединение просто глупо, когда БД может обрабатывать их тыщи. И та же нода, если делается по-уму, то использует пул соединений, а не одно.
    Но, главное, РНР так не работает.

    И проблема здесь не в количестве соединений, а в том, кто писал код.
    Если в коде используется только одно соединение за все время работы скрипта (а не открывает новое соединение на каждый запрос, как у всех гениальных скриптописателей), и база данных устроена по уму (не тормозит), то хватит даже самого дохлого хостинга с лимитом в 5 одновременных подключений. Просто потому что любой запрос к рест апи должен работать не дольше 0.01 секунды. И любые проблемы будут появляться только при частоте обращений больше 100 в секунду.

    Соответственно, вместо фантазий про "одно соединение" надо переделывать кривой код и базу данных.
    Ответ написан
    Комментировать
  • Как создать базу данных и связать с PHP и MySQL?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    База данных нинужна
    Достаточно будет
    <?php
    file_put_contents('databaza.txt', json_encode($_POST, JSON_UNESCAPED_UNICODE)."\n", FILE_APPEND);

    ну и чтобы вывести
    foreach(file('databaza.txt') as $loh) {
         echo json_decode($loh, true)['email'], "<br>\n";
    }


    Ну а форму на HTML я думаю Frontend developer (senior+) уж как-нибудь осилит.
    Ответ написан
    2 комментария