我有一个带有 mysql 数据库的本地分类网站,并且正在使用 PHP。它有一个存储列表的表,但我们将只使用 3 列进行搜索:
列标题、描述、价格
当用户输入短语(例如“合理使用的移动设备 20,000”)时,搜索数据库的最佳方法是什么
如果短语有效地匹配数据库中的任何内容,我希望能够搜索 3 列。我知道“%LIKE”功能,但我认为应该有更好的方法。
您应该explode()
搜索每个单词的字符串。另一方面,您必须设置正确的列类型,price
因为20,000
它不是有效的数字类型,您需要将 20.000 存储在 db 中并将 php 20,000 转换为 20.000,或者,
不仅通过可用空间来分解字符串。
一个简单的分解可以通过将字符串拆分为' '
- 空闲空间来完成,它适用于您的变体,但如果用户键入它则不起作用,fairly, used
因为 `LIKE '%fairly,%' 不会返回所需的输出。
我将展示一个简单的空字符串爆炸代码,只是为了解释逻辑,但我希望你可以通过稍后替换不需要的字符来使搜索引擎更智能。
<form action="" method="post">
<input type="text" name="phrase" />
<input type="submit" />
</form>
<?php
$phrases = isset($_POST['phrase']) ? $_POST['phrase'] : null;
$phrases = explode(' ', $phrases);
foreach ($phrases as $phrase) {
$queries[] = $db->query("SELECT title, description, price
FROM test
WHERE title LIKE '%$phrase%'
OR description LIKE '%$phrase%'
OR price LIKE '%$phrase%';
");
}
// managing the output should be done depending on the db library you are using
您可以尝试如下:
$search = 'fairly used mobile devices 20,000';
list_title like '%".implode('%', explode(' ', $search))."%'
不要使用喜欢,
在您的 3 列上定义全文索引
并作为全文搜索
你可以试试这样的
$search = 'fairly used mobile devices 20,000';
SELECT *
FROM YOUR_TABLE
WHERE column_title like '%$search%'
OR description like '%$search%'
OR price like '%$search%'
ORDER BY CASE WHEN `column_title` LIKE '%$search%' THEN 0
WHEN `description` LIKE '%$search%' THEN 1
WHEN `price` LIKE '%$search%' THEN 2
ELSE 3
END
如果要搜索每个单词,则必须用空格拆分字符串并将其添加到查询中