2016-12-07 3 views
0

Я получил этот код:PHP поиск MySQL

function searchMovie($query) 
    { 
     $this->db->where("film_name LIKE '%$query%'"); 
     $movies = $this->db->get ("films", 40); 
     if($this->db->count > 0) 
     { 
      return $movies; 
     } 
     return false; 
    } 

код Javascript из моих Отправить форму кнопки полос все специальные символы, такие как; : '/ etc из строки запроса, а затем перенаправляет пользователя на поиск uri (szukaj/query). Так, например, если film_name - Raj: wiara, а пользователь ищет raj: wiara, запрос выглядит как raj wiara, и пользователь не получает никаких результатов. Я подумывал о том, чтобы взломать запрос на отдельные слова, а затем слово foreach сделает SELECT из db, но это даст несколько результатов одного и того же фильма. Не хочу менять код javascript, и я думаю, что не могу назвать имена этих фильмов без специальных символов, таких как:. Или, может быть, создать другой столбец в db для film_keywords и добавить туда все слова фильма, разделенные или что-то, а затем искать этот столбец?

+0

Какие рамки вы здесь используете? Почему вы не используете значения placeholder для таких вещей, как '$ query'? Ввод этого непосредственно в строку запроса чрезвычайно опасен. – tadman

ответ

2

полнотекстовый поиск функции MySQL, ваш друг здесь:

http://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html

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


Предупреждение: $this->db->where("film_name LIKE '%$query%'"); открыт для инъекций SQL. Любой может обойти JavaScript, чтобы вы всегда очищали входную серверную часть. Это лучше всего делать с использованием функций БД, а не просто зачищать символы - поэтому проверьте, какая библиотека вы используете для этого.

+0

Я сделал 'SELECT * FROM' films' WHERE MATCH (film_name) AGAINST ('+ Raj' IN BOOLEAN MODE) ' И он не ответил ни одного совпадения – buli

+0

Я использую PHP мой администратор. Когда я выбираю таблицу, я нажимаю «Полный текст» на 'ALTER TABLE' films' ADD FULLTEXT ('film_name'); ' – buli

+0

Хорошо, если я ищу Raj: wiara он возвращает совпадения. Но когда я печатаю только «raj» или даже «raj:», это не так. – buli

1

Вы действительно можете взорвать свою строку, используя решение this answer.

function searchMovie($query) 
    { 
     $queries = preg_split('/[^a-z0-9.\']+/i', $query); 
     foreach ($queries as $keyword){ 
      $this->db->where("film_name LIKE '%$keyword%'"); 
     } 

     $movies = $this->db->get ("films", 40); 
     if($this->db->count > 0) 
     { 
      return $movies; 
     } 
     return false; 
    } 

Это создаст несколько AND условия для вашего дб, где, так что результат будет фильтроваться.

+0

Спасибо за помощь! Может быть хорошо, но я буду использовать полнотекстовый ответ, он выполнил поиск и т. Д. ... который мне подходит лучше :) В любом случае спасибо! – buli