Pra*_*mod 23 php mysql codeigniter prepared-statement
大家好我需要在我的网站上使用预备语句.我试过用这个
$sql = "SELECT * FROM tbl_user WHERE uid=:id and activation_key=:key";
$query = $this->db->query(
$sql,
array( ':id' => $uid ,':key' => $activation_key)
);
Run Code Online (Sandbox Code Playgroud)
但这不起作用.当我改变:id并:key以?它的工作.
Gor*_*don 36
CodeIgniter不支持Prepared Statements.如果查看CI的Database类的源代码,您将看到它们仅通过将问号替换为传递的数组中的数据来解析绑定:
它们仅支持使用未命名的占位符进行查询绑定.请参阅http://ellislab.com/codeigniter/user-guide/database/queries.html
查询绑定
绑定使您可以通过让系统将查询放在一起来简化查询语法.请考虑以下示例:
Run Code Online (Sandbox Code Playgroud)$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显然也不支持).仅仅因为你使用或不意味着你正在准备陈述.
当我遇到类似问题时,我遇到了这个问题.答案是正确的,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());
Run Code Online (Sandbox Code Playgroud)
请注意,conn_id是可以运行预准备语句的PDO对象.
但是,这将不允许您获取本机CI函数允许的查询字符串.您需要在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'));
Run Code Online (Sandbox Code Playgroud)
构建查询并允许您在输出时查看基本查询 $db->get_compiled_select('tbl_user');