PHP需要fputcsv来打印NULL而不是空单元格

时间:2014-06-11 16:58:45

标签: php mysql csv fputcsv

我正在使用fputcsv从mysql表创建一个csv文件,一切正常,除非数据库表中有空列或NULL,因为输出csv单元格为空,而不是打印NULL。

这是正常行为吗?

使用

继承剧本
        private function me_calendar_report() {

        ini_set("memory_limit","256M");

        $calendar = array();

        $this->load->model('me_reports_model');

        $calendar = $this->me_reports_model->get_all_resource_calendar();

        $headers = array(
            array('id', 'Resource ID', 'Job ID', 'From date', 'To date', 'Colour', 'Resource Type', 'Is provisional', 'Fixed price'
            ));

        $calendar_data = array();

        foreach($calendar as $i) {
            $calendar_data[] = array(
                $i->id,
                $i->resource_id,
                $i->job_id,
                $i->from_date,
                $i->to_date,
                $i->colour,
                $i->resource_type,
                $i->is_provisional,
                $i->fixed_price
            );
        }

        $csv = array_merge($headers, $calendar_data);

        $fp = fopen('report_repository/resource_calendar-' . date('d-m-Y') . '.csv', 'w');

        foreach ($csv as $fields) {
            fputcsv($fp, $fields);
        }

        fclose($fp);
        return 'report_repository/resource_calendar-' . date('d-m-Y') . '.csv';

    } 

2 个答案:

答案 0 :(得分:3)

是。 CSV无法显示空值,NULL实际上是字符串“NULL”。

如果你想要的话,你可以在写作前进行预处理:

foreach ($calendar_data as $key => $value) {
  if ($value === null) {
    $calendar_data[$key] = "NULL";
  }
}

请注意,您实际上是在创建自己的专用CSV格式,如果有其他人需要使用它,您应该记住这些格式。同样,在加载它时,您还可以在使用fgetcsv:

检索后对该行进行预处理
foreach ($calendar_data as $key => $value) {
  if ($value === "NULL") {
    $calendar_data[$key] = null;
  }
}

但是仍然存在歧义,你刚刚将它从空字符串vs null移动到字符串“NULL”vs null。如果这是一个问题,您可以使用YAML,JSON或SQL转储。

答案 1 :(得分:0)

在现代版本的PHP中,null值在csv中呈现为空字符串。 看到以下代码:

<?php    
$filePointer = \fopen('php://memory', 'wb');
$row= ['ciao', 'bo;no', null, '', 12];
\fputcsv($filePointer, $row, ';');
\rewind($filePointer);
$a = \stream_get_contents($filePointer);
\fclose($filePointer);
echo $a;

另请参阅https://3v4l.org/BoeJF