我如何在CodeIgniter中使用准备好的语句
大家好,我需要在我的网站使用Prepared Statements。 我试过使用这个
$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不支持Prepared Statements。 如果您查看CI的Database类的源代码,您将看到它们只是通过用传入数组中的数据replace问号来parsing绑定:
他们只支持与未命名占位符的查询绑定。 请参阅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'));
查询中的问号将自动replace为查询函数的第二个参数中数组中的值。
和http://ellislab.com/forums/viewthread/105112/#528915
即使CI不支持预准备语句,它也支持查询绑定。 准备好的语句必须调用某种types的prepare()函数,然后调用某种types的execute()函数。 使用查询绑定,你只需要调用一个函数,它基本上做同样的事情。 正因为如此,我喜欢查询绑定比准备好的语句更好。
在旁注中,改变?
到: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对象。
然而,这不允许你得到原生CIfunction允许的查询string。 你将需要像在PHP PDO中获取最后执行的查询 。
更进一步,这不会阻止您使用查询生成器来构build您可以在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');
将build立查询并允许你查看基本查询$db->get_compiled_select('tbl_user');