Параметры построителя запросов SQL с акцентированными символами

Я использую построитель запросов в своем проекте Symfony для индексации всех моих физических лиц, используя несколько параметров, таких как имя, фамилия, адрес...

У каждого человека может быть максимум 3 имени. Я использую select2 в своей форме, чтобы позволить пользователю писать несколько имен в одном поле ввода.

Все работает, за исключением того факта, что если я набираю в поле символ с акцентом (например, Реми), я получаю следующую ошибку:

[Syntax Error] line 0, col 730: Error: Expected end of string, got 'é'

Я перепробовал все, но не могу найти ошибку. Вот код в моем PersonRepository, который управляет параметром имени:

    if (!empty($firstNames)) {
        $orConditions = $qb->expr()->orX(); 
    
        foreach ($firstNames as $firstName) {
            $orConditions->add(
                $qb->expr()->like('LOWER(ip.firstName)', ':firstName' . $firstName)
            );
            $qb->setParameter(':firstName' . $firstName, '%' . mb_strtolower($firstName, 'UTF-8') . '%');
        }
    
        $qb->andWhere($orConditions); 
    }

Можете ли вы мне помочь, ребята?

Вместо foreach ($firstNames as $firstName) можно использовать foreach ($firstNames as $idx => $firstName), а потом вместо ':firstName' . $firstName использовать ':firstName' . $idx? По крайней мере, если я правильно читаю.

Chris Haas 14.03.2024 18:05

Привет, Крис, я сделал это, но ошибка все равно :(

Venerivagus 14.03.2024 18:23

Что касается второй части изменения, вы обновили его в обоих местах?

Chris Haas 14.03.2024 18:28

Да, вот код: if (!empty($prenoms)) { $orConditions = $qb->expr()->orX(); foreach ($prenoms as $key => $prenom) { $orConditions->add( $qb->expr()->like('LOWER(ip.prenom)', ':prenom_' . $key) ); $qb->setParameter(':prenom_' . $key, '%' . mb_strtolower($prenom, 'UTF-8') . '%'); } $qb->andWhere($orConditions); }

Venerivagus 14.03.2024 18:29

Хм... не могли бы вы осмотреть $key, что там? Я предполагаю, что это просто целые числа, начинающиеся с 0, но могу ошибаться.

Chris Haas 14.03.2024 18:34

Ключ имеет то же значение, что и значение $firstName, поэтому я просто использовал foreach ($firstNames как $firstName)

Venerivagus 14.03.2024 18:37

О, я только что узнал! Параметр не может иметь акцентированный символ «:firstName». $firstName, Так что мне просто пришлось убрать акценты в имени для этого случая, чтобы параметр работал нормально :)

Venerivagus 14.03.2024 18:41

Я опубликовал ответ, который делает нечто подобное, но предлагает лучший контроль над вводом пользователя.

Chris Haas 14.03.2024 18:44

@AureSanta, разве вы не понимаете, что, добавляя значения к именам-заполнителям, вы делаете бесполезной всю защиту от SQL-инъекций?

Your Common Sense 14.03.2024 18:58

Здравствуйте, да, я отредактировал свой код, чтобы обезопасить его :)

Venerivagus 15.03.2024 00:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
10
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по вашим комментариям, я думаю, что это должно сработать. Поскольку ключи вашего массива совпадают со значениями, мы просто будем отслеживать индекс вручную.

То, как вы строите параметры, вы фактически создаете :prenom_Rémy, и похоже, что вы не можете использовать такие символы в заполнителях/параметрах.

В вашем комментарии упоминалось просто об удалении акцентов, однако вместо этого я бы рекомендовал использовать что-то, что вы можете лучше контролировать, например увеличивающееся число.

if (!empty($prenoms)) {
    $orConditions = $qb->expr()->orX();
    $idx = 0;
    foreach ($prenoms as $prenom) {
        $orConditions->add($qb->expr()->like('LOWER(ip.prenom)', ':prenom_'.$idx));
        $qb->setParameter(':prenom_'.$idx, '%'.mb_strtolower($prenom, 'UTF-8').'%');
        $idx++;
    }
    $qb->andWhere($orConditions);
}

Привет, Крис, твой подход лучше моего, большое спасибо за потраченное на него время, хорошего дня! :)

Venerivagus 14.03.2024 18:47

Другие вопросы по теме