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]   

> Без описания
Striker
Отправлено: 13 Октября, 2012 - 02:13:35
Post Id



Частый гость


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


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

[+]


Народ, подскажите как реализовать такое:

Есть некий сайт, база которого состоит к примеру из трех таблиц.
Первая таблица bad_sites содержит два поля (id, site). В эту таблицу администратор заносит домены сайтов (например 'rambler.ru'), которые содержат порно-картинки и т.п.
Вторая таблица bad_words тоже состоит из двух полей (id, word). В эту таблицу администратор вносит всякие неприличные слова.
В третью таблицу пишутся id, ссылка на картинку, title картинки и ключевые слова, которые прошли проверку, тоесть не находятся в первых двух таблицах. Об этой таблице подробней расскажу позже.

Есть некий лог-файл, в который робот пишет какие картинки просматривали пользователи, тайтлы картинок и ключевые слова картинки.

Надо извлечь из лог-файла ссылку на картинку, тайтл и ключевые слова картинок, проверить чтоб эти данные проходили проверку на цензуру, тоесть чтоб сайт и слова не находились в черном списке (напоминаю что сайт и слова находятся в таблицах bad_sites и bad_words) и если все ок, то данные записывались в третью таблицу. В нее собственно записывается ссылка на картинку, тайтл картинки, ключевые слова.

Лог файл имеет вид типо:
CODE (htmlphp):
скопировать код в буфер обмена
  1. 91.210.167.49@[04/Oct/2012:14:51:00 +0200]@GET /addimg.php?i=http://ygdga.ru%2Fv305309402%2F6b32%2F8v0aTfgrLhY.jpg&alt=&title=%D0%90crack%20%D0%B4%D0%B5%D0%B2%D0%BE%D1%87%D0%BA%D0%B0%20%D0%BF%D0%BE%D0%BF%D0%B0%D0%BB%D0%B0%D1%81%D1%8C%20%D0%BD%D0%B0%20%D0%BB%D1%8E%D0%B1%D0%BE%D0%B2%D1%8C...%20%C2%A9
  2. 91.210.167.49@[04/Oct/2012:14:51:00 +0200]@GET /addimg.php?i=http://goo1gle.ru%2Fv304303185%2F4a0f%2FkBr6rcC1x3o.jpg&alt=&title=crack%D0%90%0%D0%B4%D0%B5%D0%B2%D0%BE%D1%87%D0%BA%D0%B0%20%D0%BF%D0%BE%D0%BF%D0%B0%D0%BB%D0%B0%D1%81%D1%8C%20%D0%BD%D0%B0%20%D0%BB%D1%8E%D0%B1%D0%BE%D0%B2%D1%8C...%20%C2%A9


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

Вот что наваял:

