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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Поиск совпадений по базе без id

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: поиск новых строк
mixnn
Отправлено: 02 Сентября, 2008 - 10:56:49
Post Id


Гость


Покинул форум
Сообщений всего: 89
Дата рег-ции: Июнь 2008  


Помог: 0 раз(а)




Нужно перодически обнавлять таблицу из excel но там нет id и при добавлении нужно сравнивать содержимое базы на сервере и в excel. Если есть новые пункты то добавить их. Как лучше сделать?
 
 Top
Champion Супермодератор
Отправлено: 02 Сентября, 2008 - 11:52:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




проверь селектом, существует ли уже такая строка. (если он вернет пустой набор, значит строки нет). И если таоке тебе часто прийдется делать, советую создать индекс по проверяемым полям
 
 Top
pifon1989
Отправлено: 02 Сентября, 2008 - 12:55:29
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Почитайте про fgetcsv() http://www.php.su/functions/?fgetcsv . Для того, чтобы ей воспользоваться, в ms excel или любом другом редакторе таблиц выберите "сохранить как" и найдите там что-то вроде text (.csv). При сохранении будет предложено выбрать знак-разделитель ячеек. По умолчанию обычно запятая.
Функция fgetcsv извлекает из файла данного типа построчно массив, элементами которого являются значения ячеек в строке.
Общий вид её работы таков:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $fh = fopen("filename.csv", "r");
  4. $connect = mysql_connect("localhost", "username", "pass");
  5. while(!feof($fh))
  6. {
  7. $get = fgetcsv($fh, 1000, "знак-разделитель");
  8. // операцию сравнения придётся производить, постоянно извлекая из базы
  9. // очередную строчку, но, если SQL-гении форума сего подскажут хитрый запрос, то...)
  10. $select = mysql_query("SELECT * FROM `имя таблицы`");
  11.   while($comp = mysql_fetch_assoc($select))
  12.   {
  13.   $copm_arr = array_diff($get, $comp);
  14.     if (!empty($comp_arr))
  15.     {
  16.     $operation = mysql_query("INSERT INTO `имя таблицы` (`наименование`) VALUES ('значение')");
  17.     }
  18.  }
  19. }
  20. mysql_close($connect);
  21. fclose($fh);
  22. ?>
  23.  

(Отредактировано автором: 02 Сентября, 2008 - 13:26:56)



-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Champion Супермодератор
Отправлено: 02 Сентября, 2008 - 13:18:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Цитата:
$select = mysql_query("SELECT * FROM `имя таблицы`");

не надо так.
Допустим, (воспользуюсь твоими же переменными) в у нас такое вот соответствие:
$get[0] - field1
$get[1] - field2
...
(fieldX - поля из таблицы).
Тогда с каждым $get сделаем так:
$select = mysql_query("SELECT * FROM `имя таблицы` WHERE field1 = $get[0] AND field2 = $get[1]...") or die("Wrong query sintax");
if (is_null(mysql_fetch_assoc($select)) //то такой записи нет, вставляем; иначе - такая уже есть.

И еще: минус Вашего подхода: коннект к БД в цикле; полная выборка из БД одного и того же набора, опять-таки, в цикле; и фильтрация набора средствами php
(Добавление)
Смайлы, которые вы видите выше, это не смайлы))
 
 Top
