Не пойму как создать prepared query в yii2. В доке написано что-то типа : Код (Text): $command = $connection->createCommand('SELECT * FROM post WHERE id=:id'); $command->bindValue(':id', $_GET['id']); $post = $command->queryOne() Хотя выше в той же доке так же создаются простые запросы (или не простые?) Код (Text): $command = $connection->createCommand('SELECT * FROM post WHERE id=1'); $post = $command->queryOne(); Различия только в том что в первом присутствует именованный параметр. Значит если имеется именованный параметр, то будет создан prepared query иначе простой? Либо они все prepared??
если я правильно понимаю написанное то оба случая декларируют подготовку запроса. только во втором случае отсутствуют плейсхолдеры, поэтому и биндить значения не приходится. в каком контексте в доке употребляется второй пример? уж не показать ли нам во что превратится запрос из примера один после бинда параметра :id ?
Ну так prepared query в любом случае отличается только тем, что в нём присутствуют именованные параметры, насколько я понимаю. У yii2 (как раз сейчас его изучаю) все объекты для доступа к данным являются просто более удобной обёрткой для pdo, даже используются те же константы. А вообще, какая проблема посмотреть исходный код yii\db\Connection и yii\db\Command ? Добавлено спустя 7 минут 54 секунды: О, был не прав. Посмотрел сам. yii\db\Command всегда использует PDO:repare, так что все запросы подготовленные
Prepared queries отличаются не только тем что имеют "именованные параметры", а тем что они будут распарсены СУБД в специальную схему, которая будет выполняться быстрее простого запроса. Вообще говоря любой запрос распарсится и превартится в спец. схему, но prepared queries сделают это только раз. Добавлено спустя 2 минуты 7 секунд: И да спасибо за ответ. Добавлено спустя 3 минуты 21 секунду: А как создать тогда не prepared statement ? Например нужно только 1 раз запросить N количество записей при старте скрипта и не хочется захломлять хеш-таблицу СУБД с ненужными prepared statement.
Ну есть свойство yii\db\Connection::$pdo, оно public, так что вы можете его использовать. Правда, я бы не рекомендовал, поскольку если завтра YII перейдут на mysqli, к примеру, ваш код полетит. Ну и вообще, я считаю, что когда используется YII, всё должно делаться через YII