• Как получить ключ 1-го уровня по значению из массива 2-го уровня?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Серфить примеры не надо.
    Надо запомнить одно очень простое правило: все операции над массивами производятся в цикле.
    Это очень просто запомнить. И даже понять.
    Массив - это набор данных.
    Чтобы что-то в найти в этом наборе - его надо перебрать.
    Вот и перебирайте. Как только нашли нужное значение - вот ваш ученик.
    Вам знаком оператор foreach?
    Ответ написан
    Комментировать
  • Почему в таблицу может не вставляться текст на узбекском языке?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос с подвохом.
    Я сейчас сообразил, что узбекский - это не китайский же. Либо латиница, либо кирилица.
    То есть проблема скорее всего не в кодировке.
    А, как выяснилось в комментариях - тупо в неправильном выполнении запроса, и инъекциях.
    то есть переменные надо не напрямую пихать в запрос, а через специальные маркеры, как написано здесь https://habr.com/ru/articles/662523/

    Если же говорить про кодировки, то
    у поля (или таблицы) должна стоять не "одинаковая" кодировка, а utf8mb4
    в РНР при соединении должна устанавливаться кодировка utf8mb4
    в заголовках веб-сервер должен отдавать кодировку utf-8
    если текст пишется прямо в РНР коде, то этот код тоже должен быть в кодировке utf-8
    Ответ написан
    2 комментария
  • Как реализовать поиск по нескольким полям?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если вычистить из кода неверные кавычки и бессмысленные телодвижения, и переделать на "использование стандартных подготовленных запросов" (с) @Rsa97
    $data = [
        "%{$_POST['surname']}%",
        "%{$_POST['name']}%", 
        "%{$_POST['fathername']}%",
        "%{$_POST['phone']}%",
    ];
    $query = "SELECT * FROM `people` 
              WHERE `surname` LIKE ? OR `name` LIKE ? OR `fathername` LIKE ? OR `phone` LIKE ?";
    $result = $conn->execute_query($query, $data);


    Если используется устаревшая версия РНР, то либо добавить в неё execute_query руками, либо написать по-старинке,
    $stmt = $conn->prepare($query);
    $stmt->bind_param("ssss", ...$data);
    $stmt->execute();
    $result = $stmt->get_result();


    Одно из преимуществ такого подхода в том, что мы как раз не путаемся в кавычках. Одинарные в запросе становятся не нужны
    Ответ написан
  • Как сделать автоматический деплой веб-сервиса на поддомен?

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

    При том что задача в общем случае решается элементарно. Добавлением еще одной секции в плейбук того же Ansible. Что даст автору ту самую заветную "одну кнопку". А точнее две - развернуть новый инстанс и обновить все существующие.

    А если еще внимательнее посмотреть на проблему, то возникает закономерный вопрос - а зачем автору вообще миллион виртуальных хостов, если речь идет о банальных поддоменах? Которые прекрасно реализуются в рамках единственного виртуального хоста. То есть можно либо добавить поддержку субдомена в текущее приложение, либо, на худой конец, сделать multi-tenant приложение, где у каждого поддомена будет своя БД.
    При этом вся кнопка будет заключаться в добавлении имени субдомена в базу данных
    Ответ написан
    3 комментария
  • Composer как сгенерировать composer.json с заранее выбранными пакетами?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Cгенерировать composer.json с уже установленными в нем зависимостями" невозможно.
    Потому что файл composer.json не устанавливает никакие зависимости. Это делает сам композер, соответствующей командой.

    Если вам нужен composer.json с прописанными в нем пакетами, то composer.json собственно и предназначен для того, чтобы прописывать в нем зависимости. Так работают 100% приложений, использующих композер - в их дистрибутивах лежит файл composer.json, в котором прописаны зависимости. Если, как вы говорите. во всех проектах используются одни и те же зависимости, вы можете взять файл от любого проекта и добавить его в репозиторий.
    Ответ написан
    1 комментарий
  • Как архивировать все кроме одной директории?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если невероятным интеллектуальным усилием правильно атрибутировать свою проблему, и сообразить, что она не имеет ни малейшего отношения к РНР, то её вполне можно задать мировому разуму: tar исключить директорию
    Ответ написан
    Комментировать
  • Есть разница: передам я в метод класса большой массив или предварительно сделаю из него выборку и передам только его небольшой фрагмент?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Массивы в РНР передаются методом copy-on-write.
    Это означает, что потребление памяти вырастет только в том случае, если массив внутри функции будет изменён.
    Соответственно, если переданный массив будет изменяться, то лучше вырезать.
    Если будет только читаться, то проще передать целиком.
    Ответ написан
    2 комментария
  • Можно ли указывать не уникальные ключи в HTTP Query String?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Учитывая, что тот же РНР прекрасно обрабатывает запросы вида ?foo[]=bar&foo[]=bar2, то уникальность явно не является обязательной.
    А то что он видит как один (только не первый, а последний), то это как раз совершенно очевидно и банально.
    Если вы в коде напишете
    $array['foo'] = 'bar';
    $array['foo'] = 'bar2';
    То разумеется в $array останется только второй вариант, который тупо перезатрет первый. И Оппач тут совершенно не при чем.

    Но вам никто не мешает написать свой парсер QUERY_STRING и брать из него неуникальные значения.
    Ответ написан
    2 комментария
  • Что делать, если код показывает 500 ошибку (в частности: Okay-CMS)?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это просто невероятно, сколько мусора может произвести одна голова за единицу времени из-за незнания самых базовых принципов.
    Если сервер показывает 500 ошибку, то надо найти и прочитать конкретное сообщение об ошибке, а не заниматься гаданием на кофейной гуще.

    Вот же у вас написано:
    if ($config->get('debug_mode') == true) {
            print $message;

    Значит надо найти конфиг и поменять значение этого параметра.

    Если не поможет, то хотя бы тупо временно добавить echo $e; под } catch (\Exception $e) {
    Оно не будет рассусоливать про конфиги, композеры, протоколы и прочие умные идеи, а просто напишет какая конкретно произошла ошибка, чтобы её можно было исправить.
    Ответ написан
    1 комментарий
  • Как распознать что сайт пытаются взломать?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Код тут действительно неправильный, причем по очень многим параметрам. Много бессмысленных телодвижений, инъекции, плюс условие можно записать оптимальнее. Так что помимо исправления конкретной опечатки от Rsa97, надо править этот код целиком
    $sql = "SELECT * FROM blocks WHERE user_id = ?";
    // выполняем запрос без инъекций. если версия РНР не новая, надо будет дописать эту функцию самому
    $result = $conn->execute_query($sql, [$id]);
    // получаем запрошенную строку, без всяких num_rows и foreach
    $row = $result->fetch_assoc();
    // получаем $block_level, даже если в $row пусто
    $block_level = $row["type"] ?? 0;
    // match - новое выражение в РНР начиная с 8.0 версии. в сто раз аккуратнее чем забор из elseif
    $block_text_type = match ($block_level) {
        1 => "Незначительная блокировка",
        2 => "Частичная блокировка",
        3 => "Полная блокировка",
        default => "Нет блокировок",
    };
    Ответ написан
    2 комментария
  • Как заменить пробелы на дефис и обратно?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Открыть в редакторе главную страницу, поставить курсор после слова footer, дописать -home и сохранить страницу?
    Ответ написан
    8 комментариев
  • Производительность решения SQL like vs join?

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

    А свойства хранить либо в EAV, который у вас второй вариант, либо в JSON поле.
    И искать по ним отдельным не вот этим вот, а отдельным сервисом типа Эластика.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Собираем логи Symfony в Elasticsearch с помощью Filebeat и Monolog
    Ответ написан
    Комментировать
  • Как объединись значения из двух массивов в один?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если данные нужны для нескольких заказов, то вариант @Rsa97
    Если только одного заказа, то проще двумя запросами, результат второго просто подцепить в виде отдельного элемента к массиву, полученному из первого
    Ответ написан
    Комментировать
  • Как хранить записанные маршруты?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Большие объемы данных хранят точно так же, как и маленькие.
    Любые отступления от этого правила должны быть продиктованы очень серьезными причинами. поскольку никаких причин вы не привели, то и ответ будет стандартный:
    Делаете таблицу вида
    route_id, lng,lat,speed,date
    и пишете в нее свои точки, используя множественный insert
    ошибка mysql лечится увеличением max_allowed_packet
    Ответ написан
  • Не работает php код?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если речь о том, чтобы проверять по базе не по одному файлу, а собирать пачками по сто (лучше по тысяче), то задача имеет смысл.
    Прерывать тупо по счетчику: накопилась тыща - провалились в if, внутри которого всю пачку по базе пробили одним запросом, лишние удалили, массив обнулили, дальше пошли.

    Ну или по каталогам бить. В каждом каталоге сначала читать только каталоги и проваливаться в них, а потом считать все файлы, обработать их, и вынырнуть на уровень выше.
    Ответ написан
    Комментировать
  • Как правильно расставить скобки при ошибке установки плагина?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Тут надо не скобочьки расставлять, а весь это адов говнокод удалять. И оставить только
    $remote_addr = getenv('REMOTE_ADDR');
    Ответ написан