Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2010, 11:09   #11
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

1)http://ru2.php.net/manual/en/function.fgetcsv.php
2)Всё это нужно "упаковать" в один скрипт
3)файл должен быть там где будет выполняться скрипт(те там где стоит клиент)
4)Ключ лучше составить из существующих полей, а не добавлять новый. Я просто так до конца и не понял какие значения у вас уникальны. Вообщем если у вас есть номер артикула постащика, который для него уникален, чтобы ключ в таблице был уникаден для всех поставщиков достаточно сделать составной ключ: артикул поставщика + название поставщика. revision в ключ включать не надо, он нам нужен только для очистки старых значений, которые не будут заменены при LOAD DATA.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 18.08.2010, 16:35   #12
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Уважаемый mv28jam, у меня опять затык
Код:
<form action="" method="post">
<select name="vendor">
<option name="vendor" value="" selected></option>
<option name="vendor" value="v1">Поставщик1</option>
<option name="vendor" value="v2">Поставщик2</option>
<option name="vendor" value="v3">Поставщик3</option>
<option name="vendor" value="v4">Поставщик4</option>
<option name="vendor" value="v5">Поставщик5</option>
<option name="vendor" value="v6">Поставщик6</option>
<option name="vendor" value="v7">Поставщик7</option>
<option name="vendor" value="v8">Поставщик8</option>
<option name="vendor" value="v9">Поставщик9</option>
<option name="vendor" value="v10">Поставщик10</option>
<option name="vendor" value="v11">Поставщик11</option>
<option name="vendor" value="v12">Поставщик12</option>
<option name="vendor" value="v13">Поставщик13</option>
</select>
<input type="submit" value="Start update">
</form>

<?php
if (isset($_POST['vendor']) && $_POST['vendor'] != "") {
	$vendor = $_POST['vendor'];
	$path = 'C:\pricelists\PriceForDBExport\\'. $vendor. '.csv';
	echo "$path <br />";
	echo "Обновление Прайс-листа $vendor <br />";

	if (($handle = fopen($path, "r")) !== FALSE) {
		if (($data = fgetcsv($handle, 1000, ";", " ")) !== FALSE) {
			$vendor_code = $data[10];

			if (!empty($vendor_code)) {
				echo "Код поставщика: $vendor_code <br />";
				$link = mysql_pconnect(localhost, root);
				mysql_select_db(dbparts);
				//mysql_query("set CHARACTER SET utf8");
				//mysql_query("SET OPTION SQL_BIG_SELECTS=1");
				
				// Запрос ревизии
				$query = "SELECT * FROM jos_parts_revision WHERE vendor_name = '$vendor_code'";
				$result = mysql_query($query);
				$f = mysql_fetch_array($result);
				$revision = $f[revision];
				$last_update = $f[idate];
				echo "Последнее обновление: $last_update | Ревизия: $revision <br />";
				mysql_free_result($result);
				

				// Загрузка новых данных
				echo "Start at <br />";
				$load = "LOAD DATA LOCAL INFILE '$path' INTO TABLE dbparts.jos_parts ";
				$load .= "REPLACE ";
				$load .= "FIELDS TERMINATED BY ';' ENCLOSED BY '' ";
				$load .= "LINES TERMINATED BY '\r\n' ";
				$load .= "SET revision = $revision + 1";
				mysql_query($load);
				echo "Stop at <br />";

				mysql_close($link);
    			} 
			else { 
				echo "File not found!!!";
				fclose($handle); 
				exit; 
			}
		}
		fclose($handle);
	}
} 
else { 
	echo "No vendor selected! Select vendor and try again"; 
}
?>
Никакого обновления не происходит. Что не так?
Maxx вне форума Ответить с цитированием
Старый 19.08.2010, 08:48   #13
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Ошибки mysql проверяли? http://ru2.php.net/manual/en/function.mysql-error.php
Что возвращает mysql_query($load);?
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 20.08.2010, 16:19   #14
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Возвращает неверный путь к файлу. Не заметил, что надо писать С:/ вместо С:\
Все работает, вот итоговый код, может кому пригодится:
Код:
<form action="" method="post">
<select name="vendor">
<option name="vendor" value="" selected></option>
<option name="vendor" value="v1">Поставщик1</option>
<option name="vendor" value="v2">Поставщик2</option>
<option name="vendor" value="v3">Поставщик3</option>
<option name="vendor" value="v4">Поставщик4</option>
<option name="vendor" value="v5">Поставщик5</option>
<option name="vendor" value="v6">Поставщик6</option>
<option name="vendor" value="v7">Поставщик7</option>
<option name="vendor" value="v8">Поставщик8</option>
<option name="vendor" value="v9">Поставщик9</option>
<option name="vendor" value="v10">Поставщик10</option>
<option name="vendor" value="v11">Поставщик11</option>
<option name="vendor" value="v12">Поставщик12</option>
<option name="vendor" value="v13">Поставщик13</option>
</select>
<input type="submit" value="Обновить...">
</form>

