PHP - fputcsv:将从 MySQL 字段中检索到的 JSON 值放在单独的列中

PHP - fputcsv: put JSON values retrieved from MySQL field in separate columns

我有一个 MySQL 列,其中包含一个 JSON 问题编号字符串 (0-165) 作为键和问题答案(1-5 分)作为值。我需要检索所有 MySQL 列,将它们放入一个 .csv 文件中,并在单独的列中包含 JSON 值。

到目前为止,我有一个可用的 PHP 函数,它使用 fputcsv() 将我的 MySQL table 的全部输出到 CSV 文件。这是代码:

        function buildcsv(){
            $start = $_POST['start'];
            $end = $_POST['end'];
            $result = mysql_query('SELECT fullname, institution, email, timestamp, responsesJSON
                FROM `members` WHERE timestamp BETWEEN "'.$start.'" AND "'.$end.'"');
            if (!$result) die('Couldn\'t fetch records');
            ob_start();
            $fp = fopen('php://output', 'w');
            if ($fp && $result) {
                while ($row = mysql_fetch_row($result)) {
                    fputcsv($fp, array_values($row));
                }
                fclose($fp);
                return ob_get_clean();
            }else{
                $error = "Error. Either there is no data or invalid date.";
                return $error;
            }

        }



下面是代码的输出:



但是,我需要我的 CSV 输出类似于以下模型:



是否可以在不更改数据库结构的情况下执行此操作?我在 Whosebug 上看到代码将 JSON 值放入单独的列中,但我如何将它集成到我现有的代码中以检索所有其他 MySQL 列?

提前谢谢大家。

试试这个方法

while ($row = mysql_fetch_row($result)) {
        $marks = json_decode($row['responsesJSON'],true);
        unset($row['responsesJSON']);
        fputcsv($fp, array_merge(array_values($row),array_values($marks)));
    }

这不是最佳解决方案,只是值得深思的问题和起点。

希望对您有所帮助

非常感谢@KimAlexander 和@RocketHazmat 的建议,我明白了:

function buildcsv(){
    $start = $_POST['start'];
    $end = $_POST['end'];
    $result = mysql_query('SELECT fullname, institution, email, timestamp, responsesJSON
        FROM `members` WHERE timestamp BETWEEN "'.$start.'" AND "'.$end.'"');
    if (!$result) die('Couldn\'t fetch records');
    ob_start();
    $fp = fopen('php://output', 'a');
    if ($fp && $result) {
        while ($row = mysql_fetch_assoc($result)) {
            $personal = array($row['fullname'], $row['institution'], $row['email'], $row['timestamp']);
            $scores = json_decode($row['responsesJSON'], true);
            fputcsv($fp, array_merge($personal, $scores));
        }
        fclose($fp);
        return ob_get_clean();
    }else{
        $error = "Error. Either there is no data or invalid date.";
        return $error;
    }

}