【问题标题】:How to use php array with sql IN operator?如何使用带有 sql IN 运算符的 php 数组?
【发布时间】:2012-03-25 23:20:21
【问题描述】:

我有一个包含两个值的数组,我想在选择查询中将它与 sql IN 运算符一起使用。

这是我的表的结构

id comp_id
1   2
2   3
3   1

我有一个数组 $arr 有两个值 Array ( [0] => 1 [1] => 2 )

我想获取comp_id 1和comp_id 2的记录。所以我写了以下查询。

SELECT * from table Where comp_id IN ($arr)

但它不返回结果。

【问题讨论】:

  • 第一步是调试你自己的代码。如果您打印出要发送到 MySQL 的查询,您会发现 SELECT * from table Where comp_id IN (Array) 不正确。尝试将数组连接到字符串不会自动将其转换为逗号分隔的单词列表。
  • 第 2 步是搜索 SO,看看这个问题已经被回答了多少次了
  • 我回答了这个问题,它也会解决你的问题。 stackoverflow.com/questions/920353/…

标签: php sql arrays in-operator


【解决方案1】:

因为你有纯整数,你可以简单地用逗号连接它们:

$sql = "SELECT * FROM table WHERE comp_id IN (" . implode(',', $arr) . ")";

如果使用字符串,尤其是不受信任的输入:

$sql = "SELECT * FROM table WHERE comp_id IN ('" 
     . implode("','", array_map('mysql_real_escape_string', $arr)) 
     . "')";

注意这不适用于NULL等值(将保存为空字符串),并且会在数值周围盲目添加引号,如果使用strict mysql mode则不起作用。

mysql_real_escape_string 是原始 mysql 驱动程序扩展的函数,如果使用更新的驱动程序,如 mysqli,请改用 mysqli_real_escape_string

但是,如果您只想处理不受信任的号码,您可以使用 intvalfloatval 清理输入:

$sql = "SELECT * FROM table WHERE comp_id IN (" . implode(",", array_map('intval', $arr)) . ")";

【讨论】:

  • 我使用了这种方法,效果很好,但警告Warning: implode() [function.implode]: Invalid arguments passed in C:\wamp\www\x\x\x\xxx.php on line 81
  • @Ahmad 你的$arr 很可能不是一个数组。检查您是否正确构建它。
  • 它会检索到相同的结果,但它不是最好的答案,你发现了 SQL 注入攻击,我回答了这个问题,它也会解决你的问题。 stackoverflow.com/questions/920353/…
  • 这仅适用于数组中的数值。如果 $arr 包含字符串,它们将在 implode 后不被引用,并且数据库引擎可能会不高兴,例如SELECT * FROM table WHERE id IN (foo, bar, baz); 不是大多数数据库的有效 SQL。
  • 这个问题的含义是有数字的,尽管它不是绝对明确的。
【解决方案2】:

你需要将数组转换成逗号分隔的字符串:

$condition = implode(', ', $arr);

此外,您可能希望先转义值(如果您不确定输入):

$condition = implode(', ', array_map('mysql_real_escape_string', $arr));

【讨论】:

  • 嗯,你不能只在数据上调用 mysql_real_escape_string,仍然需要在值周围添加引号(否则会创建无效的 SQL)。
【解决方案3】:

$arr 是一个 php 数组,你需要向 sql server 发送一个将被解析的字符串 您需要将数组转换为 1、2 等列表。

为此,您可以使用函数http://php.net/implode

所以在运行查询之前尝试

$arr = implode ( ', ', $arr);

【讨论】:

  • 我使用了这种方法,效果很好,但警告Warning: implode() [function.implode]: Invalid arguments passed in C:\wamp\www\x\x\x\xxx.php on line 81
  • @Ahmad 这很奇怪.. 可能是您在该数组中没有元素或变量尚未初始化的情况.. ?
  • 见我上面的评论。这不适用于数组中的字符串值。
  • @CXJ 当然,您是对的,这仅回答了 OP 发布的问题中的情况...对于您必须引用的字符串 转义值
【解决方案4】:

您需要使用 ',' 逗号对数组进行内爆

$imploded_arr = implode(',', $arr);

SELECT * from table Where comp_id IN ($imploded_arr)

【讨论】:

    【解决方案5】:

    你只能将字符串作为查询传递给mysql,所以试试这个

    mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
    

    【讨论】:

      【解决方案6】:

      这里的所有人都在提出相同的建议,但由于一个简单的错误,我在 WordPress 中收到了警告。 你需要在你的内爆字符串中添加逗号。准确来说是这样的。

      $query = "SELECT *FROM table Where comp_id IN ( '" . implode( "', '", $sanitized_brands ) . "' )";
      

      希望它能帮助像我这样的人。 :)

      【讨论】:

        【解决方案7】:

        您正在混合使用 PHP 和 SQL - 对于 IN SQL 运算符,您需要如下格式:

        SELECT * from table WHERE comp_id IN (1,2)
        

        因此,要在 PHP 中实现这一点,您需要执行以下操作:

        $sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"
        

        请记住,这仅在数组包含整数时才有效。如果它们是字符串,则必须对每个元素进行转义。

        【讨论】:

          【解决方案8】:

          你需要这样的东西:

          $sql = "SELECT * from table where comp_id in (".implode(',',$arr.")";
          

          【讨论】:

            【解决方案9】:

            您需要将$arr 实际转换为字符串。你正在做的最简单的方法是使用implode()

            $query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')';
            

            现在,如果您 echo 查询您的查询,您会看到 IN 语句中没有数组,而是单词“Array”

            【讨论】:

              【解决方案10】:

              您需要将数组转换为字符串以供查询使用:

              $list = implode(',', $arr);
              

              那么可以在IN子句中使用:

              SELECT * from table Where comp_id IN ($list)
              

              【讨论】:

              【解决方案11】:

              根据@barryhunter 的回答,它仅适用于仅包含整数的数组:

              $sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";
              

              我做了一些调整,使其适用于字符串数组:

              $sql = "SELECT * from table Where comp_id IN ('".implode("','",$arr)."')";
              

              【讨论】:

              • 文本字符串元素的巧妙解决方案!在 Laravel 中工作,使用 DB::raw
              【解决方案12】:

              之前的几个回答中存在一些 SQL 注入的风险。如果您完全确定 $arr 正在被消毒(并且会保持这种状态),那可能会很好。但如果您不能完全确定,您可能希望使用$stmt->bindValue 来降低此类风险。这是一种方法:

              # PHP
              $in_list = array();
              for ($i = 0; $i < count($arr); $i++) {
                  $key = 'in_param_' . i;
                  $in_list[':' . $key] = array('id' => $arr[$i], 'param' => $key);
              }
              $keys = implode(', ', array_keys($in_list));
              
              // Your SQL ...
              $sql = "SELECT * FROM table where id IN ($keys)";
              
              
              foreach ($in_list as $item) {
                  $stmt->bindValue($item['param'], $item['id'], PDO::PARAM_INT);
              }
              $stmt = $this->getConnection()->prepare($sql)->execute();
              

              【讨论】:

                【解决方案13】:

                如果你的数组是整数:

                $searchStringVar = implode(",",$nameIntAryVar);
                $query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ($searchStringVar)";
                

                如果你的数组是字符串:

                $searchStringVar = implode("','",$nameStringAryVar);
                $query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ('$searchStringVar')";
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-08-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多