За последние 24 часа нас посетили 17855 программистов и 1719 роботов. Сейчас ищет 881 программист ...

Prepared queries Yii2

Тема в разделе "Прочие вопросы по PHP", создана пользователем 3jIo, 6 дек 2014.

  1. 3jIo

    3jIo Новичок

    С нами с:
    25 ноя 2014
    Сообщения:
    5
    Симпатии:
    0
    Не пойму как создать prepared query в yii2.
    В доке написано что-то типа :
    Код (Text):
    1. $command = $connection->createCommand('SELECT * FROM post WHERE id=:id');
    2. $command->bindValue(':id', $_GET['id']);
    3. $post = $command->queryOne()
    Хотя выше в той же доке так же создаются простые запросы (или не простые?)
    Код (Text):
    1. $command = $connection->createCommand('SELECT * FROM post WHERE id=1');
    2. $post = $command->queryOne();
    Различия только в том что в первом присутствует именованный параметр. Значит если имеется именованный параметр, то будет создан prepared query иначе простой? Либо они все prepared??
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    если я правильно понимаю написанное то оба случая декларируют подготовку запроса. только во втором случае отсутствуют плейсхолдеры, поэтому и биндить значения не приходится. в каком контексте в доке употребляется второй пример? уж не показать ли нам во что превратится запрос из примера один после бинда параметра :id ?
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну так prepared query в любом случае отличается только тем, что в нём присутствуют именованные параметры, насколько я понимаю. У yii2 (как раз сейчас его изучаю) все объекты для доступа к данным являются просто более удобной обёрткой для pdo, даже используются те же константы. А вообще, какая проблема посмотреть исходный код yii\db\Connection и yii\db\Command ?

    Добавлено спустя 7 минут 54 секунды:
    О, был не прав. Посмотрел сам. yii\db\Command всегда использует PDO::prepare, так что все запросы подготовленные
     
  4. 3jIo

    3jIo Новичок

    С нами с:
    25 ноя 2014
    Сообщения:
    5
    Симпатии:
    0
    Prepared queries отличаются не только тем что имеют "именованные параметры", а тем что они будут распарсены СУБД в специальную схему, которая будет выполняться быстрее простого запроса. Вообще говоря любой запрос распарсится и превартится в спец. схему, но prepared queries сделают это только раз.

    Добавлено спустя 2 минуты 7 секунд:
    И да спасибо за ответ.

    Добавлено спустя 3 минуты 21 секунду:
    А как создать тогда не prepared statement ? Например нужно только 1 раз запросить N количество записей при старте скрипта и не хочется захломлять хеш-таблицу СУБД с ненужными prepared statement.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну есть свойство yii\db\Connection::$pdo, оно public, так что вы можете его использовать. Правда, я бы не рекомендовал, поскольку если завтра YII перейдут на mysqli, к примеру, ваш код полетит. Ну и вообще, я считаю, что когда используется YII, всё должно делаться через YII
     
  6. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Может просто заглянуть в исходники Yii и расширить класс при необходимости
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    metadon, +1000
     
  8. 3jIo

    3jIo Новичок

    С нами с:
    25 ноя 2014
    Сообщения:
    5
    Симпатии:
    0
    Окей. Спасибо большое всем.