Импорт csv через php

320
20 февраля 2017, 19:36

Пытаюсь импортировать csv не через phpmyadmin а через php запрос. Мне предложили вот такой вариант (LOAD DATA INFILE на хостинге закрыт)

$connection = @mysql_connect($host, $user, $pswd)
or die(mysql_error());
$dbs = @mysql_select_db($database, $connection) or
die(mysql_error());

$nam="test.csv";
$separator=";";
$fop = fopen($nam , "r+");
$i=0;

while (!feof($fop))
{
$read = fgets($fop, 3000);
list($id, $name_group, $name, $price, $remainder, $description) = split($separator ,$read);
mysql_query("INSERT INTO test FROM dbtest SET `id`='".$id."',  `name_group`='".$name_group."', `name`='".$name."',  `price`='".$price."',  `remainder`='".$remainder."',  `description`='".$description."' ");
$i++;
}
fclose($fop);
echo "Импортировано в базу записей: ".$i;
?>

В итоге скрипт пишет, что импортировано правильное количество записей, но база пустая. Никаких ошибок на хостинге в логах нет. Как понять почему не записываются данные?

Answer 1

У вас ошибка в sql запросе.

INSERT INTO test FROM dbtest SET `id`='".$id."'

Формат запроса на вставку в базу следующий:

INSERT INTO table_name (column1, column2) VALUES (value1, value2)

Я бы предложил не много переписать код используя PDO и стандартную функцию PHP для чтения csv файлов, например вот так:

$host      = 'localhost';
$db_name   = 'test';
$db_user   = 'root';
$db_passwd = '';
$file      = 'test.csv';
$delimiter = ',';
$verbose   = true;
try {
    $db = new PDO("mysql:host=$host;dbname=$db_name", $db_user, $db_passwd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    $stmt = $db->prepare("INSERT INTO my1 (`id`, `name_group`, `name`, `price`, `remainder`, `description`) VALUES (?, ?, ?, ?, ?, ?) ");
    if (!file_exists($file)){
        throw new Exception("File $file not found!");
    }
    $f = fopen($file, 'r+');
    $data = array();
    while($data[]=fgetcsv($f, 0, $delimiter)){}
    if (empty($data)) {
        throw new Exception("Empty data. Check the source file.");
    }
    $i=0;
    foreach ($data as $entry) {
        if (!is_array($entry) || empty($entry[0])) {
            continue;
        }
        if ($verbose){
            print "\nProcessing entry ID: ". $entry[0];
        }
        $stmt->execute($entry);
        $i++;
    }
    print "\n\n$i rows were successfully processed";
}
catch (Exception $e){
    print "Error: " . $e->getMessage();
}

Исходный csv-файл:

1,group_1,name_1,400,,description_1
2,group_2,name_1,500,,description_2
3,group_3,name_1,600,,description_3
4,group_4,name_1,400,,description_4
5,group_5,name_1,500,,description_5

Результат:

READ ALSO
Установка в PDO констант по умолчанию

Установка в PDO констант по умолчанию

Для вывода результата из запроса нужно установить

235
Организация Domain events с помощью ZF EventManager

Организация Domain events с помощью ZF EventManager

Возможно ли организовать модель доменных событий используя возможности ZF-EventManager?

235
Деление двух чисел

Деление двух чисел

Есть два input'а, я хочу ввести туда числа и в третьем получить результат деленияГде ошибка? Результат не выводится

276