我正在建立一个漫画网站并实施了搜索。搜索最初使用图像标题...这很好用:
if (strtolower($input)==strtolower(substr($row['title'],0,strlen($input)))) {
但现在我觉得很多人都不会记得这个头衔。所以我在数据库中添加了一个名为“keywords”的列,varchar [55] ...我的测试条目是字符串“five,second,rule,food,rules”。我想我可以用$row['title']
替换$row['keywords']
,搜索仍然有用。
如果我从字符串的开头开始搜索就行了,比如我输入“five,seco ......”但是如果我从字符串的中间开始,如“second”或“rule”等,则不行
关于我如何才能做到这一点的任何想法?
谢谢!
答案 0 :(得分:7)
在漫画专栏中这样做只会带来眼泪,因为它会破坏正常化。你应该做的是创建一个关键字表,每个条目有一个单词,然后是一个与关键字匹配的数据透视表到漫画。然后你可以加入一个来找到匹配的所有漫画。
设置工作更多,但从长远来看更灵活。
编辑:
关键字表:
id keyword
1 x-men
2 action
3 mystery
4 batman
etc.
comic_keyword表
comic_id keyword_id
45 3
678 1
678 2
77 3
77 4
etc.
第二个表(数据透视表)将漫画的ID与他们关联的关键字的ID相匹配。这就是多数情况下应该建立多对多关系的方式。
答案 1 :(得分:4)
直接的解决方案是使用stripos
代替:
if(stripos($input, $row['title']) !== false) {
// row matches
}
但是,这不是一个好的解决方案。将过滤卸载到数据库会更好,因此不匹配的行根本不需要前往您的前端。如果您将关键字保留为以逗号分隔的字段,那么LIKE
或REGEXP
将是一个很好的工具选择;如果您规范化了数据库模式,以便将漫画与关键字的1对多关系建模为单独的comic_keywords
表格,那么匹配将更加容易。
例如,假设comic
有id
且comic_keywords
有comic_id
和keyword
,您可以选择匹配的漫画
SELECT DISTINCT(comic_id) FROM comic_keywords WHERE keyword = 'blah'
答案 2 :(得分:1)
您可以动态拆分列:
if (in_array(strtolower($input), explode(', ', $row['title']))) {
/* found it */
}
答案 3 :(得分:0)
看起来您需要Sphinx或(不太可能,但更容易设置)MySQLs full-text search。