【问题标题】:How can I Use Prepared Statements in CodeIgniter如何在 CodeIgniter 中使用准备好的语句
【发布时间】:2012-12-18 20:22:35
【问题描述】:

大家好,我需要在我的站点中使用准备好的语句。我试过用这个

$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 更改为 ? 时,它的工作原理。

【问题讨论】:

    标签: php mysql codeigniter prepared-statement


    【解决方案1】:

    CodeIgniter 不支持预处理语句。如果您查看 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'));
    

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

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

    尽管 CI 不支持预处理语句,但它支持查询绑定。使用准备好的语句,您必须调用某种类型的 prepare() 函数,然后调用某种类型的 execute() 函数。使用查询绑定,您只需调用一个函数,它基本上做同样的事情。正因为如此,我更喜欢查询绑定而不是准备好的语句。

    在旁注中,将? 更改为:foo 只是从未命名绑定更改为命名绑定(CI 显然也不支持)。仅仅因为您使用或不意味着您正在准备语句。

    【讨论】:

      【解决方案2】:

      我遇到了这个问题,因为我遇到了类似的问题。答案是正确的,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');,将构建查询并允许您查看基本查询

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      相关资源
      最近更新 更多