CSV-загрузка с помощью PHP / MySQL

Я пытаюсь получить файл csv, загруженный в мою базу данных, в течение 1 недели, я прочитал множество учебных пособий и понятия не имею, что я делаю неправильно, это простой код, который я слишком глуп, чтобы получить право. Любая помощь будет золотой! 🙂

if(isset($_FILES['file'])){ $csv_file = $_FILES['file']['name']; $sql = <<<eof LOAD DATA INFILE '$csv_file' INTO TABLE test_csv FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (name,house,po) eof; $result = $dbh->query($sql); } echo $csv_file .' has successfully been loaded'; ?> <!DOCTYPE html> <html> <head> <title>CSV to MySQL Via PHP</title> </head> <body> <form enctype="multipart/form-data" method="POST"> <input name="file" type="file"> <input type="submit" value="Upload"> </form> </body> </html> 

Когда мне приходилось импортировать CSV в таблицу базы данных, я всегда писал свой собственный парсер / импортер csv. Это довольно просто.

Вот пример.

test.csv

 Firstname,Lastname,Age "Latheesan","Kanes",26 "Adam","Smith",30 

test.php

 <?php // Mini Config $csv_file = 'test.csv'; $delimiter = ','; $enclosure = '"'; $skip_first_row = true; $import_chunk = 250; // Parse CSV & Build Import Query $import_queries = array(); $first_row_skipped = false; if (($handle = fopen($csv_file, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, $delimiter, )) !== FALSE) { if ($skip_first_row && !$first_row_skipped) { $first_row_skipped = true; continue; } list($firstname, $lastname, $age) = $data; $import_queries[] = "INSERT INTO myTable (firstname, lastname, age) VALUES ('$firstname', '$lastname', $age);"; } fclose($handle); } // Proceed if any data got parsed if (sizeof($import_queries)) { foreach(array_chunk($import_queries, $import_chunk) as $queries) { $dbh->query(implode(' ', $queries)); } } ?> 

Разработанные запросы будут выглядеть так (если вы print_r it):

 Array ( [0] => INSERT INTO myTable (firstname, lastname, age) VALUES ('Latheesan', 'Kanes', 26); [1] => INSERT INTO myTable (firstname, lastname, age) VALUES ('Adam', 'Smith', 30); ) 

У вас есть два варианта для фактического импорта в db:

  1. Создайте сборку запроса sql импорта и выполните его в пакете (array_chunk) – это означает меньше запросов к вашему db. Однако, как вы можете видеть, я не проверял значения из CSV – то есть я доверяю своему источнику данных и не избегаю ничего – немного опасно …

  2. Вы выполняете запрос, как только вы его построили с экранированием значений – небольшой недостаток заключается в том, что он выполнит один запрос на строку в csv ….

Надеюсь это поможет.