使用PHP JSON问题从SQL数据库中获取Google Vis注释时间线
我试图从PostgreSQL数据库中创建一个简单的带注释的时间轴,使用服务器端PHP脚本访问数据库中的数据,然后使用JavaScript客户端脚本显示图形。基本上很简单。现在,正如您可能猜到的,当我访问页面时,没有显示任何内容 这就是我得到的结果:当我查看我的apache日志文件时,我可以看到我的PHP脚本正在正确解析,当我使用超链接(包括JavaScript添加的所有额外的东西,以正确地向PHP询问它从数据库中想要什么)时,我可以看到正确的Google格式的响应。至少我认为是这样。我认为问题可能在于PHP函数的响应对于Google注释的timeline对象的语法不正确,但我找不到足够的文档来证明这一点 下面是我的PHP函数的截断版本:使用PHP JSON问题从SQL数据库中获取Google Vis注释时间线,php,javascript,json,postgresql,google-visualization,Php,Javascript,Json,Postgresql,Google Visualization,我试图从PostgreSQL数据库中创建一个简单的带注释的时间轴,使用服务器端PHP脚本访问数据库中的数据,然后使用JavaScript客户端脚本显示图形。基本上很简单。现在,正如您可能猜到的,当我访问页面时,没有显示任何内容 这就是我得到的结果:当我查看我的apache日志文件时,我可以看到我的PHP脚本正在正确解析,当我使用超链接(包括JavaScript添加的所有额外的东西,以正确地向PHP询问它从数据库中想要什么)时,我可以看到正确的Google格式的响应。至少我认为是这样。我认为问题可
Google.visualization.Query.setResponse({version:'0.5',reqId:'0',status:'ok',table:{cols: [{id:'date',label:"date",type:'datetime'},{id:'temp',label:"temp",type:'number'}],
rows: [{c:[{v:new Date(2011,2,22,13,47,26),f:"03\/22\/2011 01:47pm"},{v:132.8,f:"133"}]},{c:[{v:new Date(2011,2,22,13,48,57),f:"03\/22\/2011 01:48pm"},{v:136.8,f:"137"}]},
{c:[{v:new Date(2011,2,22,13,56,49),f:"03\/22\/2011 01:56pm"},{v:132.8,f:"133"}]},{c:[{v:new Date(2011,2,22,13,58,42),f:"03\/22\/2011 01:58pm"},{v:128.8,f:"129"}]},
{c:[{v:new Date(2011,2,22,14,1,26),f:"03\/22\/2011 02:01pm"},{v:124.8,f:"125"}]},{c:[{v:new Date(2011,2,22,14,4,19),f:"03\/22\/2011 02:04pm"},{v:128.8,f:"129"}]},{c:[{v:new Date(2011,2,22,14,5,51),f:"03\/22\/2011 02:05pm"},{v:132.8,f:"133"}]},
当然会继续,但我想我会让你知道我看到了什么,而不是让你睡得一塌糊涂
现在我知道了,把文件放进去;有点像我的JavaScript中的标签,我可以告诉你程序确实完成了,并且不会因为我愚蠢的疏忽而抛出任何疯狂的错误…(张开嘴准备插入脚)。。。然而,从我在其他地方读到的内容来看,这个查询响应的格式似乎有点不正确(我确实在这篇文章中更改了格式并插入了间距,以便可读,所以如果你看到间距有问题,很可能是我)。我将在这篇文章的底部包括我的PHP和JavaScript代码。如果有人看到我遗漏了什么,或者对可能出现的问题有任何见解,我将非常感谢您的帮助
提前谢谢大家
JavaScriptindex.html
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["annotatedtimeline"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var query = new google.visualization.Query('/vis.php');
query.setQuery('SELECT date,temp FROM temp1 ORDER BY date');
query.send(function(result) {
document.write(result.getDetailedMessage());
if(result.isError()) {
alert(result.getDetailedMessage());
} else {
var data = result.getDataTable();
var chart = new google.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
chart.draw(data,{displayAnnotations: false});
}
});
}
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>
请在此处查看Google文档页面: 显示以下内容:
Important: To use this visualization, you must specify the height and width
of the container element explicitly on your page. So, for example:
<div id="chart_div" style="width:400; height:250"></div>.
重要提示:要使用此可视化,必须指定高度和宽度
在页面上显式显示容器元素的。例如:
.
你似乎没有这样做
编辑:我只是在那个页面上尝试了这个例子,事实上,如果我删除了显式的高度和宽度,我什么也得不到;时间线显示的高度和宽度。在您的回答中,关键点未包含在引号中,这可能是图表未呈现的原因
{id:'date', type:'date'}
{"id":"date", "type":"date"}
我刚刚搜索了visualization.query文档和live example使用了与您类似的响应,但在响应中,键包含在引号中:
我不熟悉PHP和vis.PHP中使用的可视化库,但如果您能够添加这些引号,我几乎可以肯定它会起作用
我使用了一个带有对象表示法的tabledate,就像你在.NET中做的那样,这是我唯一看到的区别
希望能有所帮助,我知道这是一篇老文章,但对于像我这样的人来说,在将来我曾经遇到过这个问题,只要用非工作代码修复这一行就行了
query.setQuery('SELECT date,level FROM tank1 ORDER BY date')代码>
进入
query.setQuery('SELECT*')代码>
这应该行得通。如果没有,请尝试解决怀孕问题首先,汉斯,我感谢你花时间帮助我!但是用了这个之后,我还是得到了一张空白页。最初我把它作为“chart.draw”选项{width:400,height:300}之一,但后来我删除了它,认为约束是我的问题。然而,即使我再次测试它,我仍然没有得到任何显示。我试过firebug,但它只是告诉我我的PHP脚本运行正常。你知道在哪里对javascript进行故障排除以查看错误吗?除了document.write,还有其他技术吗?因为我不能用它来解析google数据表类型?只是想弄清楚,您是否尝试过将HTML中的“”替换为“”?如果您确认使用此更改仍然会得到一个空白屏幕,我将尝试从文本数据而不是通过AJAX调用创建图表。这是分而治之的方法:你的问题是AJAX部分还是图表显示部分。基本上我已经做到了。我能够获取从SQL查询返回的确切数据,并将其填充到google代码中,而不是语法数据。addColumn('date','datetime')等我使用json格式:cols:[{id:'date',label:'date',type:'datetime'},等等…它成功了!我能够使用SQL查询从我的PHP函数逐字返回的确切数据,并用它生成一个绘图…然后为了完整起见,我从代码游乐场获取工作代码并将其加载到我的服务器中。它也成功了。我尝试的另一件事是获取PHP SQL查询返回的变量数据下载并执行document.write(data.getNumberOfColumns())和rows。这肯定返回了正确的值(我使用的是一个相当小的数据库,30行,2列,所以我并没有在这里用数据重载google)。因此,我知道变量正在创建中,我可以看到它具有正确的名称、类型和值,并且我知道语法是有效的。但由于某种原因,当我调用annotatedtimeline.draw(),(或chart.draw(),这取决于我对google的命名。当然,可视化)。我仍然得到一个空白页。因此,您有工作和非工作代码版本。您是否采取了下一步,比较工作和非工作代码,并尝试剪切和粘贴,以查看问题出现/消失的原因。这是我可以在PHP代码中设置的内容吗?我仍然没有得到此工作代码在上面的“功能性”代码部分,我可以在不加引号的情况下指定id和类型,JSON响应时也不加引号。我上面展示的代码有没有具体的修复方法
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('visualization', '1', {packages: ['annotatedtimeline']});
function drawChart() {
//Tell Google Visualization where your script is
var query = new google.visualization.Query('/vis.php');
query.setQuery('SELECT date,level FROM tank1 ORDER BY date');
query.send(function(result) {
//if there is an error
document.write(result.getDetailedMessage());
if(result.isError()) {
alert(result.getDetailedMessage());
} else {
// otherwise plot the data
var data = result.getDataTable();
// Inserting a document.write(data.getNumberOfRows()) proves that the datatable is loading seemingly correctly here
var annotatedtimeline = new google.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
annotatedtimeline.draw(data, { 'displayAnnotations': false });
}
});
}
google.setOnLoadCallback(drawChart);
</script>
</head>
<body>
<div id="chart_div" style="width:400px; height:250px"></div>
</body>
</html>
Important: To use this visualization, you must specify the height and width
of the container element explicitly on your page. So, for example:
<div id="chart_div" style="width:400; height:250"></div>.
{id:'date', type:'date'}
{"id":"date", "type":"date"}