pifon1989
Отправлено: 02 Сентября, 2008 - 13:26:02
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. $select = mysql_query("SELECT * FROM `имя таблицы` WHERE field1 = $get[0] AND field2 = $get[1]..."Подмигивание or die("Wrong query sintax"Подмигивание;
  3. if (is_null(mysql_fetch_assoc($select)) //то такой записи нет, вставляем; иначе - такая уже есть.
  4.  

Да, согласен. Правда стоит ещё учеть, что аффтора нужно будет поднагрузить определением названия нужного ему поля, а так - конечно.
Champion пишет:
коннект к БД в цикле; полная выборка из БД одного и того же набора, опять-таки, в цикле; и фильтрация набора средствами php

А вот это уже да, это круто... сейчас изменю... Просто быстро писал и как-то даже и не подумал. Я обычно привык концентрироваться на конкретном участке, иначе когда код огромный - сломаеш мосх
Champion пишет:
Смайлы, которые вы видите выше, это не смайлы))

Угумс Улыбка


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Champion Супермодератор
Отправлено: 02 Сентября, 2008 - 13:33:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Цитата:
А вот это уже да, это круто... сейчас изменю... Просто быстро писал и как-то даже и не подумал. Я обычно привык концентрироваться на конкретном участке, иначе когда код огромный - сломаеш мосх

Когда на скорую руку пишешь, и не такое случается Радость
 
 Top
mixnn
Отправлено: 02 Сентября, 2008 - 13:55:27
Post Id


Гость


Покинул форум
Сообщений всего: 89
Дата рег-ции: Июнь 2008  


Помог: 0 раз(а)




Champion пишет:
проверь селектом, существует ли уже такая строка. (если он вернет пустой набор, значит строки нет). И если таоке тебе часто прийдется делать, советую создать индекс по проверяемым полям

Я так делаю но некоторые строки он все равно не различает, и опять добавляет

pifon1989 пишет:
Почитайте про fgetcsv()

Я импротирую из .xls а не .csv, по импорту все ок



Я думаю что это может из за типов полей(текст, десятичные).

Может стоит сделать сравнение с каждой ячейкой?

Или запрос как ни то подругому изменить

PHP:
скопировать код в буфер обмена
  1. if(@mysql_num_rows(mysql_query("SELECT $pl FROM $table
  2. WHERE  $pl = '$vl'  AND $pl2 = '$vl2' AND $pl3 = '$vl3' "))==0)
  3. mysql_query("INSERT INTO ...")
 
 Top
pifon1989
Отправлено: 02 Сентября, 2008 - 15:54:29
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




mixnn пишет:
Я импротирую из .xls а не .csv, по импорту все ок

xls - бинарный файл. Как это он у вас импортируется? 0.о Ну открыться пожалуй то окроется, но там же внутри шестнадцатиричный код. Не понял По крайней мере, с утра ещё был. Поэтому и нужно сохранять в текстовом формате.
Вы попробуйте вывести его на экран. Картинка должна быть супер. ;)


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Champion Супермодератор
Отправлено: 02 Сентября, 2008 - 15:58:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




pifon1989, есть в pear такая штука excelSpreadsheetReader. Она позволяет вsnfcrbdfnm данные из xls. Наверное, ей и пользовался mixnn.
Но распарсить csv конечно гораздо проще. только надо не забыть заменить везде, где встречаетсяч символ-разделитель на что-нибудь другое. А то возможно происхождение различных неожиданных чудес
 
 Top
pifon1989
Отправлено: 02 Сентября, 2008 - 16:19:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Champion пишет:
только надо не забыть заменить везде, где встречаетсяч символ-разделитель на что-нибудь другое. А то возможно происхождение различных неожиданных чудес

Ошибка если в ячейках текст с запятыми? Улыбка Да, но можно как-нибудь выпендриться, сделать разделителем тильду или амперсанд. Знак решётки, в конце-концов, она используется крайне редко. Так что варианты тут есть, особенно в тех случаях, когда excel. Я ещё не видел садистов, которые пишут там романы с детективами Улыбка
Champion пишет:
есть в pear такая штука excelSpreadsheetReader. Она позволяет вsnfcrbdfnm данные из xls. Наверное, ей и пользовался mixnn.

Я пока ещё не лазил в такие глубины Голливудская улыбка В основном PECL ковырял, там когда один скрипт писал нашёл немало полезного. Но у меня рут, а на хостингах никто лезть в корень пхп не даст, и ставить расширения потому что Вася Пупкин захотел скорее всего не станут Улыбка
Да и дополнительные библиотеки, они, на мой сугубо личный вгляд, вещь спорная: у одного пойдёт, у другого - нет. Скрипт сугубо личного пользования, скажем так. Да и мастерством великого нупа не овладаешь, пользуясь чужими готовыми наработками, имхо
(Добавление)
P.S.:
pifon1989 пишет:
Я ещё не видел садистов, которые пишут там романы с детективами

И не приведи Боже..


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Champion Супермодератор
Отправлено: 02 Сентября, 2008 - 16:30:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




pifon1989 пишет:
и ставить расширения потому что Вася Пупкин захотел скорее всего не станут

А их можно не ставить. Просто создай папку там, где тебе можно, и инклюдь из нее).
Цитата:
Да и дополнительные библиотеки, они, на мой сугубо личный вгляд, вещь спорная: у одного пойдёт, у другого - нет. Скрипт сугубо личного пользования, скажем так. Да и мастерством великого нупа не овладаешь, пользуясь чужими готовыми наработками, имхо


Да, но бывает проще воспользоваться тем, что есть, чем изобретать велосьпед с нуля. И, кстати, если не копировать бездумно, то и из них можно чему-нибудь научиться
 
 Top
pifon1989
Отправлено: 02 Сентября, 2008 - 16:43:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Champion пишет:
Да, но бывает проще воспользоваться тем, что есть, чем изобретать велосьпед с нуля. И, кстати, если не копировать бездумно, то и из них можно чему-нибудь научиться

Может быть. Но я особенный и никогда не ищё лёгких путей! *гордо выпятил грудь, сзади порвалась майка*


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Вездеход
Отправлено: 02 Сентября, 2008 - 17:12:05
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 820
Дата рег-ции: Апр. 2008  
Откуда: Россия


Помог: 0 раз(а)




нет вы не особенный. вопщем то я тоже "не люблю" брать чей то код - потому пишу все сам. не нравится мне капаться в чужы кодах... ой не нравится. хотя понимаю что это не савсем правельно - ибо получается медленнее и не всегда лучше.


-----
о великий nl2br!
Хочешь невероятных ощущений? Юзай блокнот! Блокнот - чудеса сбываются!
Чем меньше вы знаете PHP - тем ценнее мои знания!
 
 Top
pifon1989
Отправлено: 02 Сентября, 2008 - 17:17:49
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Вездеход пишет:
нет вы не особенный

Ну всё, я обиделся xDD
Вездеход пишет:
хотя понимаю что это не савсем правельно - ибо получается медленнее и не всегда лучше.

По-хорошему то вообще чужими кодами лучше начать пользоваться когда станешь ассом в функциях и операторах стандартной сборки, будешь знать от а до я. Фишка в том, что когда, и, разумеется, если этот день наступит, ты будешь уже на том уровне, когда дополнительные функции писать в pear и pecl станешь сам, и при этом тебе самому ничего лишнего уже не понадобится, имхо Голливудская улыбка


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB