php MySQL搜索两列

时间:2014-09-23 18:29:36

标签: 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%'";

2 个答案:

答案 0 :(得分: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%'";

答案 1 :(得分:1)

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

  2. 结合您搜索之前和之后的空格,这应该会给您预期的结果! (我的意思是,如果你搜索' raid'你将找不到' Eminem - Not Afraid',如果你想找到它,你必须寻找'害怕'例如;如果你想通过revelance对结果进行排序,你将不得不创建索引并使用它们,或者使用Levenshtein方法或其他东西......)

  3. 在sql语句中使用之前不要忘记转义数据。

  4. 顺便说一句,如果你想让它成为一个案例,你将不得不使用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.' %';