You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让.js读取PHP语法,从MySQL获取甘特图数据?

实现从MySQL数据库动态生成甘特图数据的方案

当然可以实现动态从数据库获取数据生成甘特图,不过不是让.js文件直接解析PHP语法,而是通过PHP动态生成JS数据或者AJAX异步请求PHP接口获取数据这两种常见方式来实现,下面给你详细的步骤和代码示例:

方法一:将数据文件改为PHP动态生成JS

这种方法是把原来的data.js改成PHP文件,让PHP先从数据库查询数据,再输出符合JS格式的变量,页面依然像引入JS一样引入这个PHP文件。

步骤1:创建data.php文件

<?php
// 1. 连接数据库(请替换成你的数据库信息)
$conn = mysqli_connect('localhost', '你的用户名', '你的密码', '你的数据库名');
if (!$conn) {
    die("数据库连接失败: " . mysqli_connect_error());
}

// 2. 查询数据库数据(根据你的表结构调整SQL语句)
// 假设你的表名为tasks,包含字段:id, task_name, planned_start, planned_end, actual_start, actual_end, actual_color
$sql = "SELECT id, task_name, planned_start, planned_end, actual_start, actual_end, actual_color FROM tasks";
$result = mysqli_query($conn, $sql);

// 3. 构建甘特图所需的JS数据结构
$ganttData = [];
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    $task = [
        'id' => $row['id'],
        'name' => $row['task_name'],
        'series' => [
            [
                'name' => 'Planned',
                'start' => "new Date(" . date('Y,n,j', strtotime($row['planned_start'])) . ")",
                'end' => "new Date(" . date('Y,n,j', strtotime($row['planned_end'])) . ")"
            ],
            [
                'name' => 'Actual',
                'start' => "new Date(" . date('Y,n,j', strtotime($row['actual_start'])) . ")",
                'end' => "new Date(" . date('Y,n,j', strtotime($row['actual_end'])) . ")",
                'color' => $row['actual_color'] ? "'" . $row['actual_color'] . "'" : "'#ff0000'"
            ]
        ]
    ];
    $ganttData[] = $task;
}

// 4. 输出JS格式的变量,处理Date对象的格式问题
header('Content-Type: application/javascript');
$jsonData = json_encode($ganttData);
// 替换JSON中的字符串格式Date为JS可识别的Date对象
$formattedData = str_replace('"new Date(', 'new Date(', str_replace(')"', ')', $jsonData));
echo "var ganttData = " . $formattedData . ";";

// 关闭数据库连接
mysqli_close($conn);
?>

步骤2:修改index.html的引入路径

把原来引入data.js的代码改成引入data.php:

<script type="text/javascript" src="data.php"></script>

这样页面加载时,PHP会动态生成JS数据,和原来的硬编码效果一致,但数据来自数据库。

方法二:使用AJAX异步获取数据

这种方法更灵活,页面先加载,再通过AJAX请求PHP接口获取JSON数据,然后初始化甘特图。

步骤1:创建PHP接口文件get_gantt_data.php

<?php
// 连接数据库(同上)
$conn = mysqli_connect('localhost', '你的用户名', '你的密码', '你的数据库名');
if (!$conn) {
    die(json_encode(['error' => '数据库连接失败']));
}

// 查询数据
$sql = "SELECT id, task_name, planned_start, planned_end, actual_start, actual_end, actual_color FROM tasks";
$result = mysqli_query($conn, $sql);

$ganttData = [];
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    // 把日期转成JS可识别的时间戳(毫秒)
    $task = [
        'id' => $row['id'],
        'name' => $row['task_name'],
        'series' => [
            [
                'name' => 'Planned',
                'start' => strtotime($row['planned_start']) * 1000,
                'end' => strtotime($row['planned_end']) * 1000
            ],
            [
                'name' => 'Actual',
                'start' => strtotime($row['actual_start']) * 1000,
                'end' => strtotime($row['actual_end']) * 1000,
                'color' => $row['actual_color'] ?: '#ff0000'
            ]
        ]
    ];
    $ganttData[] = $task;
}

// 输出JSON格式数据
header('Content-Type: application/json');
echo json_encode($ganttData);

mysqli_close($conn);
?>

步骤2:修改index.html的JS代码

去掉原来的data.js引入,改成AJAX请求数据后初始化甘特图:

<script type="text/javascript">
$(function () {
    // 用AJAX获取数据
    $.ajax({
        url: 'get_gantt_data.php',
        type: 'GET',
        dataType: 'json',
        success: function(ganttData) {
            // 把时间戳转成Date对象
            ganttData.forEach(function(task) {
                task.series.forEach(function(seriesItem) {
                    seriesItem.start = new Date(seriesItem.start);
                    seriesItem.end = new Date(seriesItem.end);
                });
            });
            
            // 初始化甘特图
            $("#ganttChart").ganttView({
                data: ganttData,
                slideWidth: 900,
                behavior: {
                    onClick: function (data) {
                        var msg = "You clicked on an event: { start: " + data.start.toString("M/d/yyyy") + ", end: " + data.end.toString("M/d/yyyy") + " }";
                        $("#eventMessage").text(msg);
                    },
                    onResize: function (data) {
                        var msg = "You resized an event: { start: " + data.start.toString("M/d/yyyy") + ", end: " + data.end.toString("M/d/yyyy") + " }";
                        $("#eventMessage").text(msg);
                    },
                    onDrag: function (data) {
                        var msg = "You dragged an event: { start: " + data.start.toString("M/d/yyyy") + ", end: " + data.end.toString("M/d/yyyy") + " }";
                        $("#eventMessage").text(msg);
                    }
                }
            });
        },
        error: function() {
            alert('获取甘特图数据失败');
        }
    });
});
</script>

注意事项

  • 请根据你的实际数据库表结构调整SQL语句和字段映射,确保字段名和你数据库里的一致。
  • 建议使用mysqli或PDO操作数据库,避免使用已废弃的mysql_*函数(比如你提到的mysql_fetch_array,代码里做了兼容,但更推荐用新的扩展)。
  • 数据库连接信息不要硬编码在代码里,最好放在单独的配置文件中,并且做好权限控制,避免泄露。

内容的提问来源于stack exchange,提问作者IT_Girl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:03:38