如何在CodeIgniter中使用预处理语句

ajsxfq5m  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(113)

嗨所有我需要在我的网站使用准备语句。我尝试使用这个

$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改成?时,它就起作用了。

j2qf4p5b

j2qf4p5b1#

CodeIgniter不支持Prepared语句。如果查看CI的Database类的源代码,您将看到它们仅通过用传递数组中的数据替换问号来解析绑定:

  • 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不支持预处理语句,但它支持查询绑定。使用预处理语句,你必须调用某种类型的prepare()函数,然后调用某种类型的execute()函数。使用查询绑定,你只需调用一个函数,它基本上做同样的事情。因此,我更喜欢查询绑定而不是预处理语句。
在旁注中,将?更改为:foo仅仅是将未命名绑定更改为命名绑定(CI显然也不支持)。

yhuiod9q

yhuiod9q2#

我遇到这个问题是因为我遇到了一个类似的问题。答案是正确的,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的代码。
然而,这并不能阻止你使用Query Builder来构建你的语句,然后你可以在PDO prepare中使用这些语句。

$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');,则允许您查看基本查询

正如@site80443所指出的,CI 4现在支持预准备语句,可在此处找到:https://codeigniter.com/user_guide/database/queries.html?highlight=prepared#prepared-queries

相关问题