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]   

> Без описания
xhugo
Отправлено: 18 Марта, 2011 - 20:53:56
Post Id



Посетитель


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


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




есть код, парсит текст и добавляет в бд.
как проверить наличии такой же записи в бд?
нужно если есть уже такой же текст именно, то не добавилось.

PHP:
скопировать код в буфер обмена
  1. <?
  2. # тут коннект т.п.
  3. preg_match_all('|<font face="(.*)</font>|mi',file_get_contents("http://muz4in.net/board/"),$pc);    
  4. foreach($pc[0] as $s)  
  5. {    
  6. if($s=="Добавить в Соц.Сеть" || $s=="Добавить в Ленту")
  7. {
  8. }
  9. else
  10. {
  11. # тут проверка на наличии т.п.
  12. mysql_query("INSERT INTO comments (text) VALUES ('$s')") or die (mysql_error());
  13. echo($s."<BR><BR><hr>");  
  14. }
  15. }  
  16. ?>

(Отредактировано автором: 18 Марта, 2011 - 20:54:50)

 
 Top
grefon
Отправлено: 18 Марта, 2011 - 20:57:43
Post Id



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


Покинул форум
Сообщений всего: 823
Дата рег-ции: Нояб. 2010  


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




Либо через запрос select к базе данных, либо в самой таблице поставить уникальный индекс на нужное Вам поле.
(Добавление)
Про уникальный индекс хочу уточнить, что это хорошо только когда текст не большой. Если Вы собираетесь сравнивать что-то больше 500 символов, то тогда лучше select сделать. А то иначе таблица сильно разрастется и может порядком грузить сервер.


-----
____________________________________________________________________
Ну как то так, наверное.
http://grefon[dot]com
 
 Top
Champion Супермодератор
Отправлено: 18 Марта, 2011 - 21:06:19
Post Id



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


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


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




Плюс, если текст большой, то индекс создать лучше не по нему, а создать поле с хэшем md5 и наложить уникальный индекс на него.
 
 Top
grefon
Отправлено: 18 Марта, 2011 - 21:08:09
Post Id



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


Покинул форум
Сообщений всего: 823
Дата рег-ции: Нояб. 2010  


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




Champion впервые слышу а таком методе. Спасибо, как-нибудь попробую Хорошо


-----
____________________________________________________________________
Ну как то так, наверное.
http://grefon[dot]com
 
 Top
DeepVarvar Супермодератор
Отправлено: 18 Марта, 2011 - 21:10:17
Post Id



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


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


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




Champion - красивое решение.
 
 Top
xhugo
Отправлено: 18 Марта, 2011 - 21:11:32
Post Id



Посетитель


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


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




Champion, спасибо за идею Закатив глазки

grefon, можно пример как с большим текстом так и с малым?
 
 Top
Champion Супермодератор
Отправлено: 18 Марта, 2011 - 21:13:34
Post Id



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


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


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




Только этот индекс можно будет использовать для поиска по полному соответствию строки и стоит учитывать, что бесконечное множество разных строк могут иметь один хэш.
Но в этой ситуации наткнуться на такие строки наверное невозможно. Если всё же есть опасения, можно хранить 2 хэша - по всей строке и по половине строки.
(Добавление)
xhugo пишет:
можно пример как с большим текстом так и с малым?
Пример создания индекса? Или пример селекта?
 
 Top
grefon
Отправлено: 18 Марта, 2011 - 21:19:01
Post Id



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


Покинул форум
Сообщений всего: 823
Дата рег-ции: Нояб. 2010  


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




С малым текстом: в phpmyadmin заходите в таблицу. На страницы ищите "Индексы", жмякаете "Создать индекс на 1 колонках". Тип индекса ставите UNIQUE и выбираете нужное поле.

Для большого текста создаете еще одно поле в которое будет писаться md5. Для него ставите уникальный индекс. А добавлять запись уже надо так:
PHP:
скопировать код в буфер обмена
  1. $md5_s = md5($s);
  2. mysql_query("INSERT INTO comments (text, md5_text) VALUES ('$s', '$md5_s')") or die (mysql_error());


-----
____________________________________________________________________
Ну как то так, наверное.
http://grefon[dot]com
 
 Top
xhugo
Отправлено: 18 Марта, 2011 - 21:27:56
Post Id



Посетитель


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


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




это ясно.

Но я вот добавляю новый текст в бд из того что напарсил,
потом вывожу из бд
Нужно просто сделать проверку на наличии этой записи именно,текста. если есть то не добавляет, если есть - добавил новую
 
 Top
grefon
Отправлено: 18 Марта, 2011 - 21:35:29
Post Id



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


Покинул форум
Сообщений всего: 823
Дата рег-ции: Нояб. 2010  


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




