Задать вопрос
Ответы пользователя по тегу PHP
  • Можно ли как-то использовать абсолютный путь до папки/файла в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не только можно, но и нужно.
    Всегда надо использовать только абсолютные пути.
    Ответ написан
    Комментировать
  • Как сделать поиск данных из mysql которые сохраненны в формате unicode?

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

    Но для этого надо сначала научиться пользоваться базой данных, потом разработать нормальную структуру, и хранить данные как положено - каждое поле отдельно, а не всё одной в помойной куче.
    Ответ написан
  • В чем может быть проблема при подключении к API через PHP?

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

    Для отладки полезно вывести содержимое специальной переменной, которая содержит заголовки ответа, var_dump($http_response_header);

    Ну и на всякий случай, надо конкретнее описывать свои проблемы. Что означают ваши "ничего не работает" и "не удается получить" никто не знает. Надо четко писать, что вы видите.
    Ответ написан
  • Как реализовать диалоговый бот на PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    $data = json_decode(file_get_contents('php://input'), TRUE);

    Вот тут в $data у вас не только сообщение, но и много другой информации. В частности, айди юзера.
    я думаю, что этот айди можно использовать в качестве идентификатора сессии, передавая в session_id() перед вызовом session_start()
    Во всяком случае можно попробовать
    если сессия не взлетит, то эмулировать её на любом другом хранилище, используя идентификатор юзера чтобы сохранять состояние бота для него

    Попробовал, сессия через юзер айди не работает потому что идентификатор телеграма не подходит под стандарт идентификатора сессии.
    Если эмулировать (просто добив до нужной длины) то сессия начинает работать.
    Ответ написан
    Комментировать
  • Как записать данные в переменную PHP и вызывать их в любом участке кода?

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

    Ответ на этот вопрос содержится в нем самом.
    Надо записать в переменную, а потом вызвать её в любом участке кода.
    При этом если вы сами же не записали данные в переменную, то вызывать её потом бесполезно.

    в одном из блоков if записываю данные в переменную. Проблема в том, что когда я пытаюсь вызвать его в другом блоке elseif - она выводиться пустая


    А вот этот вопрос говорит о том, что вы, видимо, даже не понимаете, как работают конструкции if и else. Что сам принцип этих конструкций состоит в том, что если выполнилась одна ветка, то по определению другие выполняться не будут.

    Поскольку вы не удосужились написать, какая именно переменная вызывает проблему, я предполагаю, что речь о $channelUsername. Учитывая, что она передается по ссылке, то дело не в том, что она "перезаписывается". А в том, что её попросту неоткуда взять, если в $message лежит число
    Ответ написан
    Комментировать
  • Почему форма заявки не работает?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Скорее всего потому, что выполняется на домашнем уютненьком компике под виндоус.
    И надо погуглить "PHP отправить емейл под виндоус"

    Но в данном случае надо прочитать, что вам пишут, и дальше гуглить Не работает POST запрос 405 Not Allowed

    Скорее всего, попросту не установлен РНР.
    Ответ написан
    Комментировать
  • Как сохранить функцию 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);
    Ответ написан
    Комментировать