Привет всем Мне нужно использовать Подготовленные заявления на моем сайте. Я попытался использовать это
$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');