Xpoint
   [напомнить пароль]

cvs: Потеря данных

Метки: [без меток]
2009-08-05 14:56:58 [обр] DekaR[досье]

Доброго времени суток !
 Столкнулся с такой проблемой.Есть не хитрый скрипт,который делает импорт из файлва csv в базу mysql:

if (($fp=fopen($filename,"r"))){
mysql_query("Update `prod_rublic`,`prod_group`,`prod_names` set prod_names.`update`='false',prod_rublic.`update`='false',prod_group.`update`='false'");
$data = fgetcsv($fp, 1000, ";");
$k=1;
while (($data = fgetcsv($fp,3000, ";")) !== FALSE) {
   $korpus='0';
$rublic=mysql_escape_string(htmlspecialchars(trim(strtolower($data[0]))));
$pgroup=mysql_escape_string(htmlspecialchars(trim(strtolower($data[1]))));
$name=mysql_escape_string(htmlspecialchars(trim($data[2])));

...

mysql_query("insert into `prod_rublic` (`id`,`name`,`update`) values('','$rublic','true') on duplicate key update `update`='true'");
if (!($pid=mysql_insert_id())) {
$q=mysql_query("select `id` from `prod_rublic` where `name`='$rublic'");

$pid=mysql_result($q,0,'id');};

mysql_query("insert into `prod_group` (`name`,`parent`) values('$pgroup',$pid) on duplicate key update `update`='true'");

if (!($pid=mysql_insert_id())) {
$q=mysql_query("select `id` from `prod_group` where `name`='$pgroup'");
$pid=mysql_result($q,0,'id');};echo "text"+mysql_error();

mysql_query("insert into `prod_names`(`parent`,`name` , `about` , `korpus` , `roznica` , `lopt` , `opt` , `count` ,`mopt` , `mbopt` ) values ($pid,'$name', '$about', '$korpus', '$rozn','$lopt','$opt','$count','$mopt','$mbopt') on duplicate key update `parent`=$pid,`about`='$about',`update`='true',`opt` ='$opt',`roznica`='$rozn',`lopt`='$lopt',`count`='$count',`mopt`='$mopt',`mbopt`='$mbopt'");
};

...

mysql_query("DELETE FROM `prod_rublic`WHERE `update`='false'");
mysql_query("DELETE FROM `prod_group` WHERE `update`='false'");
mysql_query("DELETE FROM `prod_names` WHERE `update`='false'");

Смысл махинаций с полем 'update' в том,что если какие то наименования в базе присутствуют,а в файле - нет,то их надо удалить из базы.В результате получаю,что не все наипменования оказываются в базе.Из 40302 там получается 39632 (посмотрел в пхпмайадмин).

Для проверки какие ж наименования теряются написал второй скрипт :

<html>
<body><? require "../files/phplibs/mysql.dpl";
connectbd();
echo "ww";
if (($fp=fopen("p.csv","r"))){
$data = fgetcsv($fp, 1000, ";");
$k=1;
echo $k;
while (($data = fgetcsv($fp,1000, ";")) !== FALSE) {
$q=mysql_query("Select `id` FROM `prod_names` where `name` LIKE '".htmlspecialchars(trim($data[2]))."'");
if (!mysql_num_rows($q)){ echo "$k:$data[1]  $data[2]  $data[3]  $data[4]\n"; $k++;?><br><?};
};
};
?>
</body></html>

Но он выводит 900 потерявшихся,а всего 20..Что я сделал не так ?

спустя 49 минут [обр] Филипп Ткачев(20/112)[досье]
DekaR[досье], я бы сносил все записи перед импортом, затем вставлял новые из файла плюс наложил бы ключи уникальности для исключения дублирующихся записей.
спустя 9 минут [обр] DekaR[досье]
во всех таблцах есть есть примари автоинкримент ключ 'id',а `name` помечен как уникальный.Сносить все записи я не могу так как тогда при новом импорте детали полуучат новый 'id' тем самым соъется система хранения файлов для конкретных полей( ну то есть есть поле А и id=В.При обработке в другом скрипте запрашивается поле A и смотрим папку с названием B).Ну думаю вы меня поняли.Весь прикол с том,что если даже все три базы изночально чистые,то всё равно не все наименования заносятся в базу,хотя while выполняется положенные 40302раз в базе получаем 39632 наименований.ПОчему они теряются?
спустя 15 часов [обр] Алексей Полушин(62/231)[досье]
У вас написано "on duplicate key ..." - а кроме id и name другие уникальные ключи есть ?
"while выполняется положенные 40302раз в базе получаем 39632 наименований" - может наименования в исходном файле повторяются ?
спустя 2 часа 44 минуты [обр] DekaR[досье]
не.. 900 наименований не может повторятся точно.Кроме id и name - нет
спустя 2 часа 48 минут [обр] Алексей Полушин(62/231)[досье]
"Не может повторятся точно" - как проверяли ? А в разных группах одинаковые наименования могут быть ?
спустя 5 часов [обр] DekaR[досье]
сделал экспорт из базы.проверил с исхоной.Действительно повторяются.Прощу прощения за путанницу
Powered by POEM™ Engine Copyright © 2002-2005