我有一个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集成的方式?
答案 0 :(得分: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_dump
$array
或$ok0
的查询文字1}}。
也许你只需要在$array = sqlite_fetch_array($ok0, SQLITE_ASSOC);
循环中移动这一行for
,但是你冒着$i
和$diff+1
不同意可用行数的风险从你的结果。
答案 1 :(得分:0)
我已经弄清楚了。我相信由于PHP在服务器端执行,当浏览器执行Javascript时,回显的Javascript循环中的代码块会产生相同的值。服务器只是回显表示js循环的字符串,然后运行代码块。当所有内容都发送到浏览器时,Javascript将正常循环并简单地输出代码块的结果两次。我刚刚通过PHP放弃了JS循环,并将其替换为PHP循环。