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

    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))

    ну уж в таком-то варианте должно сработать
    Ответ написан
  • Почему один регэксп работает, а второй нет?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    1. Выясняем, какой у нас движок. POSIX ERE
    2. Идём в спецификацию
    3. Читаем: When the bracket expression appears within an ERE, the special characters '.', '(', '*', '+', '?', '{', '|', '$', '[', and '\\' shall lose their special meaning within the bracket expression;

    То есть \-\ читается "от \ до \" и вместо дефиса мы ищем слеш.

    Вывод: Все эти палочки не нужны, достаточно написать echo Test.1-2_3 | grep -E -e ^[A-Za-z0-9_.-]+$
    Ответ написан
    3 комментария
  • Как исправить ошибку "No connection could be made because the target machine actively refused it"?

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

    Вот я беру вашу ошибку, "No connection could be made because the target machine actively refused it" копирую в гуголь (если не понимаю по-английски, то добавляю слово "ошибка"), и оно мне человеческим голосом говорит,
    Ошибка «No connection could be made because the target machine actively refused it» означает, что сервер, к которому вы пытаетесь подключиться, либо не запущен, либо недоступен, либо не слушает соединение на указанном порту. Чаще всего эта проблема связана с тем, что целевой сервер не запущен или неправильно настроен, но также может указывать на переполненный резерв сервера или проблемы с брандмауэром.

    Что конкретно вам непонятно в этом объяснении?

    Добавляю к запросу слово openserver и получаю
    Ошибка «No connection could be made because the target machine actively refused it» при работе с Open Server означает, что сервер не запущен или недоступен, или же неправильно указан порт. Чтобы исправить это, нужно запустить Open Server из папки установки и убедиться, что серверные компоненты работают, или проверить правильность адреса и порта в настройках приложения, которое пытается подключиться.

    Что конкретно непонятно в этой инструкции?

    (а потом поколение снежинок удивляется, почему к ним такое отношение. сейчас уже даже по ссылкам ходить не надо, умная железка уж и разжёвывает, и в рот кладёт - а они всё "моя твоя не понимаю"!)
    Ответ написан
    1 комментарий
  • Где у меня ошибка при добавлении своего приложения в HestiaCP?

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

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

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

    Для этого достаточно виртуалки на рабочем компе. Ну или совершенно убитого десктопа или подержанного ноута.
    А ещё лучше - в плане "практиковаться в изучении linux" - поставить его на рабочий комп.

    Откуда эти завиральные идеи про выделенный комп, да ещё и с каким-то специальным серверным железом, про 8 ядер! - совершенно непонятно. Всё перечисленное ещё 15-20 лет назад работало на 1-2 ядерных серверах в продакшене. А не дома, с нулевой загрузкой.
    Ответ написан
    Комментировать
  • После переезда на новый хостинг перестал работать сайт?

    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
    Потомок старинного рода Ипатьевых-Колотитьевых
    Смысл проблемы непонятен.
    Даже если "путь далёк", то чтобы "сменить директорию в терминале" всё равно придётся набрать его весь. Ну так тогда можно и сразу и набрать его. В том смысле что нет разницы, набирать ли "длинный путь" в cd или в mv

    Но если отвечать на вопрос буквально, то
    в исходной папке пишем pwd
    копируем вывод в буфер
    переходим в другую папку
    пишем mv пробел
    вставляем скопированный путь
    добавляем к нему имя файла
    пишем пробел точка
    нажимаем ентер

    Ну и напомню, что при построении "длинных путей в терминале" очень помогает автодополнение по кнопке TAB
    Ответ написан
    3 комментария
  • Как правильно вернуть данные из рекурсивной функции?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Здесь не нужна рекурсия. Чтобы дойти до корня, достаточно использовать примитивный цикл.
    public function getRootCategory($id) {
        do {
            $data = Category::find()
                    ->select(['name', 'parent_id'])
                    ->where(['id', $id]);
                    ->first();
            $id = $data['parent_id'];
        } while ($id > 0);
        return $data['name'];
    }
    Ответ написан
    5 комментариев
  • Не приходят сообщения с контактной формы, Извините, данные не были переданы?

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

    Если там не будет ничего полезного, то надо смотреть логи сервера. Где-то в ISPManager-е должен быть раздел с логами, там нужен лог ошибок.
    Ответ написан
    2 комментария
  • Видит ли провайдер то, что я скачал оффлайн страницу сайта в Google chrome на телефоне?

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как правильно написал Сергей Горностаев, всё зависит от задачи.
    Например, у вас маркетплейс, и в нем микросервис отзывов о товаре. Это совершенно некритичный функционал, и поэтому никакие очереди тут разумеется не нужны.
    Фактически, фронт может даже напрямую к нему обращаться, и выводить заглушку, если отзывы недоступны.
    Ну или внутри, при формировании страницы товара, код может дёрнуть микросервис и поставить заглушку, если тот недоступен. Дергать опять же можно по-разному, но для универсальности можно делать тот же REST, причём во внутреннем контуре даже без SSL (и его накладных расходов).

    Брокеры же нужны там, где важна целостность. Например оповещения, по почте или СМС. Закинул оповещение в очередь, и дальше оно всё равно уйдет пользователю даже если конкретно в этот момент сервис отправки недоступен.
    Ответ написан
    Комментировать
  • Точь в точь ли маппятся поля json-сущности на поля в таблицах базы данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я просто оставлю это здесь: отображение объектов на реляционную БД - это Вьетнамская война компьютерной науки
    Ответ написан
    2 комментария