我有一个数据库中的地方表,它包含两行标题和描述
我通过PHP和MYSQL进行搜索
$select_place = $mysqli->query("SELECT * FROM places where title LIKE '%$searchname%' or description LIKE '%$searchname%'");
$num_place = $select_place->num_rows;
while ($rows_place = $select_place->fetch_array(MYSQL_ASSOC)){
$id_place = $rows_place ['id'];
$title_place = $rows_place ['title'];
$description_place = $rows_place ['description'];
echo "<p>{$title_place}</p><br>";
}
它运作良好,但是,例如,如果你搜索单词tower如果以错误的方式写作如twer或towr它不起作用我怎样才能使它更聪明?
答案 0 :(得分:2)
一个好的选择是包含MySQL SOUNDEX()
函数:
SELECT
*
FROM
places
WHERE
title LIKE '%$searchname%'
OR description LIKE '%$searchname%'
OR SOUNDEX(title) = SOUNDEX('$searchname')
OR SOUNDEX(description) = SOUNDEX('$searchname')
这将匹配您示例中的towr
和twer
。
更多信息可以在这里找到:
http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_soundex
请注意:
目前实施的这项功能旨在与之合作 仅限英语的字符串。其他字符串 语言可能无法产生可靠的结果。
答案 1 :(得分:0)
我找到了非常有用的方法
这里是
$searchname = stringsafe($_GET['search']);
$searchname2 = explode(" ", $searchname);
$query = "SELECT * FROM places WHERE ";
foreach ($searchname2 as $each) {
$i++;
if($i == 1){
$query .= " title LIKE '%$each%'
OR description LIKE '%$each%'
OR SOUNDEX(title) = SOUNDEX('$each')
OR SOUNDEX(description) = SOUNDEX('$each')";
}else{
$query .= " OR title LIKE '%$each%'
OR description LIKE '%$each%'
OR SOUNDEX(title) = SOUNDEX('$each')
OR SOUNDEX(description) = SOUNDEX('$each')";
}
}
$select_place = $mysqli->query("$query limit 20");
$num_place = $select_place->num_rows;
if($num_place == 0){
echo "<div class='message-no'>No results</div>";
}
else{
while ($rows_place = $select_place->fetch_array(MYSQL_ASSOC)){
$id_place = $rows_place ['id'];
$title_place = $rows_place ['title'];
$description_place = $rows_place ['description'];
echo $title_place."<br>";
}