PHP:
скопировать код в буфер обмена
  1. mysql_connect("localhost", "root", "") or die(mysql_error());
  2. mysql_select_db("picture") or die(mysql_error());
  3. mysql_query("SET NAMES 'UTF8'");
  4.  
  5.  
  6. $file = 'test.txt'; //имя/путь к файлу
  7.  
  8.  
  9. if(!filesize($file) > 0)
  10. {
  11.     die("".$file." empty \n"); //проверяем чтоб файл был не пустой
  12. }
  13.  
  14. $fp = file_get_contents($file); //полностью читаем файл
  15. $t = explode("\n", $fp); //разбиваем файл по строкам
  16.  
  17. $conn1 = mysql_query("SELECT site FROM `bad_sites`"); //выбираем из БД все сайты, которые в черном списке
  18. $conn2 = mysql_query("SELECT word FROM `bad_words`"); //выбираем все недопустимые слова
  19.  
  20. $array_site = array();
  21. $array_title = array();
  22. $array_alt = array();
  23.  
  24.  
  25. for($i = 0; $i < count($t); $i++)
  26. {  
  27.     $addimg = explode("/addimg.php?i=", $t[$i]); //разбиваем строку по /addimg.php?i=
  28.     $space = explode(" ", $addimg[1]); //разбиваем строку по пробелам    
  29.            
  30.  
  31.     $ampersand = explode("&", $space[0]);
  32.     $link_img = urldecode($ampersand[0]); //получаем ссылку на картинку    
  33.  
  34.     preg_match('/(http:\/\/)*(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)[\S]*/i', $link_img, $result);    
  35.  
  36.     $ampersand2 = explode("&", $ampersand[1]);
  37.     $ampersand2[0] = str_replace("alt=", "", $ampersand2[0]);
  38.     $alt = urldecode($ampersand2[0]); //получаем ключевые слова из файла
  39.  
  40.  
  41.     $ampersand3 = explode("&", $ampersand[2]);
  42.     $ampersand3[0] = str_replace("title=", "", $ampersand3[0]);
  43.     $title = urldecode($ampersand3[0]); //получаем тайтл из файла
  44.  
  45.  
  46. $array_site[] = $result[2];
  47. $array_title[] = $title;
  48. $array_alt[] = $alt;
  49.  
  50. }
  51.  
  52. for($i = 0; $i < count($array_site); $i++)
  53. {
  54.     $validate_site = mysql_query("SELECT site FROM bad_sites WHERE site LIKE '".$array_site[$i]."'") or die(mysql_error());
  55.     if(mysql_num_rows($validate_site) > 0)
  56.     {
  57.         //echo "совпадения есть. сайт находится в черном списке<br>";
  58.         continue;
  59.     }
  60.     else
  61.     {
  62.         //echo "совпадений нет, продолжаем<br>";
  63.         while($validate = mysql_fetch_array($conn2))
  64.         {
  65.             if(eregi($validate['word'], $array_title[$i]) || eregi($validate['word'], $array_alt[$i])) //проверяем по регулярному выражению тайтл и ключевые слова
  66.             {
  67.                     //echo "совпадения есть, слова в черном списке<br>";                                  
  68.                     continue;
  69.             }            
  70.             else
  71.             {
  72.                 mysql_query("insert into `img_robot_test` values(
  73.                              NULL,
  74.                                  '".mysql_real_escape_string($link_img)."',
  75.                                  '".mysql_real_escape_string($array_title[$i])."',
  76.                                  '".mysql_real_escape_string($array_alt[$i])."'
  77.                             );") or die(mysql_error()); //то что прошло проверку пишется в БД
  78.             }
  79.         }
  80.     }        
  81. }


Тоесть в БД надо записывать только те ссылки на картинки, тайтлы и alt(ключевые слова), сервера которых, а также ключевые слова и тайтлы не находятся в черном списке (в первой и второй таблице). Где-то в последнем цикле у меня ошибка, записывается ссылка на картинку только первого сайта, который прошел проверку, ключевые слова и тайтлы вообще игнорируются и пишутся в БД... Подскажите что не так во второй части скрипта?
 
 Top
KingStar
Отправлено: 13 Октября, 2012 - 11:48:41
Post Id



Участник


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


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




0.
PHP:
скопировать код в буфер обмена
  1. $fp = file_get_contents($file); //полностью читаем файл
  2. $t = explode("\n", $fp); //разбиваем файл по строкам


про file не в курсе???
(Добавление)
1.

PHP:
скопировать код в буфер обмена
  1. if(eregi($validate['word'], $array_title[$i]) || eregi($validate['word'], $array_alt[$i])) //проверяем по регулярному выражению тайтл и ключевые слова


eregi - с версии PHP 5.3.0 эта функция считается УСТАРЕВШЕЙ. Крайне не рекомендуется полагаться на эту возможность.


-----
То что программа работает, не означает что она написана правильно!
 
 Top
Striker
Отправлено: 13 Октября, 2012 - 12:34:15
Post Id



Частый гость


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


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

[+]


KingStar
Цитата:
про file не в курсе???

