【问题标题】:getting duplicated results from nested foreach loop从嵌套的 foreach 循环中获取重复的结果
【发布时间】:2014-10-22 11:47:10
【问题描述】:

我正在尝试从 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
)

【问题讨论】:

  • 请把$_POST["info"];$result的内容贴出来——否则很难预测会发生什么。
  • @Hirnhamster,抱歉,请稍候,有人编辑了我的 $POST 内容

标签: php html mysql loops pdo


【解决方案1】:

像这样尝试:

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

【讨论】:

  • 您的解决方案似乎更接近,但输出缺少分隔直径和宽度之间值的双引号:[["product","diameter","width"],["Product 1","2,4"],["Product 2","4,8"]]
  • CodeBird,它有效。最后我使用echo json_encode($data,JSON_NUMERIC_CHECK),因为我刚刚发现API不允许用引号括起来的数字。
【解决方案2】:

您正在寻找的最终结果是有效的 JSON。您不应该尝试手动生成它。

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

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

【讨论】:

    【解决方案3】:

    尝试以下解决方案:

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

    【讨论】:

    • 我刚刚测试了您的解决方案。它只能从宽度字段中获取值,像这样:[["product","diameter","width"],["Product 1","4"],["Product 2","8"]]
    • 创建查询后尝试将其输出到屏幕上,然后在 MySql 客户端中运行它,使用 var_dump($sql); 并确保它同时具有 widthdiameter
    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2017-06-22
    • 2015-04-12
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多