从嵌套foreach循环中获取重复的结果


getting duplicated results from nested foreach loop

我正在尝试从mysql为Google Line Chart API获取以下输出:

[["product","diameter","width"],["Product 1","2","4"],["Product 2","4","8"]]

我设置了几个输入复选框,通过$_POST["info"]将字段名称(例如宽度、直径)发送到数据库,并从这些字段中检索值。以下是从mysql:生成数据的部分

$result = $users->fetchAll();
$comma = "";
$data="";
$data[0] = array_merge(array(product),$info);   
$i = 1;
foreach ($result as $r)
{
    foreach($_POST["info"] as $p)
    {    
        $d .= $comma.$r[$p];     // trying to get "$r["width"],$r["diameter"]"            
    }
    $comma = ",";
    $data[$i] = array($r["name"], $d);
    $i++;
}   
echo json_encode($data);

我想要的输出应该是这样的:

[["product","diameter","width"],["Product 1","2","4"],["Product 2","4","8"]]

但该代码正在生成类似的重复结果

[["product","diameter","width"],["Product 1","24"],["Product 2","24,4,8"]]

我想我不应该使用嵌套的foreach在$_POST上循环。有人能告诉我怎么修吗?

完整的PHP代码:

$info = $_POST["info"]; // It contains an array with values like width,diameter,thickness etc...
$comma = "";
foreach($info as $in)
{ 
    $field .= "".$comma."b.".$in."";
    $comma = ",";
}
$sql = "
        SELECT {$field},a.user_id,a.name
        FROM `product_detail` a INNER JOIN
        `attr` b ON a.model = b.model 
        WHERE a.user_id = ?
        GROUP BY a.model
       ";
$users = $dbh->prepare($sql);
$users->bindValue(1, $_SESSION["user_id"]);  
$users->execute();
$result = $users->fetchAll();
$comma = "";
$data="";
$i = 1;
$data[0] = array_merge(array(product),$info);       
foreach ($result as $r)
{
    foreach($_POST["info"] as $p)
    {    
        $d .= $comma.$r[$p];                
    }
    $comma = ",";
    $data[$i] = array($r["name"], $d);
    $i++;
}   
echo json_encode($data);

$_POST["info"]内容:

Array
(
    [0] => diameter
    [1] => width
)

这样尝试:

$result = $users->fetchAll();
$data="";
$data[0] = array_merge(array(product),$info);   
$i = 1;
foreach ($result as $r)
{
    $d[]=$r["name"];
    foreach($_POST["info"] as $p)
    {    
        $d[]= $r[$p];
    }
    $data[$i] = $d;
    $d=array(); //set $d to empty not to get duplicate results
    $i++;
}   
echo json_encode($data);

您要查找的最终结果是有效的JSON。您不应该尝试手动生成。

相反,您应该在php中创建一个数组数组,并使用json_encode($array)来获得您想要的结果。

还要注意,通过在查询中直接注入POST变量,您很容易受到sql注入的攻击。在接受字段时,应该对照允许值的白名单对其进行检查。

尝试以下解决方案:

$result = $users->fetchAll();
$data="";
$data[0] = array_merge(array(product),$info);   
$i = 1;
foreach ($result as $r)
{
    $d = array();
    foreach($_POST["info"] as $p)
    {    
        $d[] = $r[$p];     // trying to get "$r["width"],$r["diameter"]"            
    }
    $data[$i] = array($r["name"]) +$d;
    $i++;
}   
echo json_encode($data);