Как я могу использовать подготовленные сообщения в 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 ? работает.

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 (). С привязками запросов вам нужно только вызвать одну функцию, и она в основном делает то же самое. Из-за этого я предпочитаю привязки запросов лучше, чем подготовленные.

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

Я столкнулся с этим вопросом, поскольку столкнулся с подобной проблемой. Правильный ответ: 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. Для этого вам понадобится что-то вроде Get Last Executed Query в 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');