如何在CodeIgniter中使用准备好的语句

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

查询绑定

绑定使您可以通过让系统将查询放在一起来简化查询语法.请考虑以下示例:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
Run Code Online (Sandbox Code Playgroud)

查询中的问号将自动替换为查询函数的第二个参数中数组中的值.

http://ellislab.com/forums/viewthread/105112/#528915

即使CI不支持预准备语句,它也支持查询绑定.使用预处理语句,您必须调用某种类型的prepare()函数,然后调用某种类型的execute()函数.使用查询绑定,您只需要调用一个函数,它基本上做同样的事情.因此,我比查询语句更喜欢查询绑定.

在旁注中,?改为:foo仅仅是从未命名绑定到命名绑定(CI显然也不支持).仅仅因为你使用或不意味着你正在准备陈述.


Ant*_*ony 8

当我遇到类似问题时,我遇到了这个问题.答案是正确的,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');

  • CI + 安全准备语句 (2认同)
  • 这个答案是炸弹。任何使用 CI 的人都应该考虑鼓励这些人在他们的代码中公开*适当的*准备好的语句。**模拟 PDO 是谎言!** (2认同)