Как я могу импортировать нулевое значение в CSV-файл в моей таблице MySQL? - PullRequest
0 голосов
/ 10 июля 2019

Я хотел бы знать, как я могу импортировать файл 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-файл со всеми данными, я могу его импортировать, но проблема заключается в том, что существует нулевое значение.

1 Ответ

1 голос
/ 10 июля 2019

Я думаю, что ваш образец линии 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')

И использование real_escape_string будет корректно обрабатывать такие имена, как O'Sullivan и Johnny ';DROP TABLE test;.

...