Javascript 如何基于DB值创建动态数量的数据集
我的目标是使用CanvasJS在PHP中呈现一个图形,但要基于数据库中的值动态生成多个数据集。仅使用1个数据集生成此图工作正常,使其“动态”似乎是一个挑战 对于1个数据集,我使用了以下代码: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
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;
}