【问题标题】:CodeIgniter Query Binding Using IN Clause with String array or string listCodeIgniter 查询绑定使用 IN 子句与字符串数组或字符串列表
【发布时间】:2013-11-14 12:16:36
【问题描述】:

下面是一个失败的例子。我尝试了几种方法将下面的 $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 的样子?
  • 好吧,我想这只是复制到这里的一个错字,但是您使用的是上面的 $arrayOfIds,然后是 $companyEntityIds。让我们至少更正我们的帖子,然后按照 Mathew Daly 所说的运行 $this->db->last_query()
  • 所以,您编辑了您的错字,但您没有向我们提供我们需要的有用信息 - 您的查询现在是什么样的?
  • 快速跟进转储 last_query 显示错误。 CI 自动转义绑定的查询参数。所以最终得到如下排列: IN ('\'A0000-000000000001,B0000-000000000001,C0000-000000000001'\'') -OR- ('\'A0000-000000000001\',\'B0000-00000000001\', \'C0000-000000000001\'').

标签: php sql codeigniter


【解决方案1】:

您需要以不同方式构建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);

【讨论】:

  • 那是完全错误的。他正在将他的 arrayOfIds 变成一个变量,然后尝试绑定它。使用你的方法,他必须有一个静态数量的数组元素,这可能不是真的
  • 使用他的方法 Codeigniter 正在逃避使查询不可用的滴答声。使用我的答案,您可以在数组大小上使用简单的循环来构建 IN (?,?,...)
  • 这种方法效果很好,解决了我的问题。正如我在上面的评论中所指出的,CodeIgniter 会转义每个查询绑定项,这很好;但是,在传递列表时给我们留下了这个挑战。您为我的列表创建绑定列表变量的方法与合并到我的 params 数组一起很棒。
  • 你也可以告诉它不要添加反引号
  • 你怎样才能做到这一点并保持查询转义?
【解决方案2】:
$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));

【讨论】:

  • 您应该解释这段代码的作用,它与原始代码的不同之处以及它解决问题的原因,而不是仅仅转储一些代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多