PHP - 在 mysqli 查询中使用数组

标签 php mysql sql mysqli

<分区>

这里是 PHP 新手。这是我从中提取数据的 MySQL 数据库中的表的示例。

id  classA    classB     value
------------------------------
1   A         A          1
2   A         B          5   
3   A         C          2  
4   B         A          1
5   B         B          5   
6   B         C          1  
7   C         A          8
8   C         B          5   
9   C         C          7  

用户输入了一个类别类别列表(A、B、C 等),我的代码将返回这些对的每个组合的值(例如 [A,A]、[A,B]、[A ,C]...等)。我可以使用以下脚本很容易地实现这一点,其中 $array 是输入列表(例如 [A, B, C]):

<?php
    // Mehtod 1 - slow
    for($i = 0; $i < count($arr); $i++){
        for ($j = 0; $j < count($arr); $j++){
            $sql = "SELECT value FROM data_table WHERE '$arr[$i]'=classA AND '$arr[$j]'=classB LIMIT 1";

            $value = mysqli_query($con,$sql);
            $value = mysqli_fetch_array($corr)[0];

            $results[] = array('classA' => $arr[$i], 'classB' => $arr[$j], 'value' =>  $value);
        }
    }
?>

但是,这非常慢,因为 mysqli_query() 位于 for 循环内。相反,我更愿意在一次调用中进行查询。我已经尝试了以下但没有运气..

<?php
    // Mehtod 2 - fast
    for($i = 0; $i < count($arr); $i++){
        for ($j = 0; $j < count($arr); $j++){
            // make array of class combinations
            $query_array[] = array('classA' => $arr[$i], 'classB' => $arr[$j]);
        }
    }
    // get arrays of pairs to request
    $match1 = array_column($query_array, 'classA');
    $match2 = array_column($query_array, 'classB');

    $sql = "SELECT classA, classB, value FROM data_table WHERE classA IN '$match1' AND classB IN '$match2'";

    $results = mysqli_query($con,$sql);
    $results = mysqli_fetch_array($results);
?>

我可以通过单个请求进行这样的查询吗?我有点卡住了。干杯。

最佳答案

因为您需要所有可能的组合,所以您不需要在 PHP 中构建组合然后在查询中使用它们。

我宁愿做以下事情:

SELECT classA, classB, value 
FROM data_table
WHERE classA IN ('A', 'B', 'C') AND 
      classB IN ('A', 'B', 'C')

这将考虑所有组合。它将等同于:

SELECT classA, classB, value 
FROM data_table
WHERE (classA = 'A' AND classB = 'A') OR
      (classA = 'A' AND classB = 'B') OR
      (classA = 'A' AND classB = 'C') OR
      (classA = 'B' AND classB = 'A') OR
      (classA = 'B' AND classB = 'B') OR
      (classA = 'B' AND classB = 'C') OR
      (classA = 'C' AND classB = 'A') OR
      (classA = 'C' AND classB = 'B') OR
      (classA = 'C' AND classB = 'C')

在这种情况下,PHP 代码如下所示:

<?php
    // Method 3 - possibly fastest and neater code

    // get comma separated values to match against
    $match_string = "('" . implode("','", $arr) . "')";

    $sql = "SELECT classA, classB, value 
             FROM data_table 
             WHERE classA IN " . $match_string . " AND 
                   classB IN " . $match_string;

    $results = mysqli_query($con,$sql);
    $results = mysqli_fetch_array($results);
?>

最重要的,避免反对 SQL injection相关攻击,你应该使用 Prepared Statements

关于PHP - 在 mysqli 查询中使用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53360687/

相关文章:

sql - 选择没有指针的对象

php - 获取原始帖子数据

php - 在php中创建csv文件时获取重复列

php - 计算 imagefk 等于的记录总数?在交响乐中

mysql - 分配给用户 ID 的主键字段也应该是唯一的还是多余的?

MySQL表关系和md5 hash的使用

mysql - 具有通用字段的大表作为 EAV 和关系表的替代品

mysql - 如何比较2个表的多列

javascript - 使用ajax将javascript变量传递给PHP但它给出错误

MySQL计算两个别名的百分比