【问题标题】:PHP - fputcsv: put JSON values retrieved from MySQL field in separate columnsPHP - fputcsv:将从 MySQL 字段中检索到的 JSON 值放在单独的列中
【发布时间】:2015-03-04 14:37:02
【问题描述】:

我有一个 MySQL 列,其中包含一个问题编号 (0-165) 的 JSON 字符串作为键,问题答案(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;
            }

        }



这是代码的输出:



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



是否可以在不改变我的数据库结构的情况下做到这一点?我在 stackoverflow 上看到了将 JSON 值放入单独的列中的代码,但是我如何将它集成到我现有的检索所有其他 MySQL 列的代码中?

提前谢谢大家。

【问题讨论】:

  • 您的代码易受 SQL 注入攻击;你应该阅读how to prevent them in PHP
  • 这两张截图有什么关系?
  • @RocketHazmat:第一个屏幕截图是我上面的代码输出的内容,第二个屏幕截图是我想要的输出。
  • @chakeda:将mysql_fetch_row 更改为mysql_fetch_assoc
  • 不要使用mysql_,全部改成mysqli_

标签: php mysql json csv fputcsv


【解决方案1】:

试试这个方法

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

这不是最好的解决方案,只是值得思考和开始。

希望对你有帮助

【讨论】:

  • 我复制粘贴了代码,结果导致 CSV 文件损坏,但这是一个很好的起点。 +1
  • 我没有任何数据要测试,你刚刚发布的截图没有数据样本。所以主要问题是每个 json 数组是否具有相同数量的标记并且它们都是有序的。如果不是,您必须在合并数组之前对 $marks 进行一些转换。
【解决方案2】:

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

}

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 1970-01-01
    • 2016-02-08
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2015-09-27
    相关资源
    最近更新 更多