Ответы пользователя по тегу PHP
  • Как исправить ошибки при переезде с PHP5 на PHP7?

    @Akela_wolf
    Extreme Programmer
    Ну так в массиве нет индекса 'set'
    Корректно будет так:
    if (isset($_GET['set']) && $_GET['set'] == 'search') ...
    Ответ написан
  • Как получить родительскую категорию у подкатегории?

    @Akela_wolf
    Extreme Programmer
    Если у вас неограниченная вложенность, то только через рекурсивный запрос. MySQL 8 научился их делать. Это позволит вам рекурсивно собрать в одном из полей запроса данные из зависимых таблиц. Вот документация

    Вот пример:
    CREATE TABLE cat(
      id INT NOT NULL PRIMARY KEY,
      title VARCHAR(100) NOT NULL,
      parent_id INT NULL
    );
    
    INSERT INTO cat VALUE (1, 'Root1', NULL), (2, 'Root2', NULL), (3, 'Child1', 1),
    (4, 'Child2', 3), (5, 'Child3', 2);
    
    WITH RECURSIVE rcat(id, title, path) AS (
      SELECT cat.id, cat.title, CAST(cat.id AS CHAR(200)) FROM cat WHERE parent_id IS NULL
      UNION ALL
      SELECT cat.id, cat.title, CONCAT(rcat.path, ',', cat.id) FROM cat JOIN rcat ON cat.parent_id=rcat.id
    )
    SELECT * FROM rcat WHERE id=4;


    Пример
    Ответ написан
    7 комментариев
  • Как получить значение определенного ключа многомерного массива?

    @Akela_wolf
    Extreme Programmer
    $func = function(array $arr): string {
      return $arr['driver_profile']['id']
    }
    
    $temp = array_map($func, $input['driver_profiles'])
    Ответ написан
    6 комментариев
  • Как лучше вынести логику в общий класс?

    @Akela_wolf
    Extreme Programmer
    1. Сначала нужно обдумать что вы с этого будете иметь. Вы сможете переиспользовать эту логику? Вы сможете покрыть логику тестами? Иначе говоря, сформулировать цель такого рефакторинга.
    2. Собственно цель и определит какую логику вы будете выделять. Если задача переиспользовать - значит есть какой-то второй сценарий использования. Смотрите на него, выделяете общие с первым элементы. Выделяете различающиеся элементы - думаете как правильно оформить общие и различные элементы в коде (наследование, композиция, декораторы и т.п. приемы). Собственно на этом этапе у вас появляется план рефакторинга. Если же цель - облегчить тестирование, то начинаете с обдумывания теста. И рассматриваете тест как второй сценарий использования.
    3. Затем остается этот план рефакторинга претворить в жизнь.
    Ответ написан
    Комментировать
  • Как получить четвертый элемент ассоциативного массива?

    @Akela_wolf
    Extreme Programmer
    Строго говоря никак, поскольку элементы в ассоциативном массиве не имеют порядка. В процессе обработки ассоциативного массива порядок ключей сохраняться не обязан, следовательно тут возможны разнообразные трудноотлавливаемые баги. Я бы сказал что это странное желание и нужно разбираться с тем почему оно возникло и зачем получать именно четвертый элемент (я бы еще понял если бы речь шла про пятый элемент :) ).

    Ну а если все-таки очень хочется - то см. ответы которые написали выше.
    Ответ написан
    5 комментариев
  • Стоит ли добавлять декоратор для обработки исключений?

    @Akela_wolf
    Extreme Programmer
    Зависит от того какая в обработчиках исключений выполняется логика. Если там просто логирование исключений, никак не связанное с логикой консьюмера - то вполне оправданно эту логику отделить. Но можно и не отделять. Тут все зависит от желания переиспользовать консьюмер и декоратор. Также оправданно отделять подобные независимые вещи для облегчения юнит-тестирования.

    Но если же в обработке исключений более сложная логика, например, связанная с восстановлением после ошибки, переплетенная с логикой консьюмера - то отделять такую логику будет сложно и не всегда можно сказать нужно ли это делать не видя код.
    Ответ написан
    2 комментария
  • Как соединиться через curl с сайтом на опрелененный ip?

    @Akela_wolf
    Extreme Programmer
    curl_init("https://$ip")
    или даже
    curl_init("https://$host")
    Ответ написан
  • Почему html не видит переменную?

    @Akela_wolf
    Extreme Programmer
    А где эта переменная объявлена? Я в коде вижу упоминание об $users_email в одном единственном месте. Как компьютер должен понимать какое значение переменной он должен использовать?
    Ответ написан
    Комментировать
  • Как защититься от таких инъекций или как они называются?

    @Akela_wolf
    Extreme Programmer
    Это называется XSS. Защищаются от нее путем фильтрации вводимого пользователем содержимого. Самое простое - экранировать HTML-теги, чтобы они выводились пользователю как текст, а не как HTML-код. Более сложный вариант - оставлять только безопасные теги, которые пользователь может использовать для оформления комментария (полужирный шрифт, курсив, подчеркивание, цвет шрифта и т.д.). Для этого есть готовые библиотеки, если будете писать самостоятельно - велик шанс что упустите какой-нибудь corner case и оставить "дырку" в сайте.
    Ответ написан
  • Не могу сделать запрос к БД MySQL?

    @Akela_wolf
    Extreme Programmer
    Объявите переменную как global. Переменные в PHP, если ничего не путаю, локальны в пределах включаемого файла.

    https://www.php.net/manual/ru/language.variables.s...
    Ответ написан
    Комментировать
  • Почему в одном случае индексы подмасок определены, а в другом нет?

    @Akela_wolf
    Extreme Programmer
    Добавление в маску ?: говорит о том что её захватывать не надо.
    Соответственно первые скобки не захватываются потому что они не совпадают, вторые - потому что вы сами это запретили.
    Ответ написан
  • Как обновить поле mysql через php?

    @Akela_wolf
    Extreme Programmer
    Во-первых очень хорошо было бы указывать что за библиотека используется для работы с БД. Потому что гуглить вот эти вот все $db->query, $db->placehold - удовольствие ниже среднего

    Во-вторых, я вижу что функция update_option вызывается с двумя параметрами, в первом передается идентификатор, во втором передается результат транслитерации. Но сама функция имеет один аргумент, причем работает с ним как с объектом. По-моему здесь что-то не так.
    Ответ написан
    Комментировать
  • Как синхронизироваться с файлами на vps при локальной смене ветки git?

    @Akela_wolf
    Extreme Programmer
    А зачем вам гит на vps? Должен быть какой-то один "источник правды".

    Мне кажется что история должна быть такой: git server (github/gitlab/etc) -> local repository -> rsync to vps -> volume to docker

    Соответственно, когда вы меняете ветку в локальном репозитории - rsync видит изменения файлов и синхронизирует их с vps, который ничего про гит не знает - для него это просто набор файлов.
    Ответ написан
    1 комментарий
  • MVC (PHP): правильно ли понимаю слои?

    @Akela_wolf
    Extreme Programmer
    Модель - собственно данные с которыми работает программа. Они составляют основу программы и, вообще говоря, ничего не должны знать о контроллерах и прочем взаимодействии с пользователем. Теоретически к слою данных можно обратиться откуда угодно - хоть из скрипта, хоть через рест, хоть через вебсокеты, хоть через интерфейс десктопного приложения и т.д. Сервисы, в которых у вас бизнес-логика находятся рядом с моделью и составляют ядро приложения. Либо этих сервисов нет и вся бизнес-логика в модели (такое тоже может быть)

    Контроллер - собственно слой, отвечающий за взаимодействие с пользователем (причем конкретный способ взаимодействия - через рест или веб)
    Представление - тоже рядом, это преобразованные данных модели в то как они отдаются пользователю. Если мы говорим про рест - там может не быть представления как такового, могут отдаваться сразу модели. А может и быть - тут все зависит от конкретной задачи

    Хранение - слой, отвечающий за сохранение данных модели в БД/файлы/куда-нибудь еще. Модель, как чистая бизнес-логика, обычно не должна знать про то как и куда её данные сохраняются. Есть просто интерфейсы - прочитать данные, записать данные. А за ними реализация работы с БД и прочими хранилищами.

    Это я написал так, как полагается делать в теории, как описывает Роберт Мартин в книге "Чистая архитектура". Понятно что в реальности (а мы говорим про PHP), все это вряд ли будет настолько четко разделено в коде. Но в голове вот такое разделение на Контроллер(представление) - Модель - Хранение я держать советую.
    Ответ написан