<?php
if (isset($_POST['vendor']) && $_POST['vendor'] != "") {
	$vendor = $_POST['vendor'];
	$path_csv = 'C:\pricelists\PriceForDBExport\\'. $vendor. '.csv';
	$path_load = 'C:/pricelists/PriceForDBExport/'. $vendor. '.csv';
	echo "$path_csv <br /> $path_load <br />";
	echo "Обновление Прайс-листа $vendor <br />";

	if (($handle = fopen($path_csv, "r")) !== FALSE) {
		if (($data = fgetcsv($handle, 1000, ";", " ")) !== FALSE) {
			$vendor_code = $data[10];

			if (!empty($vendor_code)) {
				echo "Код поставщика: $vendor_code <br />";
				$link = mysql_pconnect(localhost, root);
				mysql_select_db(dbparts);
				mysql_query("set CHARACTER SET utf8");
				//mysql_query("SET OPTION SQL_BIG_SELECTS=1");
				
				// Запрос ревизии
				$query = "SELECT * FROM jos_parts_revision WHERE vendor_name = '$vendor_code'";
				$result = mysql_query($query);
				$f = mysql_fetch_array($result);
				$revision = $f[revision];
				$last_update = $f[idate];
				$newrevision = $revision;
				$newrevision ++;
				echo "Последнее обновление: $last_update | Ревизия: $revision | Новая ревизия: $newrevision <br />";
				mysql_free_result($result);

				// Загрузка новых данных
				$load = "LOAD DATA LOCAL INFILE '$path_load' REPLACE INTO TABLE dbparts.jos_parts ";
				$load .= "FIELDS TERMINATED BY ';' ENCLOSED BY '' ";
				$load .= "LINES STARTING BY '\"' TERMINATED BY '\\n' ";
				$load .= "SET revision = $newrevision";
				mysql_query($load);
				
				if (mysql_errno()) {
					echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
				}
				else {
					echo "Обновление выполнено! <br />";
					$result_update = mysql_affected_rows();
					echo "Обновлено $result_update записей <br />";

					//Обновление ревизии
					mysql_query("UPDATE jos_parts_revision SET revision = '$newrevision', idate = CURRENT_TIMESTAMP WHERE vendor_name = '$vendor_code'");
					$result_update_revision = mysql_affected_rows();
					echo "Обновлено $result_update_revision записей в таблице 'Ревизия' <br />";

					//Удаление старых данных
					mysql_query("DELETE FROM jos_parts WHERE vendor_name = '$vendor_code' AND revision <> '$newrevision'");
					$result_delete = mysql_affected_rows();
					echo "Удалено $result_delete старых записей в таблице 'Запчасти' <br />";
				}
				mysql_close($link);
    			} 
			else { 
				echo "Файл не найден!";
			}
		}
		fclose($handle);
	}
} 
else { 
	echo "Не выбран поставщик! Выберите поставщика и повторите снова!"; 
}
?>
Спасибо еще раз за советы. Скорость загрузки впечатляет

Осталась одна проблема - кодировка. Все таблицы utf8. В названиях деталей есть русские буквы. mysql_query("set CHARACTER SET utf8"); не помагает.
Maxx вне форума Ответить с цитированием
Старый 23.08.2010, 09:13   #15
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Попробуйте "SET NAMES utf8".
С кодировкой дистанционно сложно "побороться", поэтому метод "проб и ошибок".
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 23.08.2010, 13:08   #16
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Не помогло. Но с этим я справлюсь. В екселе я умею создавать файлы txt в сразу в utf8.

Теперь я вспомнил, почему пошел по столь длинному пути (посты №4,6). По некоторым поставщикам прайсы содержат до 500000 поз. А txt и csv такой объем не поддерживают. Поэтому я сразу из xlsx гнал все это через migratinTool в базу. Видимо по таким прайсам придется создавать несколько csv файлов (file1, file2 и т.д.) и с помощью цикла в php перебирать их все.

Есть проблема: создал поддомен, туда залил скрипт. Выдает ошибку 1045: Access denied for user 'имя'@'localhost' (using password: YES)
Maxx вне форума Ответить с цитированием
Старый 23.08.2010, 15:59   #17
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от Maxx Посмотреть сообщение
Есть проблема: создал поддомен, туда залил скрипт. Выдает ошибку 1045: Access denied for user 'имя'@'localhost' (using password: YES)
уберите LOCAL, те LOAD DATA INFILE
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 23.08.2010, 16:32   #18
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Убрал сразу. Попытаюсь выяснить у хоста.
Вот что говорят:LOAD DATA INFILE у нас вообще не работает, Потому что нет таких прав для пользователя базы, мы их не даем.
используйте ssh

Последний раз редактировалось Maxx; 23.08.2010 в 16:48.
Maxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединить файлы в один с выборкой данных serd Microsoft Office Excel 8 21.11.2009 11:35
Запрос к БД. PHP+MySQL artemavd PHP 3 14.09.2009 02:51
Объединить в один файл asale Microsoft Office Excel 2 12.02.2008 13:18
составить запрос к таблицам T1 и T2 MonteCarlos SQL, базы данных 13 03.02.2008 14:05
Запрос по всем таблицам Abay SQL, базы данных 3 27.09.2007 09:07