Skip to content

Conversation

@gitrequests
Copy link

@gitrequests gitrequests commented Aug 15, 2025

Что оно делает?

Исправляет warning при подготовке сообщения для логирования

[2025-08-15 10:53:13] (ERROR @ /var/www/public/core/components/pdotools/src/Fetch.php : 229) PHP warning: Array to string conversion

Описание проблемы

Исходя из документации по xPDOQuery::where Этот запрос может быть комплексным и включать в себя многомерный массив. Из за этого функция implode принимает значения, которые не может обработать.

В качестве примера вот такой запрос WHERE отлично парсится и отрабатывает в MODX, но выдает WARNING в коде, который предназначен для подготовки WHERE запроса к логировалию (Смотрите пример предупреждения выше):

[
    [
        [
            "TVtags.value:LIKE" => "%hit%"
        ],
        [
            "OR:TVtags.value:LIKE" => "%promo%"
        ],
        [
            "OR:TVtags.value:LIKE" => "%sale%"
        ],
    ],
    [
        "TVprice.value:>=" => 104,
        "AND:TVprice.value:<=" => 140
    ],
    "modResource.parent:IN" => [5],
    "modResource.template:IN" => [3],
    "modResource.published" => 1,
    "modResource.deleted" => 0
]

Обратите внимание на различие TVprice и TVtags. Из за того, что TVtags могут иметь несколько значений, мы не можем иметь одну вложенность массива (иначе ключ "OR:TVtags.value:LIKE" будет повторяться, и значения будут переписаны, а не добавлены):

// Этот участок кода не работает из за повторяющегося ключа массива
 [
    [
        "TVtags.value:LIKE" => "%hit%",
        "OR:TVtags.value:LIKE" => "%promo%", //<-- Ключь массива установлен
        "OR:TVtags.value:LIKE" => "%sale%" //<-- Значение перепишет предыдущий ключь
    ]
]

Поэтому мы можем передать многомерный массив в xPDOQuery.

Парсер xPDOQuery обрабатывает такие массивы рекурсивно, с любым уровнем вложенности.


Предлагаю заменить логирование WHERE (и заодно и HAVING чуть ниже) на json_encode - это выведет в сообщения логов более четкую информацию о том, что именно попало в WHERE и так же снизит количество warning (и error в будущих версиях PHP).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant