在Highcharts中添加级数时,Javascript循环不通过sqlite_fetch_array()设置PHP值

Javascript loop not setting PHP value via sqlite_fetch_array() when adding series in Highcharts

本文关键字:fetch sqlite array PHP 设置 添加 Highcharts 循环 Javascript      更新时间:2023-09-26

我有一个SQLite数据库,我正在尝试使用Highcharts, PHP和Javascript在线图上绘制数据。我正在为每个用户绘制一个系列(用户是每个元组的文本值),但是在通过PHP循环检索后续用户时遇到了麻烦。

$dbhandle = sqlite_open('db/test.db', 0666, $error);
if (!$dbhandle) die ($error);
$query5 = "SELECT DISTINCT User FROM Events";
$ok0 = sqlite_query($dbhandle, $query5, $error_msg);
if (!$ok0) 
{
    die("dead" . $error_msg);
}
$rows = sqlite_num_rows($ok0);
echo 
"for(var i=2; i<$rows; i++) // start of JS loop. 
                           //$rows is 4; I am graphing 2 series here
{";
  $array = sqlite_fetch_array($ok0, SQLITE_ASSOC); // $ok0 is the unique list
// of users. After graphing one series, I want to grab the next user to graph

        echo "chart.addSeries({
                name: '{$array["User"]}',
                data: [";
          for($i=0; $i<$diff+1; $i++)
          {
            $target = date("D, j M", (strtotime($_GET["start"]) + $i * 24 * 3600));
            $query6 = "SELECT * FROM Events WHERE User = '{$array["User"]}' AND Start LIKE '%{$target}%'";
            $result6 = sqlite_query($dbhandle, $query6);
            if (!$result6) die("Cannot execute query.");
            $num = sqlite_num_rows($result6);            
            if($i==($diff))
            {
              echo $num;
            }              
            else
              echo $num . ", ";
          }?>],
                pointStart: 

                 <?php
$date = DateTime::createFromFormat('D M d Y', urldecode($_GET["start"])); 
echo $date->getTimestamp()*1000;?>,
            pointInterval: 24 * 3600 * 1000 // one day
              });
      <?php echo "}";?> // end of JS loop

结果确实绘制了另外两个序列的图,但它们都是来自同一用户的相同数据。它看起来不像sqlite_fetch_array()的循环正确返回下一个用户。有人看到问题了吗?比如我把Javascript和PHP集成在一起?

这行代码每次调用时都做同样的事情:

$query6 = "SELECT * FROM Events WHERE User = '{$array["User"]}' AND Start LIKE '%{$target}%'";

$array应该有一个不同用户的列表,但是您没有显示$ok0的查询。你在这个循环for($i=0; $i<$diff+1; $i++)中做用户查找,但是你没有使用这些变量来决定取哪个用户。

我想发布从$array查找下一个用户的正确方法,但我不知道结构是什么。如果你不知道如何让你的$query6对每个用户都是唯一的,你就必须发布更多的信息,比如$arrayvar_dump$ok0的查询文本。

也许您只需要将这行$array = sqlite_fetch_array($ok0, SQLITE_ASSOC);移动到for循环中,但是这样您就会冒$i$diff+1与结果中可用的行数不一致的风险。

我明白了。我认为,由于PHP是在服务器端执行的,所以当浏览器执行Javascript时,返回的Javascript循环中的代码块会产生相同的值。服务器只是回显表示js循环的字符串,然后运行代码块。当所有内容都发送到浏览器时,Javascript将正常循环并简单地输出两次代码块的结果。我刚刚通过PHP放弃了JS循环,代之以PHP循环。