大家好我需要在我的网站上使用预备语句。我试过用这个
$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
更改为?
时,它正在工作。
答案 0 :(得分:35)
CodeIgniter不支持预备语句。如果您查看CI的Database类的源代码,您将看到它们只是通过将问号替换为传递的数组中的数据来解析绑定:
它们仅支持使用未命名的占位符进行查询绑定。见http://ellislab.com/codeigniter/user-guide/database/queries.html
查询绑定
通过让系统将查询放在一起,Bindings可以简化查询语法。请考虑以下示例:
$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()函数。使用查询绑定,您只需要调用一个函数,它基本上做同样的事情。因此,我比查询语句更喜欢查询绑定。
在旁注中,将?
更改为:foo
只是从未命名绑定更改为命名绑定(CI显然也不支持)。仅仅因为你使用或不意味着你正在准备陈述。
答案 1 :(得分:7)
当我遇到类似的问题时,我遇到了这个问题。答案是正确的,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 in PHP PDO这样的东西。
然而,这并没有阻止您使用查询生成器来构建您可以在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');