0

我有一个 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 集成的方式有关?

4

2 回答 2

0

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

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

$array据说有一个不同用户的列表,但您没有显示$ok0. 您正在此循环中进行用户查找for($i=0; $i<$diff+1; $i++),但在确定要获取哪个用户时没有使用这些变量。

我想发布从 中查找下一个用户的正确方法$array,但我不知道结构是什么。如果您不知道如何使您$query6对每个用户都独一无二,您将不得不发布更多信息,例如var_dumpof$array或查询文本$ok0

也许你只需要$array = sqlite_fetch_array($ok0, SQLITE_ASSOC);在你的for循环中移动这条线,但是你会冒着$i$diff+1同意结果中可用的行数的风险。

于 2013-03-06T00:03:17.397 回答
0

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

于 2013-03-06T20:01:47.050 回答