Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Импорт из CSV в базу
Форумы портала PHP.SU » » Вопросы новичков » Импорт из CSV в базу

Страниц (1): [1]
 

1. kikosik666 - 10 Августа, 2017 - 16:10:02 - перейти к сообщению
Здравствуйте, у меня такая проблема. Код импортирует данные CSV файла в таблицу на базе. Каждая строка CSV составляет из 7 данных которые разделены запятыми.

Например

CHECKID,NAME,SURNAME,MIDDLENAME,POSITION,WORKPLACE,WORKTIME
14877,Ivan,Petrov,Aleksandrovich,Acountant,Office,9 hour


Каждый день импортируется новый CSV файл и в каждом файле CHECKID может повтарится. Как сделать чтобы код проверял в базе и в CSV файле, если в таблице(база) уже есть такой CHECKID он не импортировал данную страку из CSV файла, а все остальные строки импортировал? То есть если есть в базе такой запись - 14877, он не импортировал строку из CSV)

Заранее спасибо))

Вот код.

<?php
error_reporting(0); // Выключаем показ ошибок. Чтобы их видеть - вместо 0 поставьте E_ALL
include('db_conn.php');
$max_file_size = 5; // Максимальный размер файла в МегаБайтах
if($_POST['update']=='OK'){
// СТАРТ Загрузка файла на сервер
if($_FILES["filename"]["size"] > $max_file_size*1024*1024){
echo 'Размер файла превышает '.$max_file_size.' Мб!';
include('form_file_load.php');
exit;
}
if(copy($_FILES["filename"]["tmp_name"],$path.$_FILES["filename"]["name"])){
echo("Добавлен "."<b>".$_FILES["filename"]["name"]."</b>"." !<br />");
}
else{
echo 'Errorլ<br>';
include('form_file_load.php');
exit;
}

$file = fopen('php://memory', 'w+');
fwrite($file, iconv('UTF-8', 'UTF-8', file_get_contents($_FILES["filename"]["name"])));
rewind($file);


$r = 1;
while (($row = fgetcsv($file, 1000, ",")) != FALSE) {
$r++;
if($r == 2) {continue;} // Не дает записать в БД Заголовки Прайс-листа
$ins="INSERT INTO `Table1` (`CHECKID`,`NAME`,`SURNAME`,`MIDDLENAME`, `POSITION`, `WORKPLACE`,`WORKTIME`
)VALUES('$row[0]','$row[1]','$row[2]', '$row[3]', '$row[4]', '$row[5]', '$row[6]', '$row[7]' )";
$query = mysql_query($ins);
if(!$query) die('Error!!!');
}
fclose($file);
echo 'Refresh page - '.$r;
header('Location: my_panel.php');

}
else{
include('form_file_load.php');
}
?>
2. andrewkard - 10 Августа, 2017 - 16:22:02 - перейти к сообщению
Установите эту колонку как уникальный ключ. При заливке INSERT IGNORE

либо перед заливкой сделайте запрос на выборку всех CHECKID,

вытащите все строки которые нужно, сформируйте один большой запрос и вставьте в БД.

При работе с БД лучше использовать prepared_statements

https://www[dot]w3schools[dot]com/php/ph[dot][dot][dot]d_statements[dot]asp
3. kikosik666 - 10 Августа, 2017 - 16:45:52 - перейти к сообщению
Тоесть если напишу Insert Ignore, вопрос будет решен?

Так?

$ins="INSERT IGNORE INTO `Table1` (`CHECKID`,`NAME`,`SURNAME`,`MIDDLENAME`, `POSITION`, `WORKPLACE`,`WORKTIME`
)VALUES('$row[0]','$row[1]','$row[2]', '$row[3]', '$row[4]', '$row[5]', '$row[6]', '$row[7]' )";





andrewkard пишет:
Установите эту колонку как уникальный ключ. При заливке INSERT IGNORE

либо перед заливкой сделайте запрос на выборку всех CHECKID,

вытащите все строки которые нужно, сформируйте один большой запрос и вставьте в БД.

При работе с БД лучше использовать prepared_statements

https://www.w3schools.com/php/php_mysql_prepared_statements.asp
4. andrewkard - 11 Августа, 2017 - 16:41:32 - перейти к сообщению
kikosik666 пишет:
Тоесть если напишу Insert Ignore, вопрос будет решен?

если к этой колонке применить unique-key

 

Powered by ExBB FM 1.0 RC1