Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-在mysqli查询中使用数组_Php_Mysql_Sql_Mysqli - Fatal编程技术网

PHP-在mysqli查询中使用数组

PHP-在mysqli查询中使用数组,php,mysql,sql,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

这里是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中构建组合,然后在查询中使用它们

我宁愿这样做:

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);
?>

用户在中放置类别列表(a、B、C等)

  • 因此,使用in运算符是正确的,但是,不能直接在SQL查询中附加
    $match1
    $match2
    ,因为它们仍然是数组
  • 您必须将它们转换为逗号分隔的字符串,并为每个字符串添加单引号,因为
    classA
    classB
    是DB表中的字符串列
代码:

<?php


$match1 = array('A','B');
$match2 = array('A','B');

$match1_values = implode(",",array_map("addQuotes",$match1));
$match2_values = implode(",",array_map("addQuotes",$match2));

$sql = "SELECT classA, classB, value FROM data_table WHERE classA IN ($match1_values) AND classB IN ($match2_values)";

echo $sql;

function addQuotes($each_class_value){
    return "'".$each_class_value."'";
}

非常感谢这一点和关于SQL注入的说明。我尝试了一下您的代码并让它运行了,尽管我需要将
内爆(“,”,$arr)
更改为
内爆(“,”,$arr)
(逗号前的额外单引号)以使
$match_字符串
。使用
json_encode($results);
我正在返回
{“0”:“A”,“classA”:“A”,“1”:“B”,“classB”:“B”,“2”:“5”,“corr”:“5”}
其中我所要的是
[{“classA”:“A”,“classB”:“A”,“value”:1},{“classA”:“A”,“classB”:“B”,“value”:5},{“classA”:“B”,“classB”:“A”,“value”:1},{“classA”:“B”,“value”:5}]
为什么它会产生如此混乱的数组?@Lachlan.00您需要执行一些错误操作。MySQL只会以表格的方式获取结果。谢谢@Madhur,您能建议一个链接来详细说明这些过程吗?请注意,我用类似于:
while($row=mysqli\u fetch\u array)的方法解决了这个问题($results,MYSQLI_NUM)){$array[]=$row;}
非常感谢!
<?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);
?>
<?php


$match1 = array('A','B');
$match2 = array('A','B');

$match1_values = implode(",",array_map("addQuotes",$match1));
$match2_values = implode(",",array_map("addQuotes",$match2));

$sql = "SELECT classA, classB, value FROM data_table WHERE classA IN ($match1_values) AND classB IN ($match2_values)";

echo $sql;

function addQuotes($each_class_value){
    return "'".$each_class_value."'";
}
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');
<?php

$match_values = implode(",",array_map("addQuotes",$arr));

$sql = "SELECT classA, classB, value FROM data_table WHERE classA IN ($match_values) AND classB IN ($match_values)";

echo $sql;

function addQuotes($each_class_value){
    return "'".$each_class_value."'";
}