Экранирование запросов в Active Record

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Haku
Сообщения: 56
Зарегистрирован: 2015.03.11, 07:39

Экранирование запросов в Active Record

Сообщение Haku » 2017.09.25, 23:04

Опытные разработчики на Yii, подскажите, пожалуйста, принцип использования передачи пользовательских данных через привязку параметров.
Например, в этом случае нужно обязательно передавать данные через параметры:

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

$models = Post::find()
    ->where('user_id = ' . $userId)
    ->all();
А, например, в этих случаях нужно использовать параметры или нет?

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

$models = Comment::find()
    ->where([
        'status' => Comment::STATUS_APPROVED,
        'post_id' => $postId
    ])
    ->all();

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

$models = Comment::find()
    ->where(['in', 'post_id', $postIds])
    ->all();

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

$models = Comment::find()
    ->where(['like', 'author', $authorName])
    ->all();
То есть в каких случаях нужно использовать params(), а когда фреймворк сам экранирует полученные данные? Помню в Yii 1.1 методы findByAttributes() и findAllByAttributes() сами экранировали все значения атрибутов, переданные первым параметром, а в Yii 2.0 что-то не смог с этим разобраться.

Аватара пользователя
samdark
Администратор
Сообщения: 9127
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Экранирование запросов в Active Record

Сообщение samdark » 2017.09.25, 23:09

В первом надо заменить на параметры. В остальных фреймворк сделает это за вас.

Аватара пользователя
Haku
Сообщения: 56
Зарегистрирован: 2015.03.11, 07:39

Re: Экранирование запросов в Active Record

Сообщение Haku » 2017.09.25, 23:26

Первый, это который "'user_id = ' . $userId"?
Правильно ли я понимаю, что фреймворк будет автоматически экранировать все условия в формате массива и формате операторов — [operator, operand1, operand2], за исключением операторов "AND" и "OR"?

Аватара пользователя
maleks
Сообщения: 1722
Зарегистрирован: 2012.12.26, 12:56

Re: Экранирование запросов в Active Record

Сообщение maleks » 2017.09.26, 06:59

Haku писал(а):
2017.09.25, 23:26
Первый, это который "'user_id = ' . $userId"?
да, в нем. Тут вы вручную составили текст запроса, поэтому тут вы сами.
А во всех других случаях, когда вы используете эти методы, как сказано в доках, фрейм сам будет эскейпить. Потому что иначе он бы должен был предупреждать в доках, мол тут вы сами эскейпте, но этого же нет.

Ответить