Как я могу использовать подготовленные сообщения в CodeIgniter

Привет всем Мне нужно использовать Подготовленные заявления на моем сайте. Я пробовал использовать этот

$sql = "SELECT * FROM tbl_user WHERE uid=:id and activation_key=:key";
$query = $this->db->query( 
    $sql, 
    array( ':id' => $uid ,':key' => $activation_key)
);

но это не работает. Когда я изменяю :id и :key на ? его работу.

Ответы

Ответ 1

CodeIgniter не поддерживает подготовленные сообщения. Если вы посмотрите на исходный код для класса базы данных CI, вы увидите, что они разрешают привязки просто заменяя вопросительные знаки данными из переданного массива:

Они поддерживают только привязку запросов с неназванными заполнителями. См. http://ellislab.com/codeigniter/user-guide/database/queries.html

Привязки запросов

Привязки позволяют упростить синтаксис запроса, позволяя системе объединить запросы для вас. Рассмотрим следующий пример:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));

Вопросительные знаки в запросе автоматически заменяются значениями в массиве во втором параметре функции запроса.

и http://ellislab.com/forums/viewthread/105112/#528915

Несмотря на то, что CI не поддерживает подготовленные инструкции, он поддерживает привязки запросов. С подготовленными операторами вы должны вызвать некоторую функцию prepare(), а затем некоторую функцию execute(). С привязками запросов вам нужно только вызвать одну функцию, и она в основном делает то же самое. Из-за этого я предпочитаю привязки запросов лучше, чем подготовленные.

В sidenote изменение ? до :foo просто меняется от неназванного к именованным связям (который, по-видимому, не поддерживает CI). Просто потому, что вы используете либо или не означает, что вы готовите заявления.

Ответ 2

Я столкнулся с этим вопросом, поскольку столкнулся с подобной проблемой. Правильный ответ: CI не поддерживает подготовленные заявления. Однако это не означает, что вы не можете использовать подготовленные инструкции!

В следующем примере я использую PDO как мой класс соединения, но следующий код будет работать:

$q = $this->db->conn_id->prepare('SELECT * FROM tbl_user WHERE uid=? and activation_key=?');
$q->execute(array($param1,$param2));
print_r($q->fetchAll());

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

Однако это не позволит вам получить строку запроса, которую разрешают встроенные функции CI. Для этого вам понадобится что-то вроде Получить последний выполненный запрос в PHP PDO.

Кроме того, это не останавливает использование Query Builder для создания ваших инструкций, которые вы затем можете использовать в подготовке PDO. Например -

$db->where('uid = ?',null,false);
$db->where('activation_key = ?',null,false);
$q = $this->db->conn_id->prepare($db->get_compiled_select('tbl_user'));

Создал бы запрос и позволит вам увидеть основной запрос, если вы выведете $db->get_compiled_select('tbl_user');