Что-то вроде такого:
PHP:
скопировать код в буфер обмена
  1. $result = mysql_query("SELECT COUNT(*) FROM comments WHERE text = $s") or die (mysql_error());
  2. $temp = mysql_fetch_row($result);
  3. if (!$temp[0]) {
  4.     mysql_query("INSERT INTO comments (text) VALUES ('$s')") or die (mysql_error());
  5.     echo($s."<BR><BR><hr>");
  6. }

(Отредактировано автором: 18 Марта, 2011 - 21:36:23)



-----
____________________________________________________________________
Ну как то так, наверное.
http://grefon[dot]com
 
 Top
xhugo
Отправлено: 19 Марта, 2011 - 12:50:46
Post Id



Посетитель


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


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




PHP:
скопировать код в буфер обмена
  1. <?
  2. include ('config.php');
  3.   mysql_connect($sqlhost, $sqluser, $sqlpass);
  4.   mysql_query("SET NAMES `CP1251`") or die (mysql_error());
  5.   mysql_select_db($sqldb);
  6. ##########################################################
  7. preg_match_all('|<font face="(.*)</font>|mi',file_get_contents("http://muz4in.net/board/"),$pc);    
  8. foreach($pc[0] as $s)  
  9. {    
  10. if($s=="Добавить в Соц.Сеть" || $s=="Добавить в Ленту")
  11. {
  12. }
  13. else
  14. {
  15. # тут проверка на наличии т.п.
  16. $result = mysql_query("SELECT COUNT(*) FROM black WHERE text = $s") or die (mysql_error());
  17. $temp = mysql_fetch_row($result);
  18. if (!$temp[0]) {
  19.    // $md5 = md5($s);
  20.     mysql_query("INSERT INTO black (text) VALUES ('$s')") or die (mysql_error());
  21.     echo($s."<BR><BR><hr>");
  22. }
  23. }
  24. }  
  25. ?>


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ': я сейчас сидела, картошку молодую чистила, ' at line 1
 
 Top
Champion Супермодератор
Отправлено: 19 Марта, 2011 - 13:08:49
Post Id



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


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


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




тогда уж
xhugo пишет:

$s=htmlspecialchars(strip_tags($s), ENT_QUOTES) ;

А вообще есть mysql_real_escape_string
 
 Top
xhugo
Отправлено: 19 Марта, 2011 - 14:21:00
Post Id



Посетитель


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


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




PHP:
скопировать код в буфер обмена
  1. <?
  2. include ('config.php');
  3.   mysql_connect($sqlhost, $sqluser, $sqlpass);
  4.   mysql_query("SET NAMES `CP1251`") or die (mysql_error());
  5.   mysql_select_db($sqldb);
  6. ##########################################################
  7. preg_match_all('|<font face="(.*)</font>|mi',file_get_contents("http://muz4in.net/board/"),$pc);    
  8. foreach($pc[0] as $s)  
  9. {    
  10. if($s=="Добавить в Соц.Сеть" || $s=="Добавить в Ленту")
  11. {
  12. }
  13. else
  14. {
  15. # тут проверка на наличии т.п.
  16. $result = mysql_query("SELECT COUNT(*) FROM black WHERE text = $s") or die (mysql_error());
  17. $temp = mysql_fetch_row($result);
  18. if (!$temp[0]) {
  19.    // $md5 = md5($s);
  20.    $s=htmlspecialchars(strip_tags($s), ENT_QUOTES) ;
  21.     mysql_query("INSERT INTO black (text) VALUES ('$s')") or die (mysql_error());    
  22. }
  23. echo($s."<BR><BR><hr>");
  24. }
  25. }  
  26. ?>


вот эта часть +еще меняет кодировку...
PHP:
скопировать код в буфер обмена
  1. $result = mysql_query("SELECT COUNT(*) FROM black WHERE text = $s") or die (mysql_error());
  2. $temp = mysql_fetch_row($result);
  3. if (!$temp[0]) {


CODE (SQL):
скопировать код в буфер обмена
  1. You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near '” Слушай, Р° чем отличается Бизнес РѕС‚ работы? ' at line 1
 
 Top
EuGen Администратор
Отправлено: 19 Марта, 2011 - 19:57:58
Post Id


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


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


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




Решение с md5-индексами не годится в случае больших объемов данных. Как известно, md5 стойкий к коллизиям до определенной степени, кроме того, на его вычисление требуются затраты. Но он правда позволяет строить хороший индекс в случае, если объем данны колеблется в разумных пределах (то есть не слишком велим и не слишком мал)
Для больших текстовых полей можно как вариант использовать индексы ограниченной длины.
А по проверке - есть возможность это делать сразу, 1-м запросом. Почитайте про INSERT IGNORE


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DlTA
Отправлено: 19 Марта, 2011 - 20:24:22
Post Id



Постоянный участник


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


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




xhugo пишет:
SELECT COUNT(*) FROM black WHERE text = '$s'

кавычки не забывайте!!!
этож текстовое значение
 
 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