【问题标题】:How do i select multiple rows which match the value of an item in an array?如何选择与数组中某个项目的值匹配的多行?
【发布时间】:2010-12-14 01:44:57
【问题描述】:

我编写了一个 php 脚本,它在数组中返回任意数量的特定 id(数字格式)。我想做一个新查询,从属于每个 id 的表中选择每一行。我知道我可以进行 1 次查询以获取具有匹配 ID 的一行。但我想在一个查询中完成这一切。这是我的代码:

$id = array(1,4,7,3,11,120); // The array containing the ids

$query = mysql_query("SELECT * 
                        FROM posts 
                       WHERE id = '$id[0]'"); 
// I would like to Do this for each id in the array and return it as one group of rows.`

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    我想你想要IN 子句:

    $idList = implode(",", $id);
    
    SELECT *
    FROM posts
    WHERE id IN ( $idList );
    

    implode() 函数会将您的数字数组转换为相同值的逗号分隔字符串。当您将它用作 IN 子句的一部分时,它会告诉数据库将这些值用作查找表来匹配 id

    标准免责声明/警告:
    any SQL 查询一样,您确实不应该将变量直接连接到查询字符串中。您只是对 SQL 注入敞开心扉。改用准备好的/参数化的语句。

    【讨论】:

      【解决方案2】:

      使用PHP's implode function 将数组转换为逗号分隔的值字符串。

      然后,您可以使用SQL IN clause 运行单个 SQL 语句,其中包含与您从 PHP 捕获的 id 关联的值:

      $id = array(1,4,7,3,11,120);
      $csv = implode(',', $id); 
      
      $query = sprintf("SELECT * 
                          FROM posts 
                         WHERE id IN (%s)",
                        mysql_real_escape_string($csv)); 
      
      $result = mysql_query($query)
      

      我省略了单引号,因为在 SQL 中处理数值时它们不是必需的。如果id 值是字符串,则每个值都必须封装在单引号内。

      【讨论】:

      • mysql_real_escape_string() 是否对数组中的每个值进行转义?还是它通常会逃离数组?我从来没有这样用过。
      • @Ben:它不会转义每个值。由于数字数据,这是一个糟糕的示例,但如果您的数组包含对 SQL/MySQL 非法的字符 - 非法字符将被正确转义。
      【解决方案3】:

      你想要的是 SQL 的 IN 子句。

      SELECT * FROM posts WHERE id IN (1, 4, 7, 11, 120)
      

      在 PHP 中,您可能需要类似以下内容:

      $query = mysql_query(sprintf("SELECT * FROM posts WHERE id IN (%s)", implode(',', $id)));
      

      显然,这是假设您知道 $id 具有整数值,并且 $id 的值不是来自用户(也就是说,它们应该被清理)。为了安全起见,您确实应该执行以下操作:

      $ids = implode(',', array_map('mysql_real_escape_string', $id));
      $query = mysql_query("SELECT * FROM posts WHERE id IN ($ids)");
      

      如果 $id 是动态生成的,别忘了把 something 放在那个 IN 子句中,因为SELECT * FROM foo WHERE bar IN () 会给你一个错误。我通常确保将我的 IN 子句变量设置为 0,因为 IN (0) 很好,而且主键几乎从不为 0。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-21
        • 2013-04-05
        • 1970-01-01
        • 2015-05-23
        • 2019-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多