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

时间:2015-01-06 20:49:56

标签: php mysql json csv fputcsv

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

到目前为止,我有一个有效的PHP函数,它使用fputcsv()将整个MySQL表输出到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;
            }

        }

这是代码的输出:

Current CSV output


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

Desired CSV output



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

提前谢谢大家。

2 个答案:

答案 0 :(得分:2)

试试这种方式

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)));
    }

这不是最好的解决方案,但只是思考的问题并指出要开始。

希望它可以提供帮助

答案 1 :(得分:1)

非常感谢@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;
    }

}