Задать вопрос
  • Почему SQL-запрос на MacOS (M2) исполняется медленнее, чем на shared-хостинге?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В чём может быть причина?

    В чём угодно. Вопрос из серии "Почему Шумахер на жигулях обгоняет меня на феррари?"
    Потому что железо - не главное, надо ещё уметь им пользоваться.

    Учитывая, что вопрос явно праздный, и никакой осмысленной диагностической информации не приведено (кроме запроса, который совершенно бесполезен), то и ответа на него ждать не стоит.
    Ответ написан
    2 комментария
  • Как объединить в один код 2 строчки $array[$key]?

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

    if (первая форма) {
        $array[$key]['ColorGroup'] = join(",", $row['ColorGroup']);
    } else {
        $array[$key] = array_merge(array("Nom1" => 0, "Abs" => 0, "Nom3" => 0, "MarkFirst" => 0, "MarkSecond" => 0, "MarkThird" => 0, "RingWcf" => 0, "RingWcf2" => 0, "RingMono" => 0), $row);
    }


    Какое условие сделать - мы не знаем, это вам решать. Например, в форме есть какое-то поле, которого нет в другом.

    И это будет работать только если отличие действительно только в этой строчке. В чём я сильно сомневаюсь
    Ответ написан
    Комментировать
  • Почему после импорта базы из .sql файлов таблицу с 13Гб раздуло до 55Гб?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Судя по всему, у нас тут опять дети, заблудившиеся в лесу, АКА "проблема XY".

    Реальной проблемой является "запросы в БД подвисают". При этом посмотрев на какую-то непонятную циферку, дети приходят к закономерному выводу, что проблема в "раздутой базе". И начинают искать решение не для реальной проблемы, а для воображаемой.

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

    В первую очередь смотрим значение innodb_buffer_pool_size, и если там стандартные птичкины слёзки в 128 мегабайт, то восхищаемся мощью своего сервера, который вообще без доступа к памяти нормально вывозит, только иногда "подвисая", и ставим innodb_buffer_pool_size равное 80% от памяти доступной на сервере.
    Ответ написан
  • Как вычислить результат математических операций в строке?

    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 комментария