CodeIgniter查询绑定:使用字符串数组或字符串列表的IN子句

3
以下是一个失败的示例。我已经尝试了几种方法,将$arrayOfIds转换为正确的语法以进行id IN(?)查询绑定,但没有成功。如果我不使用查询绑定,则可以正常工作。
注意:我们使用Active Record。
// this is actually being passed in as argument
$arrayOfIds = array('A0000-000000000001','B0000-000000000001','C0000-000000000001');  

$params = array();
array_push($params,1); // for the status
array_push($params, "'" . implode("','",$arrayOfIds) . "'"); // for the id in 

$sql = "SELECT name FROM my_table WHERE status = ? AND id IN (?) ";

$query = $this->db->query($sql,$params); 

你尝试过在查询运行后使用 $this->db->last_query() 来转储查询,以查看 SQL 的样子吗? - Matthew Daly
好的,我想这只是从复制到这里时出现了一个笔误,但是你在上面使用了$arrayOfIds,然后是$companyEntityIds。让我们至少更正一下我们的帖子,然后像Mathew Daly所说的那样运行$this->db->last_query()。 - jmadsen
所以,你更正了拼写错误,但是你没有给我们需要的有用信息 - 现在你的查询看起来像什么? - jmadsen
相关:http://stackoverflow.com/questions/4854710/codeigniter-implode-query-binding-causing-unwanted-string - Yan Berk
快速跟进,转储last_query显示错误。CI自动转义绑定的查询参数。因此最终得到像这样的排列:IN(''A0000-000000000001,B0000-000000000001,C0000-000000000001''') -OR- (''A0000-000000000001','B0000-000000000001','C0000-000000000001')。 - tibc-dev
2个回答

6
你需要以arrayOfIds的大小为基础,不同方式构建params数组,并添加相应数量的问号。

编辑: 问号根据数组大小动态生成。

$arrayOfIds = array('A0000-000000000001','B0000-000000000001','C0000-000000000001');  

$params = array();
array_push($params, 1);

$params = array_merge($params, $arrayOfIds);
$in_string = str_replace(' ', ',', trim(str_repeat("? ", count($arrayOfIds))));  

$sql = "SELECT name FROM my_table WHERE status = ? AND id IN (".$in_string.")";

$query = $this->db->query($sql, $params);

这完全是错误的。他把他的arrayOfIds变成了一个单一的变量,然后尝试绑定它。使用你的方法,他必须拥有一个静态数量的数组元素,这可能不是真实情况。 - jmadsen
使用他的方法,Codeigniter会转义引号,使查询无法使用。使用我的答案,您可以通过简单循环数组大小来构建IN(?,?,...) - Yan Berk
这种方法非常有效,解决了我的问题。正如我在上面的评论中所指出的那样,CodeIgniter会转义每个查询绑定项,这很好;但是,在传递列表时,我们面临着挑战。您创建一个绑定列表变量来处理我的列表的方法非常棒,并将其合并到我的参数数组中。 - tibc-dev
你也可以告诉它不要添加反引号。 - jmadsen
你怎么做并保持查询转义? - Yan Berk

1
$arrayOfIds = array('A0000-000000000001','B0000-000000000001','C0000-000000000001');  

$status = 1;

$sql = "SELECT name FROM my_table WHERE status = ? AND id IN ?";

$query = $this->db->query($sql, array($status, $arrayOfIds));

5
不要只是简单地贴上代码,你应该解释这段代码的作用,它与原始代码的不同之处,以及为什么它可以解决问题。请使用通俗易懂的语言进行翻译,但不要改变原文的含义。 - JJJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接