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