【问题标题】:How can I use an array within a SQL query如何在 SQL 查询中使用数组
【发布时间】:2011-02-20 18:33:20
【问题描述】:

所以我试图获取一个搜索字符串(可以是任意数量的单词)并将每个值转换为一个列表以在以下 IN 语句中使用)此外,我需要对所有这些值进行计数以用于我有计数过滤器

$search_array = explode(" ",$this->search_string);
$tag_count = count($search_array);

$db = Connect::connect();
$query = "select p.id
          from photographs p
          left join photograph_tags c
          on p.id = c.photograph_id
          and c.value IN ($search_array)
          group by p.id
          having count(c.value) >= $tag_count";

这目前没有返回任何结果,有什么想法吗?

解决方案:

$search_array = explode(" ",$this->search_string);

foreach ($search_array as $key => $value) {

    $new_search_array[] = "'$value'";

}

$search_string = implode(',', $new_search_array);

这给了我一个逗号分隔的列表

【问题讨论】:

    标签: php mysql arrays


    【解决方案1】:
    $search_array = implode(",", $search_array);
    

    因为 IN 采用逗号分隔的值列表。 (但你需要确保 $search_array 的内容被引用,如果它们是单词的话。)

    一步完成可能如下所示:

    function quoteAndComma($result, $each) {
      return $result . ', "'.$each.'"';
    }
    
    $search_array = array_reduce($search_array, "quoteAndComma", '');
    

    【讨论】:

    • 您可以使用 "'" . implode("','", $search_array) . "'" 完成相同的操作,尽管它可能不如您的解决方案优雅 :-)
    • 哦,太好了,我什至没有想到!
    • 不错的解决方案,但请注意,这在 5.3 之前的 PHP 中无法按预期工作,因为在 5.2 及更早版本中,array_reduce() 仅接受整数作为第三个参数。结果,字符串将类似于 '0, "one", "two", ...'
    • 感谢亚历山大提供的额外信息。我从 5.3 开始才开始使用 array_reduce(),所以我不知道!
    【解决方案2】:

    你应该先从这个数组构建一个字符串:

    // Don't forget to escape the data!
    $search_array = array_map('mysql_real_escape_string', $search_array);
    
    // Convert array to a string like "'one', 'two', ..."
    $search_values = "'" . implode("', '", $search_array) . "'";
    
    // Build a query
    $query = "select ... c.value IN ($search_values) ..."
    

    【讨论】:

      【解决方案3】:

      使用

      and c.value IN (implode(', ', $search_array))
      

      $search_array 是您直接连接成字符串的数组。你需要先把它变成一个字符串。

      另外,您为什么不回显您的 sql 语句以查看您实际上是在向 MySQL 提供数据?

      【讨论】:

      • 请先mysqli_real_escape_string数组中的值
      • 我没有先添加任何注入保护,只是让基本查询正常工作。
      【解决方案4】:

      IN 需要一个逗号分隔的值列表,(如果它们是字符串,则引用)。 您的 $this->search_string 值包含什么? 并且将其分解为数组将不起作用...尝试回显您的 $query 以查看您得到的确切信息。

      【讨论】:

        【解决方案5】:

        ...

        $search_array = explode(" ",$this->search_string);
        $search = implode(",", $search_array);
        $tag_count = count($search_array);
        
        $db = Connect::connect();
        $query = "select p.id
                  from photographs p
                  left join photograph_tags c
                  on p.id = c.photograph_id
                  and c.value IN ($search)
                  group by p.id
                  having count(c.value) >= $tag_count";
        

        【讨论】:

          【解决方案6】:

          我不是 PHP 开发人员,如果我遗漏了什么,请见谅,但数组值应该用逗号和单引号分隔:

          WHERE c.value IN ('a','b','c')
          

          【讨论】:

            【解决方案7】:
                $search_array = explode(" ",$this->search_string);
            
                foreach ($search_array as $key => $value) {
            
                    $new_search_array[] = "'$value'";
            
                }
            
                $search_string = implode(',', $new_search_array);
            

            【讨论】:

              【解决方案8】:

              你没有以正确的方式填充你的 IN 语句,你有两个选择,要么传递用逗号分隔的搜索字符串,要么自己做,比如:

              $search_array = explode(" ", $this->search_string);
              
              for ($i = 0; $i < count($search_array); $i++)
              {
                 $search_array[$i] = "'" . $search_array[$i] . "'";
              }
              
              $list = implode(",", $search_array);
              
              $tag_count = count($search_array);
              
              $db = Connect::connect();
              $query = "select p.id
                        from photographs p
                        left join photograph_tags c
                        on p.id = c.photograph_id
                        and c.value IN ($list)
                        group by p.id
                        having count(c.value) >= $tag_count";
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-08-23
                • 2010-12-15
                • 1970-01-01
                • 2021-04-16
                • 2022-11-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多