嗨所有我需要在我的网站使用准备语句。我尝试使用这个
$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
改成?
时,它就起作用了。
嗨所有我需要在我的网站使用准备语句。我尝试使用这个
$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
改成?
时,它就起作用了。
2条答案
按热度按时间j2qf4p5b1#
CodeIgniter不支持Prepared语句。如果查看CI的Database类的源代码,您将看到它们仅通过用传递数组中的数据替换问号来解析绑定:
它们仅支持带有未命名占位符的查询绑定。请参阅http://ellislab.com/codeigniter/user-guide/database/queries.html
查询绑定
链接可让系统将查询放在一起,让您简化查询语法。请考虑下列范例:
查询中的问号将自动替换为查询函数的第二个参数中数组中的值。
和http://ellislab.com/forums/viewthread/105112/#528915
尽管CI不支持预处理语句,但它支持查询绑定。使用预处理语句,你必须调用某种类型的prepare()函数,然后调用某种类型的execute()函数。使用查询绑定,你只需调用一个函数,它基本上做同样的事情。因此,我更喜欢查询绑定而不是预处理语句。
在旁注中,将
?
更改为:foo
仅仅是将未命名绑定更改为命名绑定(CI显然也不支持)。yhuiod9q2#
我遇到这个问题是因为我遇到了一个类似的问题。答案是正确的,CI不支持预准备语句。但是,这 * 并不意味着 * 你不能使用预准备语句!
在下面的示例中,我使用PDO作为我的连接类,但下面的代码将起作用:
注意conn_id是PDO对象,您可以对它运行预准备语句。
但是,这不允许您获得原生CI函数所允许的查询字符串,您需要类似Get Last Executed Query in PHP PDO的代码。
然而,这并不能阻止你使用Query Builder来构建你的语句,然后你可以在PDO prepare中使用这些语句。
将生成查询,如果输出
$db->get_compiled_select('tbl_user');
,则允许您查看基本查询正如@site80443所指出的,CI 4现在支持预准备语句,可在此处找到:https://codeigniter.com/user_guide/database/queries.html?highlight=prepared#prepared-queries