Вкурсе. Чтение с помощью file не совсем подходит. В реальном проекте лог-файл разростается на 100 мб каждый день, представляешь какой будет размер массива для дальнейшей обработки?
Потому выбор пал на file_get_contents... считываем весь файл в переменную, с ним и работаем. В реальном проекте после считывания файл очищается.
PHP:
скопировать код в буфер обмена
  1. $fp = file_get_contents($file); //полностью читаем файл
  2.  
  3. file_put_contents($file, ""); //очищаем файл

Вообщем нет смысла читатьф айл построчно и вообще вопрос не в этом.

Цитата:
eregi - эта функция считается УСТАРЕВШЕЙ.

Знаю, но тем не менее она работает.

Лучше б подсказали каким образом записывать в третью таблицу ссылку, тайтл и ключевые слова, если они не числятся первых двух таблицах...
 
 Top
KingStar
Отправлено: 13 Октября, 2012 - 12:47:24
Post Id



Участник


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


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




Striker пишет:
Вкурсе. Чтение с помощью file не совсем подходит. В реальном проекте лог-файл разростается на 100 мб каждый день, представляешь какой будет размер массива для дальнейшей обработки?
Потому выбор пал на file_get_contents... считываем весь файл в переменную, с ним и работаем. В реальном проекте после считывания файл очищается.
PHP:
скопировать код в буфер обмена
  1. $fp = file_get_contents($file); //полностью читаем файл
  2. file_put_contents($file, ""); //очищаем файл



ты интересный Радость а тем, что ты читаешь файл в переменную с помощью file_get_contents в память, и затем дополнительно получаешь массив с помощью explode все в ту же память - это по твоему рационально Не понял и на второе - file_put_contents все ровно какой функцией ты читаешь файл Язычок, ну и на компот - скорее всего у тебя проблема все в той же УСТАРЕВШЕЙ функции eregi

помогать - тебе помогаешь, но ты я вижу чихаешь на нашу помощь, пусть даже не по теме Хм

(Отредактировано автором: 13 Октября, 2012 - 12:54:34)



-----
То что программа работает, не означает что она написана правильно!
 
 Top
Striker
Отправлено: 13 Октября, 2012 - 12:57:26
Post Id



Частый гость


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


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

[+]


KingStar
По поводу того как читать файл у меня вопросов нет. Хотя нет... считай что я читаю файл так как тебе этого хочется, ок? Радость Что дальше, каким образом в третью таблицу загонять данные если в строке нет сходств из таблицы bad_sites и bad_words?
 
 Top
armancho7777777 Супермодератор
Отправлено: 13 Октября, 2012 - 12:59:03
Post Id



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


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


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




Striker пишет:
Чтение с помощью file не совсем подходит. В реальном проекте лог-файл разростается на 100 мб каждый день, представляешь какой будет размер массива для дальнейшей обработки?

"Читайте" файл по строчно.
fgets
(Добавление)
Ну, или храните данные в виде сериализованного массива.
 
 Top
Striker
Отправлено: 13 Октября, 2012 - 13:04:38
Post Id



Частый гость


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


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

[+]


armancho7777777
Так и сделал, уже читаю с помощью fgets... лучше помогите со второй частью скрипта.
 
 Top
KingStar
Отправлено: 13 Октября, 2012 - 13:12:19
Post Id



Участник


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


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




недостаточно инфы, нужно воспроизводить программу. так, пологаясь на догадки, врядле можно что-то конктретно сказать


-----
То что программа работает, не означает что она написана правильно!
 
 Top
Мелкий Супермодератор
Отправлено: 13 Октября, 2012 - 13:22:09
Post Id



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


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


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




KingStar пишет:
про file не в курсе???

Справедливости ради замечу, что file_get_contents + explode работает быстрее, чем file. Поэтому если памяти достаточно и не волнуют различия окончаний строк в выходных массивах - это предпочтительный способ.

Striker пишет:
что не так во второй части скрипта?

phpfaq.ru/debug


-----
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