• Как заменить пробелы на дефис и обратно?

    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');
    Ответ написан
  • Как лучше хранить данные при пошаговой регистрации?

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если поисковый запрос начинается с символа %, то индекс толком не используется.
    Вам нужен либо fulltext index и соответствующий запрос, либо сторонний поисковый движок типа эластика или мантикоры

    Или хотя бы перенести сайт с того утюга, на котором он хостится сейчас, на нормальный сервер. Потому что 10 секунд на перебор трех сотен тысяч строк - это запредельные какие-то цифры.
    Ответ написан
    Комментировать
  • Не работает return PHP. Ничего не выводит на экран, что делать?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну так в этом коде нет ни одного оператора вывода.
    Что он, по вашему, должен выводить?

    ЗЫ:
    echo implode(",", sqr(-1, -2, 15)) ?: "Действительных корней нет";
    Ответ написан
    Комментировать
  • Куда девается последний символ соли при генерации хэша функцией crypt()?

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

    Blowfish использует в качестве соли не буквально те самые буквы и цифры, которые вы пишете, а воспринимает их как поток бит, закодированный в свой вариант base64. При этом с помощью 22 символов можно закодировать 132 бита ( 22 символа х 8 бит х 3/4 (кодирование в base64) = 132), из которых реально используются только 128. Соответственно, из последнего символа берется только половина бит.

    Это в частности означает, что для 16 разных солей хэши будут одинаковые:

    thisisahardcodedsaltaO
    thisisahardcodedsaltaP
    thisisahardcodedsaltaQ
    thisisahardcodedsaltaR
    thisisahardcodedsaltaS
    thisisahardcodedsaltaT
    thisisahardcodedsaltaU
    thisisahardcodedsaltaV
    thisisahardcodedsaltaW
    thisisahardcodedsaltaX
    thisisahardcodedsaltaY
    thisisahardcodedsaltaZ
    thisisahardcodedsaltaa
    thisisahardcodedsaltab
    thisisahardcodedsaltac
    thisisahardcodedsaltad


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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для не слишком принципиальных товарищей есть элементарное решение
    update tasks set uuid = ? where done=0 limit 1;
    // обрабатываем
    update tasks set done=1 where  uuid = ?;


    А принципиальные должны страдать :)
    Ответ написан
  • Фильтрация по строковому значению?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ну и просто для комплекта, решение с использованием функций для работы с массивами
    $permission = array_values(array_intersect($a, array_column($b, 'permission')))[0] ?? null;

    array_column() сделает из $b нормальный массив, без этих бессмысленных "permission"
    array_intersect собственно вернет пересечение двух массивов, все значения из $a, которые есть в $b.
    теперь нам нужно самое первое значение из этого массива. Один из вариантов - это array_values()[0]
    если нет совпадений, то при обращении к нулевому элементу будет ошибка, для её подавления используем сокращенный оператор проверки на существование, и присваиваем значение null
    Ответ написан
    Комментировать
  • Где посмотреть и поучиться правильной постройки баз данных?

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

    И вообще не надо называть "нереляционные хранилища" базами данных. Это специализированные движки - кэширующие(редис, мемкеш), поисковые(мантикора, эластик), аналитические (кликхаус) - которые используются в дополнение к базе данных. или совсем уж какие-то специализированные решения для визуализации или логирования- графана, сентри, кибана, локи - тысячи их. Но все это вещи факультативные, которые понадобятся только на определенном этапе развития проекта (или не понадобятся вовсе).

    А с базой данных и её построением придется столкнуться с самого начала. И вот про это есть великолепная книга Святослава Куликова Реляционные базы данных в примерах. Она очень четко рассказывает именно про постройку базы данных.
    Ответ написан
    2 комментария
  • Как хранить товары с различными опциями в БД?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В стародавние времена это действительно было проблемой.

    И обычно использовался п.2, который называется EAV, и который в нормальном виде (таблица всех атрибутов, таблица всех значений, и таблица-связка товар-атрибут-значение), хотя и является истинно реляционным решением, служил причиной кровавых слез не одного поколения программистов.

    Эта ситуация послужила одной из причин появления хранилищ для неструктурированных данных, таких как Монго, которые входят в очень широкую категорию NoSQL.
    Но сами по себе "документо-ориентированные базы данных" в качестве основного хранилища - это ад и проклятие, хуже EAV. Если EAV делает адом только работу с атрибутами товаров, то Монга делает проклятием работу со всей БД целиком. Забудьте об этой идее.

    Тем более что в последние годы появилось вполне достойное решение: во всех классических СУБД появилась поддержка JSON полей.
    То есть таблица товаров будет самая обычная, в которой есть общие поля типа цены, названия и прочее. А свойства хранятся в JSON поле. Беря, таким образом, лучшее из двух миров.

    На начальном этапе вы даже сможете делать поиск по атрибутам, используя нативные JSON функции. Но в дальнейшем поиск товаров, а так же фильтрацию по атрибутам на странице категории (так называемый "фасетный поиск") надо будет возложить на специальный поисковый движок (который тоже входит в широкую категорию "NoSQL", хотя ничего общего с документными БД не имеет, и БД, собственно, не является), такой как Эластик или Мантикора.

    Главное при этом хранить (либо в коде, либо в таблице категорий) эталонные структуры таких json полей, которые, во-первых, использовать как справочники для заполнения товаров (тупо чтобы помнить, что частота процессора называется freq, а не frequency), и чтобы собственно делать фасетные фильтры.
    Ответ написан
    5 комментариев
  • Почему срабатывает условие, хотя, по идее, не должно?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо учиться отлаживать свой код самостоятельно.
    Ну то есть вы уже начали, это очень хорошо.
    Но выводить просто 'find data' не очень информативно. Вам надо понять, почему оно выводится.
    Добавьте к var_dump ('find data'); результат strpos($value,'г ') и посмотрите на результат. причина сразу станет ясна.

    И соответственно, код надо будет доработать, чтобы получить желаемый результат.
    Кстати, если у вас 8 версия РНР, то в нем есть готовая функция для такой проверки, вместо strpos
    Ответ написан
    Комментировать
  • Как получить массив в массиве, в одном запросе?

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

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

    1)Нужно будет выполнять много запросов к БД

    На всех остальных сайтах делается один-два запроса в час.

    2)Важная быстрая скорость работы нашего сайта

    Это очень редкое требование, обычно сайту достаточно возвращать ответ в течение получаса

    3)Безопасность от всяческих XSS и SQL атак.

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