Php MySQLi全文搜索多栏类别
我想根据复选框的选择进行mysqli全文搜索,包括或不包括多个类别 搜索基于同一列中的四个类别 搜索类别包括windows、游戏、平板电脑和手机 当通过复选框选择类别/多个类别时,应仅对所选类别执行选择搜索 表结构Php MySQLi全文搜索多栏类别,php,mysqli,full-text-search,Php,Mysqli,Full Text Search,我想根据复选框的选择进行mysqli全文搜索,包括或不包括多个类别 搜索基于同一列中的四个类别 搜索类别包括windows、游戏、平板电脑和手机 当通过复选框选择类别/多个类别时,应仅对所选类别执行选择搜索 表结构 id category title date ... 1 windows windows7 d1 ... 2 games windows games d2 ... 3 table
id category title date ...
1 windows windows7 d1 ...
2 games windows games d2 ...
3 tablet windows tablet d3 ...
4 mobile windows mobile d4 ...
5 windows windows8 d5 ...
6 windows windows vista d6 ...
用于搜索的复选框为
搜索
<li><label><input name="all" type="checkbox" checked="checked" />All</label></li>
<li><label><input name="windows" type="checkbox" />Windows OS</label></li>
<li><label><input name="mobile" type="checkbox" />Windows Mobile</label></li>
<li><label><input name="games" type="checkbox" />Windows Games</label></li>
<li><label><input name="tablet" type="checkbox" />Windows Tablet</label></li>
例2:
Search for 'windows' should return result as
windows7
windows8
windows vista
windows games
When checkbox windows and games are checked.
我提出了一个问题,但根本不起作用
$query = "SELECT * FROM $table WHERE ";
$query .= "category='' ";
$query .= "OR category='windows' ";
$query .= "OR category='games' ";
$query .= "OR category='mobile' ";
$query .= "OR category='tablet' ";
$query .= " AND MATCH (title) AGAINST ('+$keyword*' IN BOOLEAN MODE) ORDER by id desc, title desc LIMIT 10";
我也试过这样做,但不起作用
$query = "SELECT * FROM $table WHERE ";
$query .= "MATCH (category) AGAINST ('' IN BOOLEAN MODE) ";
$query .= "OR MATCH (category) AGAINST ('windows' IN BOOLEAN MODE) ";
$query .= "OR MATCH (category) AGAINST ('games' IN BOOLEAN MODE) ";
$query .= "OR MATCH (category) AGAINST ('mobile' IN BOOLEAN MODE) ";
$query .= "OR MATCH (category) AGAINST ('tablet' IN BOOLEAN MODE) ";
$query .= " AND MATCH (title) AGAINST ('+$keyword*' IN BOOLEAN MODE) ORDER by id desc, title desc LIMIT 10";
请查看其不起作用的原因,并建议如何对所选字段进行搜索查询
谢谢
SELECT * FROM table WHERE MATCH (field1, field2, field3, field4)
AGAINST ('keyword' IN BOOLEAN MODE)
似乎是你需要的
但是您的查询对SQL注入非常开放
现在可以回答了。因此,这里有一个基于的解决方案(因为原始mysqli需要太多代码)
请注意,您必须按以下方式调用复选框字段:
<input name="category[]" value="windows" type="checkbox" />
所有这些匹配字段与'field1'的要点是什么
?看起来很奇怪me@YourCommonSense表中有一些列,如果包含选定字段,则应仅根据行的标题进行搜索。是否收到错误消息?请考虑张贴小提琴或一些示例数据和表模式的链接。缺乏此类信息的问题很难回答,而且经常被否决。我假设field1、field2等是同一表中的其他字段。如果是这样的话,请取消对它们的引用,查询应该有效,即field=field1或field=field2或…@roberteddon Smith yes field1、field2等是同一表格中同一列的其他字段,没有错误,但查询结果不相关。@RobertSeddon Smith取消引用字段给出语法错误。您的查询将字段与关键字匹配,就像它们是不同的列一样,但有一个字段列与许多字段匹配,字段应仅与字段匹配,标题与关键字匹配。“字段”和“列”是同义词。所以,我不知道你在说什么。将一个字段与另一个字段进行匹配是没有意义的。先生,将一列中的不同值与另一列中匹配的特定关键字进行匹配是很难理解的。字段只是我用来表示列字段值的一个词。为了进一步澄清,我举了一个例子,假设关键字为k
,将在标题中搜索仅包含字段1或字段2的行。
$sql = "SELECT * FROM ?n WHERE category IN(?a)
AND MATCH (title) AGAINST (?s IN BOOLEAN MODE) ORDER by id desc LIMIT 10";
$data = $db->($sql,$table,$_GET['category'], $_GET['keyword']);
<input name="category[]" value="windows" type="checkbox" />