Экранирование обратного слеша (\) при построении запросов

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
undestroyer
Сообщения: 120
Зарегистрирован: 2014.01.06, 13:46

Экранирование обратного слеша (\) при построении запросов

Сообщение undestroyer » 2018.05.17, 09:56

Добрый день, сразу оговорюсь что у меня проект на Yii 2.0.13.1 и возможно проблема уже исправлена, но я не могу обновить до новой версии чтобы проверить.

Форма поиска имеет атрибут который принимает текстовое название запрашиваемого документа. Если в документе встречаются обратные слеши \, то поиск, реализованный стандартными средствами не экранирует символ обратного слеша.
Поиск выполняется через стандартный ActiveQuery:

Код: Выделить всё

Document::find()->where(['like', 'name', $this->name, false])->andWhere(['enabled'=>true])->one();
Если в поиск передать строку "документ 22\23\11", он не вернет ничего, но если изменить запрос на:

Код: Выделить всё

Document::find()->where(['like', 'name', addslashes($this->name), false])->andWhere(['enabled'=>true])->one();
документ прекрасно находится.

В документации по выполнению like запросов через QueryInterface явно прописано:
The method will properly quote the column name and escape special characters in the values.
Обратный слэш нужно отдельно обрабатывать или я как-то не правильно использую QueryInterface?

Gyry
Сообщения: 87
Зарегистрирован: 2017.09.11, 15:23

Re: Экранирование обратного слеша (\) при построении запросов

Сообщение Gyry » 2018.05.17, 10:51

Не совсем понятно, в данном примере ты хочешь найти все документы с названием "документ 22\23\11"?

undestroyer
Сообщения: 120
Зарегистрирован: 2014.01.06, 13:46

Re: Экранирование обратного слеша (\) при построении запросов

Сообщение undestroyer » 2018.05.17, 12:13

Gyry писал(а):
2018.05.17, 10:51
Не совсем понятно, в данном примере ты хочешь найти все документы с названием "документ 22\23\11"?
Да

andku83
Сообщения: 680
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Экранирование обратного слеша (\) при построении запросов

Сообщение andku83 » 2018.05.17, 12:35

undestroyer писал(а):
2018.05.17, 12:13
Gyry писал(а):
2018.05.17, 10:51
Не совсем понятно, в данном примере ты хочешь найти все документы с названием "документ 22\23\11"?
Да
а почему тогда ->one() ?

undestroyer
Сообщения: 120
Зарегистрирован: 2014.01.06, 13:46

Re: Экранирование обратного слеша (\) при построении запросов

Сообщение undestroyer » 2018.05.17, 13:10

andku83 писал(а):
2018.05.17, 12:35
undestroyer писал(а):
2018.05.17, 12:13
Gyry писал(а):
2018.05.17, 10:51
Не совсем понятно, в данном примере ты хочешь найти все документы с названием "документ 22\23\11"?
Да
а почему тогда ->one() ?
А, ты в этом смысле, нет, нужно найти именно один документ с указанным именем. Сути проблемы не меняет. Проблема именно в обратном слеше. Если его сэкранировать и поставить \\, то находит правильно.

Ответить