28

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

$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开始?工作时。

4

2 回答 2

44

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 显然也不支持)。仅仅因为您使用或不意味着您正在准备陈述。

于 2013-01-04T11:51:42.417 回答
10

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

于 2016-11-16T09:23:13.077 回答