【问题标题】:MySQL PHP - SELECT WHERE id = array()? [duplicate]MySQL PHP - 选择 WHERE id = array()? [复制]
【发布时间】:2012-03-17 13:59:12
【问题描述】:

可能重复:
MySQL query using an array
Passing an array to mysql

我在 PHP 中有一个数组:

$array = array(1, 4, 5, 7);

如您所见,我有一个不同值的数组,但我想编写一个 MYSQL 语句来检查 id 是否等于 到数组中的任何值。例如,如果一行的 id 为 1,它将返回该行,对于 4、5 和 7 相同。由于程序的性质,数组的长度可能会有所不同,所以这就是问题所在是。我可以这样做吗:

SELECT ...
  FROM ...
 WHERE id = '$array'

或者有没有更好的方法?
如果我不清楚,请向我询问更多信息。

【问题讨论】:

标签: php mysql html arrays


【解决方案1】:

使用IN

$sql = 'SELECT * 
          FROM `table` 
         WHERE `id` IN (' . implode(',', array_map('intval', $array)) . ')';

【讨论】:

  • 我猜IN 是首选语句。另外,感谢您向我展示如何将我的阵列专门放在那里。 :)
  • 如果我在数组值中有相同的 id,那么我得到单次数据我想要多次数据,那么我应该怎么做?
  • @DharaPatel 你有共享相同id 的项目吗?共享 id 可能是一个糟糕的设计决策(假设它们是主要的)。
  • 我还想指出 Dhara Patel 所说的可能会被遗漏的内容。 WHERE IN () 只会对每个数据运行一次,因此如果数组中有多次相同的 id,它被忽略!此外,拥有多个 id 并不是一个糟糕的决定,除非如上所述是主要的或唯一的
  • IN 是否充当准备好的语句。假设它没有,你将如何在准备好的语句中使用它?
【解决方案2】:

您正在寻找的是IN() 声明。这将测试给定字段是否包含 1 个或多个值中的任何一个。

SELECT * FROM `Table` WHERE `id` IN (1, 2, 3)

您可以使用一个简单的循环将您的$array 变量转换为正确的格式。如果您的数组值来自前端,请务必注意 SQL 注入。

【讨论】:

    【解决方案3】:

    只需使用ID IN () 语法:

    $sql = "SELECT FROM `table` WHERE `ID` IN (".implode(',',$array).")";
    

    【讨论】:

    • 我知道这是一篇旧帖子,但是 Ben 的回答对我有用,因为我的数组来自另一个 while 循环感谢您的代码 Ben。
    • 这很容易受到 SQL 注入的影响,不应使用。
    【解决方案4】:

    你可以这样写你的查询:

    select * from table where id in (1, 4, 6, 7)
    

    您可以根据需要添加任意数量的值。

    【讨论】:

      【解决方案5】:

      您可以SELECT WHERE id IN (item1, item2...)。只需遍历您的 PHP 数组即可为查询构建您的数组。

      【讨论】:

        【解决方案6】:

        您需要使用IN 运算符:

        $sql = 'SELECT FROM WHERE id IN (' . implode(",", $array) . ')';

        在 MySQL 中,您可以使用IN 运算符在列表中使用多少个值。

        【讨论】:

        • 这很容易受到 SQL 注入的影响,不应使用。
        • @user60561 只有当数组内容是用户提供的或者可能持有注入的 SQL 时,它才容易受到 SQL 注入的攻击。被问到的问题是如何根据声明的整数数组查询 ID。提到“人们应该确保数组不包含可注入值”的评论是合适的,但对于像 OP 这样的情况,你绝对应该使用这个答案。
        • 没关系 - 您应该始终完全转义数据/在任何地方使用准备好的语句。不管你认为现在有多安全。电工不在照明电路上使用细线的原因与此相同:当然你现在可能会很好,但是有人在别处更改了代码,现在你的房子着火了。
        猜你喜欢
        • 2023-03-20
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 2018-02-06
        相关资源
        最近更新 更多