如何使用CI中预处理语句(How can I Use Prepared Statements in

2019-07-17 20:16发布

大家好,我需要在我的网站上使用预准备语句。 我试图用这个

$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? 其工作。

Answer 1:

笨不支持预处理语句。 如果你看一下源代码为CI的数据库类,你会看到,他们只是通过与传递的数组的数据替换问号解决绑定:

  • https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/DB_driver.php#L874

他们只支持查询未命名的占位符绑定。 见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不支持预处理语句,它不支持查询绑定。 预处理语句你要调用某种类型的准备()函数,然后某种类型的execute()函数。 通过查询绑定,你只需要调用一个函数,它基本上做同样的事情。 正因为如此,我想查询绑定比预处理语句更好。

在阿里纳斯,改变?:foo仅仅是从无名变为命名绑定(CI显然不支持任何)。 仅仅因为你使用其中一种或并不意味着你正在准备的语句。



Answer 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功能允许。 你会需要这样的东西在PHP PDO获取最后执行的查询为。

进一步不过使用Query Builder来建立你的陈述,然后可以在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');



文章来源: How can I Use Prepared Statements in CodeIgniter