Задать вопрос
Ответы пользователя по тегу PHP
  • Как вычислить результат математических операций в строке?

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

    Вагон
    и маленькая тележка
    Ответ написан
  • Можно ли в PHP вкладывать однострочные комментарии // в многострочные /* */?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Куча говорильни из-за примитивного вопроса.
    Какие ещё "внутренние стандарты"? Какой "бизнес"?
    Человек закомментировал кусок кода, увидел внутри комментарий и испугался, решил спросить.
    Ему надо сопли утереть и успокоить, а не развозить турусы на колёсах.
    Ответ написан
    Комментировать
  • Стоит ли использовать файловый сервер в проекте?

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

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

    Почему не сначала интерфейс - просто потому что вы изначально не представляете себе все требуемые методы. Это будет видно только из практики.

    Таким образом вы и задачу решите оптимальным способом (локально), и опыт получите (причём в первую очередь в программировании), и гибкость добавите - если вдруг надо будет перейти на облако (причём не обязательно именно на это) то это будет проще сделать просто написав ещё один адаптер, но не трогая основной код
    Ответ написан
    3 комментария
  • Что входит в отладку скрипта на PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В отладку входит два основных механизма:
    1. Включение полного отображения ошибок (или логирования, если на боевом сервере)
    2. Пошаговая трассировка с контролем состояния переменных (с использованием IDE или вручную через var_dump/die).

    В вашем случае, очевидно что не был выполнен пункт №1. Какой бы ни была причина проблем, РНР всегда выдаст ошибку. Так что в вашем случае надо было просто убедиться, что error_reporting=E_ALL, а display_errpos=1

    А вот нижеследующее утверждение не имеет смысла
    PHP данную ошибку не показывал, т.к. не использовалась функция проверки записи в директорию is_writable().

    РНР не нужны никакие функции, чтобы сообщить об ошибке. А is_writable() обычно используется как раз наоборот, чтобы подавить ошибку и дальше работать как ни в чём не бывало. Ну или в лучшем случае выбросить какую-нибудь бессмысленную ошибку типа "Не могу записать в файл", не говорящую ничего о реальной причине проблемы.
    Ответ написан
    4 комментария
  • Можно ли писать функции в текст?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Извратиться можно, но это будет именно извращение.
    Тем более что всё равно кроме функций понадобятся и управляющие конструкции - if, foreach.
    И решение давно придумано. РНР умеет встраиваться в HTML. Поэтому вместо того, чтобы писать разрозненные куски HTML в переменные, весь HTML пишется в один php файл, в котором делаются вставки на РНР. после того, как РНР выполнил всю бизнес-логику, пишется одна строчка, include 'template.php'; и дальше выводится весь HTML. Грубый пример такого файла
    <?php include 'top.php'; ?>
    <h2><?=$pagetitle?></h2>
    <ul>
    <?php foreach($links as $row): ?>
      <li>
        <a href="<?= htmlspecialchars($row['link']) ?>">
          <?= htmlspecialchars($row['name'])?>
        </a>
      </li>
    <?php endforeach ?>
    <ul>
    <?php include 'bottom.php'; ?>


    Ну и после такого колупания разработчик быстро приходит к идее использовать специпализированные шаблонные движки, такие как Twig. Но поскольку новичкам сложно осваивать столько нового за раз, лучше двигаться постепенно
    Ответ написан
    24 комментария
  • Подключние к базе данных из класса - насколько правильно?

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

    и уже неправильное

    Учим основы:
    - на локальном сервере это вот try catch echo является бессмысленным: если убрать всю эту нелепую копипасту, РНР и сам выведет то же самое.
    - на боевом сервере этот код является вредным: внутренние ошибки РНР мы никогда не светим наружу. Пользователь их не поймёт, а для хакера они бесценны.
    Поэтому убираем бессмысленное try catch и оставляем только соединение
    $sql_connect = new PDO("mysql:host=". DB_HOST .";dbname=". DB_NAME. ";charset=utf8mb4", DB_USER, DB_PASS, $pdo_options);

    Опять же убрав из него нелепые кавычечьки.

    насколько правильный такой подход

    Этот подход практически идеальный

    Можно изменить подход так, что бы не использовать конструктор

    Можно, но не нужно.
    Сейчас всё чётко видно, откуда берётся соединение с БД, и где оно нужно. Одна переменная в конструкторе - это не то место, где надо лениться и изобретать способы её не писать. В будущем, когда освоите автоматический вызов классов - тогда оно будет подставляться само. Но всё равно через конструктор.
    Ответ написан
  • Требуется реальный пример как исправить ошибку с Warning: count(): Parameter must be an array or an object that implements Countable in ....?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    if (is_countable($this->_items) && count($this->_items))

    ну уж в таком-то варианте должно сработать
    Ответ написан
  • Где у меня ошибка при добавлении своего приложения в HestiaCP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    После долгих уговоров вы наконец-то смогли дать хоть какое-то описание проблемы, "500 даёт".
    Теперь хотя бы понятно, что вы пытаетесь сделать, и что видите в итоге.

    Вам надо найти, где у этой HestiaCP лог ошибок, и прочитать в нём текст ошибки.
    И на будущее освоить эту нехитрую премудрость - 500 ошибка в браузере означает, что в логе ошибок веб-сервера есть подробный текст с описанием ошибки. Дальше этот текст можно пытаться понять самому, можно скормить гуглю или ИИ, можно задать про него вопрос на том форуме, который имеет отношение к ошибке. Подсказка: здесь не форум поддержки HestiaCP и "кволтона".
    Ответ написан
  • После переезда на новый хостинг перестал работать сайт?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В чём проблема, вам РНР говорит человеческим голосом: ошибка синтаксиса. У вас лишняя } в 114 строке.
    Надо смотреть файл целиком. Причём не тот, в котором скобка на 115 строке, а тот, в котором на 114.
    Проверяйте файл.

    А вся эта лирика - версия РНР, хостинг, "файл не менялся" не имеет к проблеме никакого отношения.
    Ответ написан
    4 комментария
  • Чем собирать статистику запросов от клиентов на сервере?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    > 100-300 за сутки для каждого. логи сервера не подходят для этого.

    довольно забавное заблуждение.
    Редис вам понадобится при нагрузках 100-300 в секунду. Для всего, что меньше, идеально подойдут текстовые логи. А вы заодно, освоите один из самых базовых навыков для работы с сервером.

    Логи пишете в файл. чтобы получить лог по определенному name пишете в консоли
    grep name log.txt
    Ну или при желании читаете в пхп и выводите в красивой табличке
    Ну или совсем лень, то можно писать в БД и выбирать запросами.
    Ответ написан
    Комментировать
  • Как в выборке sql обратиться к предыдущей записи?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. Перед отправкой формы нажимаете F12
    2. В открывшихся инструментах разработчика выбираете вкладку Сеть
    3. Отправляете форму
    4. Во вкладке Сеть появляется новая строчка. Нажимаете на неё и там появляется своя панелька на которой надо выбрать вкладку Ответ
    5. Нажимаем на эту вкладку и смотрим, что приехало с сервера. Если самому непонятно, то постим сюда

    Если там не будет ничего полезного, то надо смотреть логи сервера. Где-то в ISPManager-е должен быть раздел с логами, там нужен лог ошибок.
    Ответ написан
    2 комментария
  • Можно ли настроить запросы к php через вебсокет и http одновременно?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Разумеется можно. Никаких нюансов в одновременной работе нет, поскольку тут нет никакой "одновременности". php-fpm и websocket - это два разных сервиса, которые могут располагаться на одном и том же сервере или на разных, но в любом случае никак не пересекаются. В добавление к текущему веб-серверу вы просто запускаете вебсокет сервер и посылаете на него вебсокет запросы из браузера.

    Ну то есть вам всего лишь надо осознать, что никакой одновременности нет, а дальше просто поставить вебсокет сервер, например workerman, и написать код, который по запросу будет соединяться с БД, получать нужную инфу и отправлять клиенту.

    1. Да.
    2. Как говорилось выше - можно. Любой сервер в сети по определению обеспечивает работу множества сервисов, количество которых ограничено только количеством свободных портов. Можно поставить два веб-сервера и пять вебсокет серверов.
    3. Нет, разумеется. unix сокет это как раз внутренняя кухня сервера, но мы же говорим о сетевом взаимодействии. А tcp взаимодействие nginx и php-fpm тут вообще не при чём.
    Ответ написан
    8 комментариев
  • PHP. Deprecated: trim(): Passing null to parameter #1 ($string) of type string is deprecated in?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В РНР разбираться не обязательно, надо минимально разбираться в поддержке софта.
    Варианты, по степени убывания идеальности
    1. Обновить версию Джюмлы
    2. В настройках пхп отключить ошибки E_DEPRECATED
    3. Залезть с грязными ногами в файл /var/www/u2340392/data/www/test.kaikova.ru/modules/mod_bt_contentslider/tmpl/default.php и на 26 строке при вызове функции trim() дописать ?? '' после имени переменной. Т.е
    -trim($var);
    +trim($var ?? '');
    Ответ написан
    Комментировать
  • Как называется такая вложенность в php?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Когда пишет unexpected '$sql' (T_VARIABLE) это значит, что проблема в конце предыдущего выражения.
    Поднимаем глаза, смотрим на конец предыдущего выражения, и видим, что с ним не так.
    Ответ написан
    Комментировать
  • Помощь в PHP проверка данных из файла только выбранные значения?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас файл создан под Уиндоуз, в которой в качестве разделителя строк используется последовательность \r\n
    Разбивая по \n, вы в конце каждой строки оставляете висеть символ \r, и в итоге при сравнении совпадает только последний элемент файла, после которого нет перевода строки

    Для чтения файлов в РНР есть специальная функция. Которая понимает любые переводы строк, и умеет их автоматически удалять.
    $array = file(JPATH_SITE.'/list.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    И всё сразу начнёт находиться.
    Ответ написан
    Комментировать
  • Как в PHP найти строку, которая содержит или не содержит символ?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "содержит или не содержит символ" (а точнее - предыдущее выражение) в регулярных выражениях обозначается знаком вопроса. Шаблон \. ?ru найдет как site.ru, так и site. ru
    Ответ написан
    Комментировать
  • Как удалить весь текст кроме ссылок?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос "как обратиться через аякс к свойству класса пхпе" является заведомо бессмысленным. JS не работает со свойствами классов в РНР.
    Поэтому в решении таких проблем очень помогает логика.
    Если отставить в сторону "свойства", то мы получим довольно простую формулировку вопроса: "почему синхронный и асинхронный запрос к одному и тому же скрипту возвращают разные данные?". И здесь уже, рассуждая логически, можно прийти к очевидному ответу: эти запросы обращаются к разным бэкендам. То есть, чтобы решить проблему, надо либо обновить код на том сервере, к которому обращается fetch, либо делать запрос на тот сервер, который возвращает правильные данные.

    Это если исходить из предоставленных данных. Вполне вероятно, что автор запутался где-то ещё. Но тут уже ему придётся разбираться самостоятельно. Но опять же, рассуждая логически, а не "Почему не получается обратиться к свойству php через асинхронный запрос?".
    Ответ написан
    9 комментариев