You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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 dateGROUP 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

火山引擎 最新活动