基于MySQL的Google Chart服务器部署异常及SQL #1055报错问询
解决Google Chart部署后不显示及SQL
only_full_group_by错误问题 首先,你的问题根源其实出在SQL语句不符合服务器的MySQL严格模式——本地环境可能没开启这个模式,所以能正常运行;但服务器默认开启了sql_mode=only_full_group_by,导致SQL查询报错、拿不到数据,Google Chart自然就显示不出来了。
第一步:修复SQL语句的only_full_group_by错误
这个模式要求SELECT列表里的非聚合字段,必须出现在GROUP BY子句中,或者与GROUP BY的字段存在函数依赖。你原来的SQL里SELECT date但GROUP BY DAY(date),不符合规则,所以phpMyAdmin会报错。
推荐两种正确的SQL写法:
写法一:按格式化后的日期分组(最简洁)
把日期格式化为YYYY-MM-DD的形式,同时用这个格式化后的字段做分组和查询:
$views = $db->query("SELECT DATE(date) as post_date, COUNT(id_master_post) as post_count FROM master_post GROUP BY post_date ASC");
写法二:按年、月、日维度分组(保留精确日期)
如果需要保留当天的具体时间信息,可以按年、月、日三个维度分组,并用聚合函数取当天的最早日期:
$views = $db->query("SELECT MIN(date) as post_date, COUNT(id_master_post) as post_count FROM master_post GROUP BY YEAR(date), MONTH(date), DAY(date) ASC");
第二步:修复JavaScript数据生成的语法错误
原来的循环会在最后一条数据后多一个逗号,这会导致JavaScript语法错误,也是Chart不显示的潜在原因。可以先把数据存到数组里,再用implode拼接,避免多余逗号:
$dataRows = []; $views->execute(); while ($value2 = $views->fetch()) { // 如果用DATE(date)格式化后,直接用$value2['post_date']即可,无需substr $dateStr = substr($value2['post_date'], 0, -9); $dataRows[] = "['{$dateStr}', {$value2['post_count']}]"; }
然后在JavaScript中输出拼接好的内容:
<?php echo implode(',', $dataRows); ?>
第三步:排查服务器环境的其他潜在问题
- 检查服务器的PHP错误日志,确认是否存在数据库连接失败、权限不足等问题;
- 确保服务器可以正常访问Google Charts的CDN(国内服务器若访问受限,可考虑使用国内镜像或配置代理);
- 保证页面里的
<div id="Views">在脚本执行前已经加载完成,建议把Google Charts的脚本放在<head>标签里。
修改后的完整代码示例:
<head> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script> google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([ ['Date', 'Master Posts'], <?php $views = $db->query("SELECT DATE(date) as post_date, COUNT(id_master_post) as post_count FROM master_post GROUP BY post_date ASC"); $views->execute(); $dataRows = []; while ($value2 = $views->fetch()) { $dataRows[] = "['{$value2['post_date']}', {$value2['post_count']}]"; } echo implode(',', $dataRows); ?> ]); var options = { title: 'Master Posts Created', }; var chart = new google.visualization.PieChart(document.getElementById('Views')); chart.draw(data, options); } </script> </head> <body> <div id="Views" style="width: 500px; height: 500px; float: left;"></div> </body>
内容的提问来源于stack exchange,提问作者jazuly aja




