• Почему не работает метод rename?

    vitaly_74
    @vitaly_74 Автор вопроса
    После чтения своего же вопроса, увидел ошибку, было:
    rename(
                    $info['dirname'] . $info['basename'], //файл источник
                    $this->folder() . '/' . $info['basename'] //то место куда нужно перенести
                )

    стало (не хватало слеша):
    rename(
                    $info['dirname'] . '/' . $info['basename'],
                    $this->folder() . '/' . $info['basename']
                );
    Ответ написан
    Комментировать
  • Как исправить json плагина REST для терминов таксономии?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Всё элементарно. В PHP любой массив - ассоциативный, что соответствует объекту JSON.
    Но, если индекс массива начинается с нуля и содержит только строго последовательные номера (0, 1, 2, 3 и т.д.), то для простоты он представляется как классический массив, в том числе и в JSON.
    print json_encode(['a', 'b']); // ["a","b"]
    print json_encode([0 => 'a', 1 => 'b']); // ["a","b"]
    print json_encode([1 => 'a', 2 => 'b']); // {"1":"a","2":"b"}
    У вас массив заполняется по индексам $term->tid, которые не образуют классической последовательности, поэтому и представляются объектом.
    Ваш код можно переписать так:
    $vid = 'digest';
    $termDataAll = array_map(
        fn($term) => [
            'tid' => $term->tid,
            'name' => $term->name,
            'weight' => $term->weight,
            'childs' => array_map(
                fn($child) => [
                    'tid' => $child->tid,
                    'name' => $child->name,
                    'weight' => $child->weight
                ],
                \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $term->tid, 1)
            )
        ],
        \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, 0, 1)
    );

    В результате должен получиться такой JSON
    [
      [
        "tid": "11",
        "name": "parent-1",
        "weight": "7",
        "childs": [
          ["tid": "14", "name": "child-1", "weight": "0"],
          ["tid": "19", "name": "child-2", "weight": "1"],
        ],
      ], [
        "tid": "12",
        "name": "parent-2",
        "weight": "6",
        "childs": [
          ["tid": "17", "name": "child-1", "weight": "0"],
          ["tid": "18", "name": "child-2", "weight": "1"]
        ]
      ]
    ]
    Ответ написан
    1 комментарий
  • Есть ли готовое решение формы, где заказчик выбирает удобное для себя время прибытия работника?

    Sanes
    @Sanes
    Это так или иначе делается вручную. Вам всё равно надо согласовать и подтвердить вызов.
    Технически это обычное поле с радиокнопками.
    Достаточно предоставить выбор числа и время первая/вторая половина дня.
    Ответ написан
    4 комментария
  • Удаление в массиве по значению другого массива?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Устественно для фильтрации массива использовать array_filter:
    $res = array_filter(
    	$arr,
    	fn($el)=>!in_array($el["uniq_id"], $filter)
    );
    Ответ написан
    1 комментарий
  • Как правильно проверять возраст на php?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    <?php
    $birthDate = '20.02.2010';
    if (time() < strtotime('+18 years', strtotime($birthDate))) {
        echo 'меньше 18';
    } else {
        echo 'больше 18';
    }
    Ответ написан
    1 комментарий
  • Можно ли дешифровать md5?

    Sanes
    @Sanes
    Это хеш, его нельзя дешифровать. Есть словари, где может быть ваше слово.
    Ответ написан
    Комментировать
  • Как ответить сразу и продолжить выполнять скрипт?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Не хочешь использовать rabbitmq, используй хотя бы крон.
    Если у тебя задачи выполняются дольше минуты, то надо принять это и реализовать функционал по-человечески:
    1. Принимаем запрос из внешней системы, складываем в очередь, отвечаем внешней системе
    2. В фоновом режиме находим все необработанные задачи и обрабатываем их, тратя на это столько времени, сколько потребуется.

    PS А если тебе важно предоставить результат работы твоего скрипта внешней системе, то надо разобраться что у тебя там целую минуту делается.
    Минута - это очень много. У меня ОС в 3 раза быстрее грузится, а там 100% больше функционала чем в твоём скрипте.
    Ответ написан
  • Как работает докер?

    Мне понравилось как описано тут
    Ответ написан
    Комментировать
  • Почему много HTTP запросов - это плохо?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Тебе когда надо достать из холодильника 5 бутылок пива, что проще - открыть холодильник, взять 5 бутылок пива и закрыть холодильник, или открыть холодильник, взять бутылку, закрыть холодильник, открыть холодильник, взять бутылку, закрыть холодильник, открыть холодильник, взять бутылку, закрыть холодильник, открыть холодильник, взять бутылку, закрыть холодильник, открыть холодильник, взять бутылку, закрыть холодильник?
    Ответ написан
  • Как расширит диапазон используемых функций в php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Какой-то странный вопрос.
    Во-первых, использование функций - не самоцель. Образованный человек отличается от пэтэушника в первую очередь не словарным запасом, а тем, что умеет выражать свои мысли четко и понятно. И может написать большой текст так, чтобы его было удобно читать.
    А какие слова он при этом использует - дело десятое. Да, можно иногда сократить текст, используя общепринятый термин вместо его описания, но это не принципиально.
    Так же и с кодом. Он должен быть четким, красивым и осмысленным.

    Во-вторых, встроенные функции - это вообще какая-то ерунда. Используется раз в неделю. Куда важнее умеешь ли ты пользоваться библиотеками. Вот где эрудиция-то проявляется. Сидишь ли на коленке колупаешь CURLOPT или используешь гузлю. mail или phpmailer. И так далее.
    Как в анекдоте - ты уже не сам анекдот рассказываешь, а только номер называешь.

    В-третьих, опять же, код мы пишем не на голом пхп, а с использованием своих моделей, фреймворка, тех же библиотек. То есть в современном коде редко можно встретить голую функцию пхп.
    То есть это просто другой уровень. зачем тебе mb_strlen и mb_substr чтобы обрезать текст по заданной длине, если у тебя уже есть готовая функция, которая это делает?

    В-четвертых, непонятно, зачем насильно какие-то функции зубрить если все равно через неделю забудешь. Какая проблема перед решением какой-то задачи быстро погуглить функцию?

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

    @vism
    Называется, услышал звон, да не знаю где он.

    1. Сервисный слой ты превратил в контроллер.
    Т.е. у тебя есть контроллер, а ты создал ещё один, т.к. где-то слышал, что нужны сервисы.
    Но, сервисы не шлют ответы, это внутренний слой для отделения логики.
    Ты можешь те методы вызвать через консоль, другие сервисы и т.п.
    Там должен просто генерироваться return, а сам response уже в контроллере (чтоб контроллер своб функцию выполнял). Валидацию реквеста кстати тоже надо делать не в сервесе.

    2. CategoryQuery - это вобще дичь дикая.
    Ты опять создаёшь дубликат, потому что услышал о репозиториях, и даже интерфейс. Вот я угараю с людей, кто везде пихает интерфейсы. Интерфейсы нужны там, где они нужны. Где будет 2+ наследователей интерфейса.
    Откуда у тебя тут наследники, если ты завязан на элокуент?
    А ноги от индусов репозитаристов. Не нужен репозитарий, Query и интерфейсы при работе в элокуент. Он сам в себе это всё уже содержит и все повторяющиеся вещи обёрнуты уже. find, first, firstOrNew и т.д.
    Так что используй элокуент и не переусложняй проект напрасно. Не надо делать сложно, делай просто.

    3. CategoryAction.
    Опять интерфейс...
    Вот это Экшн по сути у тебя сервис. Тут ты имеено перенёс бизнес логику создания и редактирования и возвращаешь ответ данного метода. Вот удали свой CategoryAction и перенеси методы в сервис.
    Ответ написан
    30 комментариев
  • Как тестировать код, где функции в основном ничего не возвращают?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    ты можешь тестировать метод на срабатывание исключений + проверить те свойства что он изменяет + проверить ээ по английски это backside effect т.е. внение изменения произошедшие в результате выполнения плагина.
    вообще не всегда можно написать тест, например, нельзя протестировать mail() т.к. нельзя проверить дошло ли письмо до адресата.
    Ответ написан
    6 комментариев
  • PHP относительные даты. Как обозначить например третий вторник месяца, или последний четверг месяца, или первый понедельник месяца?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    echo date('d.m.y', strtotime('third tuesday of this month'));

    https://www.php.net/manual/ru/function.strtotime.php
    https://www.php.net/manual/ru/datetime.formats.rel...

    как обозначить в базе

    Что значит обозначить даты в базе?
    Заранее записываете нужные высчитанные нужным способом
    Ответ написан
    Комментировать
  • Как можно скрыть раздел меню для неавторизованного пользователя?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Не здесь нужно скрывать.
    В том месте где у вас формируется массив ссылок проверяйте уровень доступа и не добавляйте ссылки, если доступа нет.
    Ответ написан
    9 комментариев
  • SQL запрос, как осуществить выборку данных одним махом?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SELECT `id` 
      FROM `peoples`
      WHERE `id` NOT IN (
        SELECT `peoples_id`
          FROM `cars`
          WHERE `desc` IN ('Mercedes', 'BMW')
      )

    или
    SELECT `p`.`id` 
      FROM `peoples` AS `p`
      LEFT JOIN `cars` AS `c`
        ON `c`.`peoples_id` = `p`.`id`
          AND `c`.`desc` IN ('Mercedes', 'BMW')
      WHERE `c`.`peoples_id` IS NULL
    Ответ написан
    4 комментария
  • Почему не получается записать в базу данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    База данных всегда сама подробно расскажет, почему у неё не получилось выполнить запрос. Надо её только об этом попросить.

    Поэтому сначала учимся правильно соединяться.
    Весь этот детский лепет "не могу соединиться с БД" выкидываем и пишем нормальный код, который сам, без всяких проверок, сообщит нам об ошибках.
    В случае mysqli это
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");

    Здесь первая строчка отвечает как раз за информирование об ошибках

    Кроме того надо не забыть про ошибки РНР
    Во-первых, всегда в коде должно быть error_reporting(E_ALL);
    Плюс на домашнем компе ini_set('display_errors',1);, а на боевом - ini_set('display_errors',0);ini_set('log_errors',1);, и смотреть, соответственно, в логах.

    После этого переписываем запрос. Причем так, чтобы данные в БД всегда попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $title, $discription, $date, $path);
    $stmt->execute();

    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    И тогда никаких ошибок запроса уже никогда не будет. Не говоря уже о том что при любых других вариантах твой сайт поломает любой пятиклассник

    Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute

    Подключение
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $port = "3306";
    $charset = 'utf8mb4';
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
    $pdo = new \PDO($dsn, $user, $pass, $options);

    Здесь за информирование об ошибках отвечает параметр PDO::ERRMODE_EXCEPTION, а остальные просто для удобства/корректности.

    Выполнение запроса
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$title, $discription, $date, $path]);
    Ответ написан
    2 комментария
  • Как обновить данные в одной таблице, после обновления данных в другой?

    @Akela_wolf
    Extreme Programmer
    Подумать. Потому что такая проблема указывает что база данных денормализована, соответственно это может быть ошибка проектирования. Если это не ошибка - подумать еще раз. Если все равно так и должно быть - читать про триггеры, либо закладывать логику синхронизации таблиц в логику приложения.
    Ответ написан
    Комментировать
  • Как получить четвертый элемент ассоциативного массива?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    перебирать в цикле и считать до четырех
    Ответ написан
    2 комментария