Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwarka - problem z pobieraniem z bazy
Forum PHP.pl > Forum > Bazy danych > MySQL
matilapy21
Witam, mam od pewnego czasu problem z wyszukiwarka, sprawdzałem ja na paru frazach i wydawało mi sie ze działała dobrze. Byłem w błedzie. Po wpisaniu frazy w wyszukiwarke nie szuka ona prawidlowo i jest to problem z zapytaniem do bazy danych, Zrobilem tak aby szukala po tytulach ale.... szuka dobrze tylko 1 słowo, po wpisaniu 2 szuka albo 1 slowo albo 2, prawdopodobnie szuka 1+2 ale nie jest to wyswietlone na samej gorze bo mam spora baze danych i jest zasypane przez inne rzeczy. Moze ktos mi pomoc?

Tak wyglada moj kod. Umieszczam całosc a nie tylko same zapytania bo moze w czyms innym tkwi problem
  1.  
  2.  
  3. $active = ( $config['approve'] == 1 ) ? " AND active = '1'" : NULL;
  4. $search_id = ( isset($_REQUEST['search_id']) ) ? mysql_real_escape_string($filterObj->process($_REQUEST['search_id'])) : NULL;
  5. $search_type = ( isset($_REQUEST['search_type']) ) ? $_REQUEST['search_type'] : 'videos';
  6. $search_key = ( isset($_REQUEST['search_key']) ) ? mysql_real_escape_string($filterObj->process($_REQUEST['search_key'])) : NULL;
  7. $sort = ( isset($_REQUEST['sort']) && strlen($_REQUEST['sort']) <= 7 ) ? $_REQUEST['sort'] : NULL;
  8. $page = ( isset($_GET['page']) && is_numeric($_GET['page']) ) ? trim($_GET['page']) : 1;
  9. $viewtype = ( isset($_REQUEST['viewtype']) && $_REQUEST['viewtype'] == 'detailed' ) ? 'detailed' : 'basic';
  10.  
  11. switch ( $sort ) {
  12. case 'addate':
  13. $sortby = " ORDER BY adddate DESC";
  14. break;
  15. case 'viewnum':
  16. $sortby = " ORDER BY viewnumber DESC";
  17. break;
  18. case 'rate':
  19. $sortby = " ORDER BY (ratedby*rate) DESC";
  20. break;
  21. default:
  22. $sortby = " ORDER BY title";
  23. }
  24.  
  25. if ( $search_id == '' && $search_key == '' ) {
  26. $err = $lang['search_result.query_empty'];
  27. }
  28.  
  29. $searching = false;
  30. $total = 0;
  31. $start_num = NULL;
  32. $end_num = NULL;
  33. $videos = array();
  34. $ch = NULL;
  35. if ( $err == '' ) {
  36. if ( $search_type == 'search_users' ) {
  37. $sql = "SELECT UID, username FROM signup WHERE username LIKE '%" .$search_id. "%' LIMIT 1";
  38. $rs = $conn->execute($sql);
  39. if ( $conn->Affected_Rows() ) {
  40. $uid = $rs->fields['UID'];
  41. $username = $rs->fields['username'];
  42. $URL = seo_url('users/' .$username, 'uprofile.php?UID=' .$uid);
  43. header('Location: ' .$URL);
  44. die();
  45. } else {
  46. $err = $lang['search_result.nothing'];
  47. }
  48. } elseif ( $search_type == 'search_groups' ) {
  49. $URL = $config['BASE_URL']. '/search_group.php?search_type=' .$search_type. '&search_id=' .$search_id;
  50. header('Location: ' .$URL);
  51. die();
  52. } elseif ( $search_type == 'related' ) {
  53. $searching = true;
  54. $list = key_to_info($search_key);
  55. $ch = explode(' ', $list['2']);
  56. if ( count($ch) > 1 ) {
  57. $channel = NULL;
  58. for ($i=1; $i<count($ch); $i++) {
  59. $channel .= "OR keyword LIKE '%" .mysql_real_escape_string($ch[$i]). "%'";
  60. }
  61. }
  62. $sql_count = "SELECT count(VID) AS total_videos FROM video WHERE type = 'public' AND (title LIKE '%" .mysql_real_escape_string($ch['0']). "%' " .$channel. ")";
  63. $sql = "SELECT * FROM video WHERE type = 'public' AND (title LIKE '%" .mysql_real_escape_string($ch['0']). "%' " .$channel. ") ORDER BY VID ASC";
  64. } else {
  65. $searching = true;
  66. $searches = explode(' ', $search_id);
  67. $query = "(";
  68. $query_add = NULL;
  69. foreach ( $searches as $item ) {
  70. $query .= $query_add. "title REGEXP '[^a-z0-9]" .mysql_real_escape_string($item). "[^a-z0-9]' OR title REGEXP '^" .mysql_real_escape_string($item). "[^a-z0-9]' OR title REGEXP '[^a-z0-9]" .mysql_real_escape_string($item). "$'";
  71. $query_add = " OR ";
  72. }
  73. $query .= ")";
  74. $sql_count = "SELECT count(VID) AS total_videos FROM video WHERE type = 'public'" .$active. " AND " .$query. $sortby;
  75. $sql = "SELECT * FROM video WHERE type = 'public'" .$active. " AND " .$query. $sortby;
  76. }
  77.  
  78. if ( $searching ) {
  79. $ars = $conn->execute($sql_count);
  80. $total = $ars->fields['total_videos'];
  81. $pagination = new Pagination($config['items_per_page']);
  82. $limit = $pagination->getLimit($total);
  83. $sql = $sql. " LIMIT " .$limit;
  84. $rs = $conn->execute($sql);
  85. $videos = $rs->getrows();
  86. $pagination_url = $config['BASE_URL']. '/search/{#PAGE#}/?sort=' .$sort. '&search_type=' .$search_type. '&search_id=' .$search_id. '&search_key=' .$search_key;
  87. $page_link = $pagination->getPagination($pagination_url);
  88. $start_num = $pagination->getStartItem();
  89. $end_num = $pagination->getEndItem();
  90. $tags = group_tags($sql);
  91. STemplate::assign('tags',$tags);
  92.  
  93. if ( $total == 0 ) {
  94. $err = $lang['search_result.nothing'];
  95. }
  96. }
  97. }
  98.  
  99.  
  100.  

prond
Może zamiast kombinować z generowaniem zapytań w PHP wykorzystasz wbudowany w MySQL mechanizm : http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

Kolejnym dobrym rozwiązaniem jest Zendowa implementacja Lucene : http://framework.zend.com/manual/en/zend.search.lucene.html
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.