либо проблема с кодом, либо csv вызывает проблемы при импорте. Что-нибудь, что могло быть проблемой с кодом, или с CSV?
Когда я запускаю скрипт, я получаю сообщение по умолчанию: CSV-файл не читается
Это работает для 5 из 15 файлов и не может видеть очевидную проблему или решение.
http://www.dodgejeffgen.org/gs/issue1.csv
<?php
ini_set('auto_detect_line_endings',TRUE);
ini_set('post_max_size', '128M');
ini_set('upload_max_filesize', '128M');
function clean($link, $str, $default ='') {
if (!isset($str)) $str = $default;
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysqli_real_escape_string($link, $str);
}
$host_name = "some host";
$database = "some db";
$user_name = "some user";
$password = "some pass";
$connect = mysqli_connect($host_name, $user_name, $password, $database);
if (mysqli_connect_errno())
{ echo "Failed to connect to MySQL: " . mysqli_connect_error(); } else {}
$lines = $value1 = $value2 = $data = 0;
if ($_FILES["csv"]["size"] > 0) {
//get the csv file
$file = $_FILES["csv"]["tmp_name"];
$handle = fopen($file,"r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
//print_r($data).'<br />';
if ($data[0]) {
$sql = "INSERT INTO `articles` (`name`, `reference`) VALUES ('".clean($connect, $data[0])."','".clean($connect, $data[1])."')";
//echo $sql.'<br />';
if (mysqli_query($connect, $sql)) { } else { echo "Error: " . $sql . "<br>" . mysqli_error($connect); }
$lines++;
}
}
echo "<b>Your file has been imported.</b><br>";
echo "Found a total of ".$lines." records in this csv file.<br />";
} else { echo 'CSV File not readable.<br />';}
?>
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data" name="form1" id="form1">
Choose your file: <br />
<input name="csv" type="file" id="csv" />
<input type="submit" name="Submit" value="Submit" />
</form>
Я бы порекомендовал использовать LOAD DATA LOCAL INFILE. Просто загрузите ваш CSV-файл в какое-то место на вашем сервере и выполните следующий запрос MySQL
LOAD DATA LOCAL INFILE '/path/to/csv_file.csv' INTO TABLE articles
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
(@col1,@col2) set `name`=TRIM(@col1),`reference`=TRIM(@col2)
Может быть лучше использовать LOAD DATA LOCAL INFILE
как Индра Кумар С. рекомендует. Вы можете загрузить его во временную таблицу (CREATE TEMPORARY TABLE ...
), затем используйте запросы mysql для распространения этих данных в любые постоянные таблицы, в которых вы храните данные.
Помните в дополнение к FIELDS TERMINATED BY
а также LINES TERMINATED BY
существует также FIELDS ESCAPED BY
плюс другие варианты. Посмотреть здесь: http://dev.mysql.com/doc/refman/5.7/en/load-data.html
Самое интересное в загрузке в MySQL — это то, что вы можете использовать MySQL, иногда с помощью PHP, для очистки данных. MySQL должен выполнять довольно хорошую работу по обрезке краев, но вы можете предпочесть выбрать PHP и затем записать обратно в MySQL для более сложной очистки, такой как удаление неразрывных пробелов, лишних пробелов внутри строк или не-ASCII символов.
Когда я сделал что-то вроде этого, я думаю, что я сделал один прогон через CSV, чтобы определить типы данных для каждого столбца (varchar
, int
, decimal
, text
, datetime
), а затем создал временную таблицу с соответствующими типами данных, и сделал LOAD DATA INFILE
к этому столу.