@alexspi

Как правильно сделать Update базы данных при импорте из CSV?

Еще раз всем привет. Написал небольшой код для импорта из csv в mysql
-csv в массив преобразует нормально
-импортирует нормально
а вот с тем что бы он по столбцу если значение есть до делал update а не insert ни как не могу разобраться
<?php

$allowed_extensions = array('csv');

$upload_path = '/completed';

if (!empty($_FILES['file'])) {

	if ($_FILES['file']['error'] == 0) {
	$file = explode(".", $_FILES['file']['name']);
	$extension = array_pop($file);

	if (in_array($extension, $allowed_extensions)) {

		if (move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name'])) {

			$handle = $_FILES['file']['name'];


$options = array(
	'enable'        => true, // Скрипт работает только если значение TRUE
	/* Настройки CSV */
	'filename'      => $handle, // Имя файла CSV. Находиться должен в одной папке со скриптом
	'delimiter'     => ';', // Какой разделитель используется
	/* Настройки подключения к БД */
	'db_server'     => 'localhost', // Сервер БД
	'db_user'       => 'root', // Имя пользователя
	'db_password'   => '', // Пароль
	'db_base'       => 'dvigloshop' // Имя базы данных

);

if(!$options['enable']) die('Скрипт отключен, дальнейшая обработка данных невозможна!');

/*
*
*  Функции скрипта
*
*/

// Основная функция, из импортируемого файла выбираем данные в массив
// !Во время первой итерации значения первой строки будут являться ключами ассоциативного массива!

function csv_to_array($filename='') {
	if(!file_exists($filename) || !is_readable($filename)){
		return FALSE;
	}
	global $options;
	$header = NULL;
	$data = array();
	if (($handle = fopen($filename, 'r')) !== FALSE) {
		while (($row = fgetcsv($handle, 1000, $options['delimiter'])) !== FALSE) {
			if(!$header)
				$header = $row;
			else
				$data[] = array_combine($header, $row);
		}
		fclose($handle);
	}
	return $data;
}


/*
*  Подключаемся к Базе Данных
*
*/

$link = mysqli_connect($options['db_server'], $options['db_user'], $options['db_password'],$options['db_base']);
if (!$link) {
	die('Ошибка соединения: ' . mysqli_error($link));
}

// Указываем, что общаемся с БД только в UTF-8

mysqli_query($link,"SET NAMES 'utf8'");
mysqli_query($link,"SET CHARACTER SET 'utf8'");
mysqli_query($link,"SET SESSION collation_connection = 'utf8_general_ci'");

// Выбираем интересующую нас Базу

//$db_selected = mysqli_select_db($link,$options['db_base']);
//if (!$db_selected) {
//	die ('Не удалось выбрать базу db_data: ' . mysqli_error($link));
//}

// Отключаем индексацию таблицы, для максимального быстродействия

mysqli_query($link,"ALTER TABLE `".$options['db_base']."` DISABLE KEYS");
$obn=0;
$dob=0;
foreach (csv_to_array($options['filename']) as $val) {
	$rrrr="";
	// Тут собственно делаем запросы в соответствии с задачей
	echo 'Массив входящий';
	print_r($val);
	echo '</br></br>';

//получаю значение поля
	$zavnumber = current($val);
	//выбираю из базы по этому значению
	$zapnumber = "SELECT * FROM `sdvd_products` WHERE `zavnumber`='".$zavnumber."'";
//	$querynumber = mysqli_query($link,$zapnumber);
//	$row = mysqli_fetch_assoc($querynumber);
//	$rrrr = $row["zavnumber"];

	$zapnumber = mysqli_real_escape_string($link, $zapnumber);

	if ($result = mysqli_query($link, $zapnumber)) {
		echo 'Переменная result';
		print_r($result);
		echo '</br></br>';
		/* извлечение ассоциативного массива */
		while ($row = mysqli_fetch_assoc($result)) {
			printf ($row);
			$rrrr = $row["zavnumber"];
		}
		echo "ffff".$rrrr;
		echo '</br></br>';
		/* удаление выборки */
		mysqli_free_result($result);
	}



	echo 'Номер';
	var_dump($zavnumber);
	echo '</br></br>';
	echo 'Запрос на номер';
	var_dump($zapnumber);
	echo '</br></br>';
//	print_r($querynumber);
//	echo '</br></br>';
//	print_r($rrrr);
//	echo '</br></br>';

	if ($rrrr !== ""){

	$sql_values = array();
	while(list($key,$value) = each($val)){
		$keyval = "`".$key ."` = '".$value."'";

		print_r($keyval);
		echo '</br></br>';

		array_push($sql_values,$keyval);
	}

		print_r($sql_values);
		echo '</br></br>';
        $tab = implode(', ',$sql_values);
		$sql = "UPDATE `sdvd_products` SET ". $tab ." WHERE `zavnumber`=\'".$zavnumber."\'";

        $obn++;
		print_r($sql.'</br>');
	}else{
		$sql  = "INSERT INTO `sdvd_products`";
		// implode keys of $array...
		$sql .= " (`".implode("`, `", array_keys($val))."`)";
		// implode values of $array...
		$sql .= " VALUES ('".implode("', '", $val)."') ";

        $dob++;

		print_r($sql.'</br>');
	}

		mysqli_query($link,$sql);


    $sql = "";
}

// Включаем индексацию таблицы

mysqli_query($link,"ALTER TABLE `".$options['db_base']."` ENABLE KEYS");

// Закрываем соединение с БД

mysqli_close($link);

echo"Обновлено ".$obn;
		echo"Добавлено ".$dob;


		}
	} else {
				$message = '<span class="red">Only .csv file format is allowed</span>';
			}

		} else {
			$message = '<span class="red">There was a problem with your file</span>';
		}

	}

?>
<!DOCTYPE HTML>
<html lang="en">
<head>
	<meta charset="utf-8" />
	<title>Upload CSV to MySQL</title>
	<meta name="description" content="" />
	<meta name="keywords" content="" />
	<link href="css/core.css" rel="stylesheet" type="text/css" />
	<!--[if lt IE 9]>
	<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
	<![endif]-->
</head>
<body>

<section id="wrapper">	
	
	<form action="" method="post" enctype="multipart/form-data">
	
		<table cellpadding="0" cellspacing="0" border="0" class="table">
			<tr>
				<th><label for="file">Select file</label> <?php echo $message; ?></th>
			</tr>
			<tr>
				<td><input type="file" name="file" id="file" size="30" /></td>
			</tr>
			<tr>
				<td><input type="submit" id="btn" class="fl_l" value="Submit" /></td>
			</tr>
		</table>
		
	</form>
	
</section>

</body>
</html>

формат csv
zavnumber;price;kolichestvo
ttt132-12059;86753;5
99132-12051;86753;3
99132-12052;86753;8
954442-12053;86753;3
99132-12054;86753;3
99132-12055;55553;3
333132-12056;86753;3
rrr32-12057;86753;3
99132-12058;86753;3
99132-12059;86753;4
99132-12060;86753;3
99132-12061;86753;3
99132-12062;86753;3
99132-12063;86753;3
99132-12064;86753;3
99132-12065;86753;3
  • Вопрос задан
  • 1131 просмотр
Пригласить эксперта
Ответы на вопрос 1
berezuev
@berezuev
#define TRUE FALSE
LOAD DATA INFILE file.csv REPLACE INTO TABLE t1;
И работать оно будет в сотни раз быстрее вашего велосипеда
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы