2014-09-23 71 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) 

这是我做了什么,但我需要一个更有效的方式来做到这一点。我也曾想过在php中使用similar_text();。任何人都可以建议我一个更好的方法来做到这一点谢谢

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

是否有没有按什么不工作?你有没有想到的任何错误? – 2014-09-23 18:31:52

+1

这看起来恐怖不安全。你确定**你的用户参数是[妥善转义](http://bobby-tables.com/php)? '$ _POST'数据**从不**直接进入查询。没有以某种形式逃脱,这是行不通的。 – tadman 2014-09-23 18:33:53

+1

它的工作原理,但你知道...这不是一个很好的解决方案。也为前例。它不应该与字符串的一部分一起工作。例如。如果你搜索:raid它显示阿姆 - 不害怕的结果。这不应该发生。 – 2014-09-23 18:35:46

回答

1
  1. 您应该使用SQL语句OR,优于CONCAT一个在这种情况下。

  2. 结合你搜索前后的空间,这应该会给你预期的结果! (我的意思是,如果你搜索'raid',你不会找到'Eminem - 不怕',如果你想找到它,你必须搜索'怕'为例;如果你想按照目的排序结果,你将不得不创建索引和使用它们,或使用Levenshtein方法或其他东西...)

  3. 不要忘记在sql语句中使用它之前逃避你的数据。

顺便说一句,如果你想使它情况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%'";