[英]php MySQL Search on two columns
我正在嘗試使用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%'";
如果您不希望混淆,可以只使用sql或statement。
$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%'";
在這種情況下,您應該使用SQL OR
語句,它比CONCAT
更好。
在搜索之前和之后加上空格,這應該為您提供預期的結果! (我的意思是,如果您搜索“突襲”,您將找不到“阿姆-不害怕”,如果要找到它,則必須搜索“害怕”;例如,如果您想通過啟示來對結果進行排序,必須創建索引並使用它們,或者使用Levenshtein方法或其他方法...)
在sql語句中使用數據之前,請不要忘記轉義數據。
順便說一句,如果您想使其變得不敏感,則必須使用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.' %';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.