当前位置: 首页 > 面试题库 >

具有“ WHERE…IN”查询的PDO

扶冠宇
2023-03-14
问题内容

我正在重新编写一些PHP代码以使用PDO进行数据库访问,但是我遇到了“ WHERE … IN”查询问题。

我正在尝试根据检查表单上的哪些项目从数据库中删除某些内容。列表的长度和内容将有所不同,但是对于此示例,请想象是这样的:

$idlist = '260,201,221,216,217,169,210,212,213';

然后查询如下所示:

$query = "DELETE from `foo` WHERE `id` IN (:idlist)";
$st = $db->prepare($query);
$st->execute(array(':idlist' => $idlist));

当我这样做时,仅第一个ID被删除。(我认为它会抛出逗号及其后的所有内容。)

我也尝试过制作$idlist一个数组,但是它不会删除任何东西。

在PDO准备好的语句中使用项目列表的正确方法是什么?


问题答案:

由于您无法将值(数字)与控制流逻辑(逗号)与准备好的语句混合使用,因此每个值需要一个占位符。

$idlist = array('260','201','221','216','217','169','210','212','213');

$questionmarks = str_repeat("?,", count($idlist)-1) . "?";

$stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` IN ($questionmarks)");

然后循环绑定参数。



 类似资料:
  • 问题内容: 我已经开发了使用OR查询的系统: 与查询IN进行比较: MYSQL数据库中最好的查询是什么? 问题答案: 用于。 IN将使用索引。 否则(afaik)将不使用索引。 另外,这一点不容忽视,IN版本: 使用更少的代码 更容易维护 更容易理解 仅出于这些原因,我准备为获得代码质量而遭受一点性能损失,但实际上您也获得了性能。

  • 问题内容: 我想通过调用CouchDB查询特定文档的列表。 使用SQL,我会做类似的事情 在CouchDB中按一个字段或另一个字段执行此操作的诀窍是什么? 问题答案: 您需要使用views查询参数来获取具有指定集中键的记录。 接着 要同时检索文档内容,只需将查询参数添加到您的请求中。 UPD :也许您可能有兴趣通过此参考ID(2,4,56)来检索文档。默认情况下,CouchDB视图使用它们所属的文

  • 问题内容: 当表开始增长时,我担心WHERE子句中IN的性能。有没有人对这种查询有更好的策略?子查询返回的记录数比TradeLine表中的记录数增长得慢得多。TradeLine表本身以每天10个的速度增长。 谢谢你。 编辑:我使用了将子查询从WHERE移到FROM的想法。我对有助于此新查询的所有答案投了赞成票。 问题答案: 子句中的子查询不依赖于外部查询中的任何内容。您可以安全地将其移到子句中;一

  • 问题内容: 我正在尝试执行这样的查询: 问题是我要过滤的ID列表不是恒定的,并且每次执行时都必须不同。我还需要转义这些id,因为它们可能来自不受信任的来源,尽管我实际上将转义查询中的所有内容,而不管该来源的可信度如何。 节点的Postgres似乎与绑定参数专门工作:; 如果我具有已知数量的值(),这将起作用,但不能直接用于数组:,因为似乎对数组参数没有任何特殊处理。 根据数组中的项目数动态构建查询

  • 问题内容: 我正在将几个已硬编码到应用程序中的查询转换为动态的参数化查询。我遇到一个特定的查询,该查询有一个子句: 第一个参数很简单,因为它只是一个普通参数: 但是,第二个参数是一个整数列表,表示需要更新的行的ID。如何为单个参数传递整数列表?或者,您将如何设置此查询,以使您不必每次调用时都完全构建它,并且可以防止SQL注入攻击? 问题答案: 您可以基于(可能)可变数量的参数“动态”构建参数化查询

  • 问题内容: 这是对我之前回答的问题的修改 我在下表中有数据: 我想获取仅包含13和15的用户ID。因此,根据上面的示例,我只能返回 下面的查询是在我之前的答案中提供的,而该部分是我添加的,但是并没有达到目标。 问题答案: 假设的组合和是独一无二的,你可以这样做 如果and的组合不是唯一的,那么原始的in是必要的,事情会变得更具挑战性。