Я хочу сделать полнотекстовый поиск mysqli с или без нескольких категорий на основе выбора флажка.
Поиск основан на четырех категориях в одной колонке.
Категория поиска – это окна, игры, планшеты, мобильные телефоны.
Когда категория / множественная категория, выбранная путем выбора выбора флажка, должна выполняться только для выбранной категории.
Структура таблицы
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>
Example1:
Search for 'windows' should return result as windows7 windows8 windows vista When only checkbox windows is checked
Example2:
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-инъекции.
Теперь можно ответить. так, здесь идет решение, основанное на safeMysql (поскольку raw mysqli будет занимать слишком много кода)
$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" />