我正在使用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';
}
答案 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;