2014-09-23 2 views
0

Я пытаюсь выполнить функцию поиска с использованием php и MySQL. Мне нужно искать из двух разных колонок, один для названия песни и один для художника и пользователь может выполнять поиск по:php MySQL Поиск по двум столбцам

1. artist name. 
2. song title. 
3. both of them (without order) 
4. there will be special characters for ex: ' (apostrophe) 

Это то, что я сделал, но мне нужен более эффективный способ сделать это. Я также думал, используя similar_text(); в php. Может ли кто-нибудь предложить мне лучший способ сделать это. Спасибо

стол: songs

|artist | title | 
|----------------------| 
|eminem | not afraid | 
|kida  | o'najr  | 

Мой код:

$search_value = $_POST["search_value"]; 
$query = "select * from `songs` where concat(`title`, `artist`) like '%$search_value%'"; 
+1

Есть ли что-то, что Безразлично Работа? Вы получаете какие-либо ошибки, которых вы не ожидаете? –

+1

Это выглядит ужасно неуверенно. Вы уверены, что ** ваши пользовательские параметры [правильно экранированы] (http://bobby-tables.com/php)? '$ _POST' ** НИКОГДА ** не переходит непосредственно в запрос. Без ускорения в какой-то форме это не сработает. – tadman

+1

Это работает, но вы знаете ... это не такое хорошее решение. Также напр. он не должен работать с частью строки. Напр. если вы ищете: рейд, это показывает Eminem - Not Afraid в результате. и этого не должно быть. –

ответ

1
  1. Вы должны использовать SQL OR заявление, лучше, чем CONCAT один в этом случае.

  2. В сочетании с пространством до и после того, что вы ищете, это должно дать вам ожидаемый результат! (я имею в виду, что если вы ищете «рейд», вы не найдете «Eminem - Not Afraid», если вы хотите его найти, вам нужно искать «боязнь» для примера: если вы хотите отсортировать результаты по откровению, вы должны будут создавать индексы и использовать их или использовать метод Левенштейна или что-то еще ...)

  3. Не забудьте избежать данных, прежде чем использовать их в операциях sql.

Btw, если вы хотите, чтобы сделать его случай insesitive вам придется использовать blabla COLLATE UTF8_GENERAL_CI LIKE %what you search% blabla

// if you are using mysql_connect() 
$search_value = ' '.mysql_real_escape_string($_POST["search_value"]).' '; 
$query = "select * from `songs` where `title` like '%$search_value%' or `artist` like '%$search_value%'"; 

// if you are using PDO 
$args[':search_value'] = '% '.$_POST["search_value"].' %'; 

$query = "SELECT * FROM `songs` WHERE `title` LIKE :search_value OR `artist` LIKE :search_value"; 

$qry = $PDO->prepare($query); 
$res = $qry->execute($args); 

В течение нескольких слов-поиск Вы можете также использовать

// for mysql_connect() 
$search_value = $_POST["search_value"]; 
$search_value = explode(' ', $search_value); 
foreach($search_value as $k => $v){ 
    $search_value[$k] = mysql_real_escape_string($v); 
} 
$search_value = ' '.implode(' % ', $search_value).' '; 

// for PDO 
$search_value = explode(' ', $_POST["search_value"]); 
$search_value = implode(' % ', $search_value); 
$args[':search_value'] = '% '.$search_value.' %'; 
1

Вы можете просто использовать SQL или заявление, если вы не хотите путаницы.

$search_value = $_POST["search_value"];//check user input first than create a query. 
$query = "select * from `songs` where `title` like '%$search_value%' or `artist` like '%$search_value%'"; 
Смежные вопросы