首页 > 解决方案 > 如何将 csv 文件中的空值导入到我的 mysql 表中?

问题描述

我想知道如何将具有空值的 CSV 文件导入到我的 MySQL 表中。

这是我在 PHP 中用于将 CSV 文件导入 MySQL 表的代码。

<?php

class csv extends mysqli {

    private $state_csv = false;
    public function __construct() {

        parent::__construct("localhost","","","");

        if ($this->connect_error) {
            echo "File to connect Database: ". $this ->connect_error;
        }
    }

    public function import($file=''){
        $file = fopen($file, 'r');

        while ($row = fgetcsv($file)) {

            $value = "'". implode("','", $row) ."'";
            $q = "INSERT INTO test(cognome,nome,etichetta,email) VALUES(". $value .")";
            if ($this->query($q)) {
                $this->state_csv = true;
            } else {
                $this->state_csv = false;
            }
        }
    }
}

我的 CSV 文件具有以下结构:

Test, Test,,test@test.com

如果我导入包含所有数据的 CSV 文件,我可以导入它,但问题是存在空值时。

标签: phpmysqlcsvfgetcsvimport-csv

解决方案


我猜你的示例 CSV 行

Test, Test,,test@test.com

旨在成为您数据库列的这四个值

 Test
  Test
 (null)
 test@test.com

但是第三列在您的$row数组中显示为零长度字符串,因此它作为零长度字符串插入到表中。您的 INSERT 语句将如下所示:

INSERT INTO test(cognome,nome,etichetta,email) VALUES('Test',' Test','','test@test.com')

看到空字符串etichetta吗?

您需要替换此行:

 $value = "'". implode("','", $row) ."'";

使用一些更智能的代码来循环$row以更复杂的方式解释它们的元素。也许这样的事情会奏效。(未调试!)

$cols = [];
foreach ($row as $col) {
    if (strlen($row) == 0) array_push ($cols, "NULL")
    else array_push ($cols, "'" . mysqli_real_escape_string($row) . "'")
}
$value = implode (',', $cols);

结果将是

INSERT INTO test(cognome,nome,etichetta,email) VALUES('Test',' Test',NULL,'test@test.com')

O'Sullivan而且,使用 real_escape_string 将Johnny ';DROP TABLE test;正确处理名称。


推荐阅读