如何在 CodeIgniter 中使用预准备语句

2022-08-30 15:38:41

嗨,我需要在我的网站上使用预准备语句。我试过使用这个

$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?


答案 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() 函数。使用查询绑定,您只需要调用一个函数,它基本上可以执行相同的操作。因此,与预准备语句相比,我更喜欢查询绑定。

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


答案 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中的“获取上次执行的查询”之类的东西。

此外,这并不能阻止您使用查询生成器生成语句,然后可以在 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');


推荐