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

Php 使用带有字符串数组或字符串列表的IN子句的CodeIgniter查询绑定,php,sql,codeigniter,Php,Sql,Codeigniter,下面是一个失败的例子。我已经尝试了几种方法将下面的$arrayOfIds转换为(?)中id的正确语法,但运气不好。如果我不查询bind,它就会工作 注意:我们不使用活动记录 // this is actually being passed in as argument $arrayOfIds = array('A0000-000000000001','B0000-000000000001','C0000-000000000001'); $params = array(); array_pu

下面是一个失败的例子。我已经尝试了几种方法将下面的$arrayOfIds转换为(?)中id的正确语法,但运气不好。如果我不查询bind,它就会工作

注意:我们不使用活动记录

// 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); 

您需要以不同的方式构建
params
数组,并添加与
arrayOfIds
大小一样多的问号

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

$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);

您是否尝试过在运行完$this->db->last_query()后使用$this->db->last_query()转储查询,以查看SQL的外观?好吧,我想这只是从复制到此处的输入错误,但您使用的是上面的$arrayOfIds,然后是$companyEntityId。让我们至少更正一下我们的帖子,然后按照Mathew Daly说的运行$this->db->last_query(),你编辑了你的打字错误,但你没有给我们需要的有用信息-你的查询现在看起来像什么?相关:快速跟进转储上次_查询显示了错误。CI自动转义绑定的查询参数。最后的排列方式是:('A0000-000000000001,B0000-000000000001,C0000-000000000001')或-('A0000-000000000001','B0000-000000000001','C0000-000000000001')。这是完全错误的。他将arrayOfIds转换成一个变量,然后尝试绑定它。在您的方法中,他必须有一个静态数量的数组元素,这可能不是真的使用他的方法Codeigniter正在逃逸滴答声,使得查询无法使用。使用我的答案,您可以在(?、、…)中构建
,在数组大小上使用一个简单的循环。这种方法非常有效,解决了我的问题。正如我在上面的评论中所指出的,CodeIgniter转义每个查询绑定项,这很好;然而,当通过列表时,给我们留下了这个挑战。您为my list创建绑定列表变量的方法与合并到my params数组的方法非常好。您也可以告诉它不要添加backticksHow,您可以这样做并保持查询转义吗?您应该解释这段代码的作用,而不仅仅是转储一些代码,它与原始代码的区别以及它解决问题的原因。
$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));