我正在建立一个漫画网站,并实现了搜索。搜索最初使用图像标题...这工作正常:
if (strtolower($input)==strtolower(substr($row['title'],0,strlen($input)))) {
但现在我觉得很多人不会记得这个标题。所以我在数据库中添加了一个名为"关键字"的列,varchar [55]...我的测试条目是字符串"五,第二,规则,食物,规则"。我想我可以用$row['keywords']
替换$row['title']
,搜索仍然有效。
如果我从字符串的开头开始搜索,就像我输入"五,seco..."但如果我从字符串的中间开始,比如"秒"或"规则"等,则不会。
关于我如何做到这一点的任何想法?
谢谢!
在漫画的专栏中这样做只会带来眼泪,因为它打破了正常化。 你应该做的是制作一个关键字表,每个条目有一个单词,然后创建一个将关键字与漫画匹配的数据透视表。 然后,您只需加入即可找到所有匹配的漫画。
设置工作更多,但从长远来看更灵活。
编辑:
关键字表:
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 进行匹配。 这就是在大多数情况下应该对多对多关系进行建模的方式。
直接的解决方案是改用stripos
:
if(stripos($input, $row['title']) !== false) {
// row matches
}
但是,这并不是一个好的解决方案。最好将筛选卸载到数据库,这样不匹配的行就不必前往前端。如果您将关键字保留为逗号分隔的字段,那么LIKE
或REGEXP
将是一个不错的工具选择;如果您规范化了数据库架构,以便使用单独的comic_keywords
表对漫画与关键字的一对多关系进行建模,则匹配将更加容易。
例如,假设comic
有一个id
,comic_keywords
有一个comic_id
和一个keyword
,你可以选择匹配的漫画
SELECT DISTINCT(comic_id) FROM comic_keywords WHERE keyword = 'blah'
您可以即时拆分列:
if (in_array(strtolower($input), explode(', ', $row['title']))) {
/* found it */
}
看起来你需要狮身人面像或(不太可能,但更容易设置)MySQL的全文搜索。