Javascript 如何基于DB值创建动态数量的数据集

Javascript 如何基于DB值创建动态数量的数据集,javascript,php,canvasjs,Javascript,Php,Canvasjs,我的目标是使用CanvasJS在PHP中呈现一个图形,但要基于数据库中的值动态生成多个数据集。仅使用1个数据集生成此图工作正常,使其“动态”似乎是一个挑战 对于1个数据集,我使用了以下代码: while ($row = $stm->fetch(PDO::FETCH_ASSOC)) { $score = calculateScore($row['difficulty'],$row['length']); array_pu

我的目标是使用CanvasJS在PHP中呈现一个图形,但要基于数据库中的值动态生成多个数据集。仅使用1个数据集生成此图工作正常,使其“动态”似乎是一个挑战

对于1个数据集,我使用了以下代码:

        while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {   
            $score = calculateScore($row['difficulty'],$row['length']);
             array_push($dataPoint, array("x"=> $i , "y"=> $score)); 
            $i++;
        }
其中$dataPoint被发送到JS代码

<script type="text/javascript">

    $(function () {
        var chart = new CanvasJS.Chart("chartContainer", {
            data: [
            {
                type: "line",

                dataPoints: <?php echo json_encode($dataPoint, JSON_NUMERIC_CHECK); ?>
            }
            ]
        });
        chart.render();
    });
</script>
其中$dataPoints是现在发送到如上所示相同JS代码的值。不幸的是,这就是问题所在。data array_push()函数感觉不太对劲,但我不知道还有什么选择


所以,我希望这是足够的信息,所有的信息都是欢迎和感谢提前

您有几个不同的问题,首先在添加数据时,我会这样做:

$dataPoint[] = array("x"=> $i , "y"=> $score); 
另外,我会去掉它,因为它似乎正在清除
$dataPoint
,实际上可能会在数组中创建额外的级别

array_push($dataPoints, $dataPoint);  
$dataPoint = array();

这段代码创建了一个
$charts
变量,它看起来像javascript图表定义中的
数据
数组,而不是仅表示
数据点
数组。这将允许您拥有所需数量的数据集

$charts = [];    

while($rowUsers = $stmUsers->fetch(PDO::FETCH_ASSOC)){
    
    $dataPoint = [];

    $name = $rowUsers['username'];           

    $stm = $pdo->prepare('SELECT * FROM public."completedgames" WHERE username = :username');
    $stm->bindParam(":username", $name, PDO::PARAM_INT);
    $stm->execute();   
    
    while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {   
        $score = calculateScore($row['difficulty'],$row['length']);
         array_push($dataPoint, array("x"=> $i , "y"=> $score)); 
        $i++;
    }

    array_push($charts, array(
      "type" => "line",
      "dataPoints" => $dataPoint
    ));

}





<script type="text/javascript">

    $(function () {
        var chart = new CanvasJS.Chart("chartContainer", {
            data: <?php echo json_encode($charts, JSON_NUMERIC_CHECK); ?>
        });
        chart.render();
    });
</script>
$charts=[];
而($rowUsers=$stmUsers->fetch(PDO::fetch_ASSOC)){
$dataPoint=[];
$name=$rowUsers['username'];
$stm=$pdo->prepare('SELECT*FROM public.“completedgames”其中username=:username');
$stm->bindParam(“:username”,$name,PDO::PARAM_INT);
$stm->execute();
而($row=$stm->fetch(PDO::fetch_ASSOC)){
$score=calculateScore($row['demobility',$row['length');
数组推送($dataPoint,数组(“x”=>$i,“y”=>$score));
$i++;
}
数组(
“类型”=>“行”,
“数据点”=>$dataPoint
));
}
$(函数(){
var chart=new CanvasJS.chart(“chartContainer”{
数据:
});
chart.render();
});

使用James的输入,我能够用多行绘制图形。只需重置计数器和$dataPoint数组:以下是工作代码:


    while($rowUsers = $stmUsers->fetch(PDO::FETCH_ASSOC)){
        
        $name = $rowUsers['username'];           

        $stm = $pdo->prepare('SELECT * FROM public."completedgames" WHERE username = :username');
        $stm->bindParam(":username", $name, PDO::PARAM_INT);
        $stm->execute();   
        
        while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {   
            $score = calculateScore($row['difficulty'],$row['length']);
             array_push($dataPoint, array("x"=> $i , "y"=> $score)); 
             json_encode($dataPoint, JSON_NUMERIC_CHECK);
            $i++;
        }
        //array_push($dataPoints, $dataPoint);  
       // $dataPoint = array();
        
        array_push($charts, array("type" => "line", "dataPoints" => $dataPoint));
        $dataPoint = array();
        $i = 0;
    }  


感谢您的所有投入

我将尝试所示的方法,其中canvasjs
data
array中有多个元素当前代码有什么问题?它是否创建了您需要的数据集?您可以使用
$dataPoint[]=[“x”=>$i,“y”=>$score]
但最终结果应该是相同的。好吧,@James,这就是我的起点,但是,这是一个固定列表,没有包含动态数据集的示例。当前代码不再生成图形$dataPoint很好,在一个大数组中添加多个$dataPoint是不可行的。您可以在php中创建整个
data
结构,而不仅仅是dataPoint数组。然后你可以在图表中添加任意多的附加图形。@James,这就是重点,只有一个图形,一个图形中有多条线。行数基于DB内容谢谢你的建议,我根据你的建议修改了代码,但结果是一样的。(修改了$dataPoint并删除了clear)数组($dataPoints,$dataPoint是问题所在。非常感谢您的建议,有了改进,所有数据现在都是可见的,但不是有多行,而是所有值现在都附加到$charts数据集中。我的想法是在一个图表上有多行,与上的多系列折线图的方式相同。这不是您想要的吗?这很简单然而,它应该是什么样的,现在只有一行,但包含了所有值。检查输入CanvasJS.Chart的呈现javascript“数据”结构,我希望在stmUsers查询中每个“用户”在数组中有一个元素,每个元素都是一个具有类型和数据点属性的对象。

    while($rowUsers = $stmUsers->fetch(PDO::FETCH_ASSOC)){
        
        $name = $rowUsers['username'];           

        $stm = $pdo->prepare('SELECT * FROM public."completedgames" WHERE username = :username');
        $stm->bindParam(":username", $name, PDO::PARAM_INT);
        $stm->execute();   
        
        while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {   
            $score = calculateScore($row['difficulty'],$row['length']);
             array_push($dataPoint, array("x"=> $i , "y"=> $score)); 
             json_encode($dataPoint, JSON_NUMERIC_CHECK);
            $i++;
        }
        //array_push($dataPoints, $dataPoint);  
       // $dataPoint = array();
        
        array_push($charts, array("type" => "line", "dataPoints" => $dataPoint));
        $dataPoint = array();
        $i = 0;
    }