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 :: Как написать правильный код?

 PHP.SU

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


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

> Без описания
event
Отправлено: 14 Февраля, 2012 - 01:41:58
Post Id


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


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


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




Привет, сразу перейду к объяснениям.

Есть таблица persons, и torrents.
Ячейки таблицы persons: id, name
Ячейки таблицы: torrents: id, descr

Задача:
Примерно один или два раза в неделю проводить обновление:
В таблице persons в ячейке name - хранится имя и фамилия персоны.
В таблице torrents в ячейке descr - хранится описание релиза.

Нужно брать содержимое ячейки name (имя и фамилия) проверять нет ли такого в содержимом ячейки descr (описание релиза), если такое находится, то в содержимом ячейки descr (описание релиза) заменяеся имя и фамилия актера на какую нибудь ссылку, например persons.php?id=ID, если не находится то просто пропускаем релиз. Улыбка

Теперь о количествах записей в таблицах:
Таблица torrents, там будет около ~2000-3000 записей.
Таблица persons, количество записей так-же пока что не известно, но с уверенностью могу сказать что их там будет не меньше 5000.

Ну, вот ребята помогите построить нормальный код.
Свою версию кода я выкладывал в соседней теме, вот здесь: http://forum.php.su/topic.php?forum=71&topic=4086, но после моего тестирования она ни грамма не оправдала моих надежд, одним словом мне чуть глаза не повыпадали. Не понял

(Отредактировано автором: 14 Февраля, 2012 - 01:42:39)

 
 Top
Dezmont
Отправлено: 14 Февраля, 2012 - 08:26:31
Post Id



Частый гость


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


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




PHP:
скопировать код в буфер обмена
  1. $sql = mysql_query("SELECT `name` FROM `persons`");
  2. while($array = mysql_fetch_assoc($sql)){
  3.    $sql_2 = mysql_query("SELECT `id`,`descr` FROM `torrents` WHERE `descr` LIKE '%{$array['name']}%'");
  4.    while($array_2 = mysql_fetch_assoc($sql_2)){
  5.       $link = substr_replace($array_2['descr'], 'persons.php?id=ID', 0);
  6.       $sql = mysql_query("UPDATE `torrents` SET `descr`='$link' WHERE `id`='{$array_2['id']}'");
  7.    }
  8. }


Как то так, вроде должно работать. Про быстродействие кода не скажу, нужно у более опытных спрашивать.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Февраля, 2012 - 08:58:49
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Вариант, демократичный к базе и не очень - к памяти, несколько десятков мб слопает:
Грузите всех персон в массив.
Грузите торренты и в цикле обработки запроса вложенным циклом ищите персону.
Если что-то нашли - апдейтите запись.


-----
PostgreSQL DBA
 
 Top
snikers987
Отправлено: 14 Февраля, 2012 - 10:30:46
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


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




Dezmont два запроса к базе в цикле это правильный код? Однако


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Dezmont
Отправлено: 14 Февраля, 2012 - 10:43:19
Post Id



Частый гость


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


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




snikers987 пишет:
Dezmont два запроса к базе в цикле это правильный код?


Наверное нет, если вы спрашиваете. Больше не буду так делать... Ток учусь(((
 
 Top
snikers987
Отправлено: 14 Февраля, 2012 - 11:35:01
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


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




PHP:
скопировать код в буфер обмена
  1. $rResult = mysql_query('SELECT `id`,`name` FROM `person`');
  2. while($rgRow = mysql_fetch_assoc($rResult)){
  3.     $rgPersons[$rgRow['id']] = $rgRow['name'];
  4. }
  5. $rResult = mysql_query('SELECT `id`,`descr` FROM `torrents`');
  6. while($rgRow = mysql_fetch_assoc($rResult)){
  7.     $sTmp = '';
  8.     foreach($rgPersons as $iPersonID => $sPerson){
  9.         if(preg_match("#$sPerson#is", $rgRow['descr'])){
  10.             if(empty($sTmp)){
  11.                 $sTmp = str_replace($sPerson, "<a href='person.php?id=$iPersonID'>$sPerson</a>", $rgRow['descr']);
  12.             }else{
  13.                 $sTmp = str_replace($sPerson, "<a href='person.php?id=$iPersonID'>$sPerson</a>", $sTmp);
  14.             }
  15.         }
  16.     }
  17.     if(!empty($sTmp)) mysql_query("UPDATE `torrents` SET `descr` = '{$sTmp}' WHERE `id` = {$rgRow['id']}");
  18. }
  19.  

зы. писал на коленке и не проверял.
(Добавление)
Dezmont Вообще стоит избегать запросов в цикле, особенно на выборку..имхо..

(Отредактировано автором: 14 Февраля, 2012 - 14:11:20)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Dezmont
Отправлено: 14 Февраля, 2012 - 14:13:36
Post Id



Частый гость


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


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




snikers987, спасибо, буду знать. Просто ещё не прходилось смотреть на скорость выполнения скриптов, и ещё очень слабо этом разбираюсь.
 
 Top
event
Отправлено: 14 Февраля, 2012 - 16:06:41
Post Id


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


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


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




snikers987
Спасибо, буду пробовать после работы.

Хотелось бы еще услышать мнения, особенно от OrmaJever`a и EuGena, о коде snikers987, и вообще мнение об этом)

Мелкий можешь на примере показать?

(Отредактировано автором: 14 Февраля, 2012 - 16:07:54)

 
 Top
EuGen Администратор
Отправлено: 14 Февраля, 2012 - 16:11:54
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




event
Лично мое мнение: отойти от проверок сомнительных полей вроде description и создать нормальную таблицу-связку между persons и torrents. После этого задача решается элементарным JOIN


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
event
Отправлено: 14 Февраля, 2012 - 16:26:52
Post Id


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


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


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




EuGen
Ну не знаю, +1 таблица тоже не есть хорошо. Улыбка
(Добавление)
Блин, ну и зачада мне выпала...
 
 Top
EuGen Администратор
Отправлено: 14 Февраля, 2012 - 16:29:16
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




event
Ничего себе. Ну, даже не знаю, что сказать.
Если серьезно - то ровно для того и существуют реляционные БД, чтобы хранить данные в удобном виде.
Создание этой таблицы сразу же решит поставленный вопрос оптимальным способом, так как избыточности оно не добавляет, но при этом формализует связь между двумя сущностями на уровне БД, что позволяет использовать это непосредственно в приложении.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OrmaJever Модератор
Отправлено: 14 Февраля, 2012 - 16:33:56
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




event пишет:
Хотелось бы еще услышать мнения, особенно от OrmaJever`a


я тут не причём, я php вижу первый раз и вобще не знаю как я попал на этот форум. Пусть EuGen и Мелкий подскажут, у них лучше получается


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Февраля, 2012 - 18:02:55
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




event пишет:
Ну не знаю, +1 таблица тоже не есть хорошо.

Это значительно лучше какого-то фонового процесса. Особенно потом с поиском "все фильмы с актёром" и подобные.

Тем не менее, в поставленной задаче это не поможет, ведь затея в тексте типа:
Цитата:
Но тут выпрыгивает username (его играет person_name) и всё уплыло

Сделать person_name ссылкой на соответствующий person_id.
event, ведь так?


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB