我想做一个表格,以便图书馆的用户可以进行高级搜索。我想我可以使用表单中硬编码的值并将它们附加到查询中(它们来自选择字段)。我还想过如何用尽可能少的代码来做到这一点,所以我会做一个爆炸,以防有人选择(单词)(即搜索单词而不是短语)。我的最终代码如下:
<?php
/**
* this variable is the result of the user
* selecting 'word' or 'phrase'
**/
$coleccion = implode('&', $keysres);
$contents_1 = array();
$contents_2 = array();
$contents_3 = array();
$words_1 = array();
$words_2 = array();
$words_3 = array();
switch ($coleccion) {
case 'palabras&palabras&palabras':
$contents_1 = preg_split('/[\s,]+/', $buscar_1);
foreach ($contents_1 as $word) {
array_push($words_1, " MATCH ($contenido_1) AGAINST ('$word') ");
}
$contents_2 = preg_split('/[\s,]+/', $buscar_2);
foreach ($contents_2 as $word) {
array_push($words_2, " MATCH ($contenido_2) AGAINST ('$word') ");
}
$contents_3 = preg_split('/[\s,]+/', $buscar_3);
foreach ($contents_3 as $word) {
array_push($words_3, " MATCH ($contenido_3) AGAINST ('$word') ");
}
$search_words_1 = implode(" OR ", $words_1);
$search_words_2 = implode(" OR ", $words_2);
$search_words_3 = implode(" OR ", $words_3);
$consulta = "
SELECT *
FROM catalogo
WHERE
$search_words_1 ".
$oper_1
." $search_words_2 ".
$oper_2 ."
$search_words_3 ";
break;
?>
问题是当我更改选择字段的值时,假设有人选择执行 OR 操作而不是 AND,并选择对我的第二个文本字段进行短语搜索,在这种情况下,我看不到搜索受到限制或扩大。例如,我对 case 进行了变量转储$coleccion=palabras&frase&palabras
,然后对查询进行了 var_dump,然后显示:SELECT * FROM catalogo WHERE MATCH (titulo) AGAINST ('mesones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('bariones') OR MATCH(titulo) AGAINST('mesones y totems') AND MATCH (titulo) AGAINST ('bariones')
所以我的问题是¿在 SQL 中限制/扩大搜索的正确方法是什么?不幸的是,我没有太多的数据库条目可供测试。
最后,我还设置了一些东西,以便尝试获取所有记录“除了”的查询以这种语法结束:
SELECT * FROM catalogo WHERE MATCH (titulo) AGAINST ('comunicaciones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('poder') AND NOT MATCH(titulo) AGAINST('mesones') AND NOT MATCH (titulo) AGAINST ('bariones')
但是我想知道这样的查询是否真的排除了指定的记录。或者我应该在布尔模式下使用前导减号,根据这个:
前导减号表示该单词不得出现在返回的任何行中。注意:- 运算符仅用于排除与其他搜索词匹配的行。因此,仅包含以 - 开头的术语的布尔模式搜索返回空结果。它不会返回“除了包含任何排除项的行之外的所有行。
我想我现在有一个关于我怀疑的例子。假设以下查询:
SELECT * FROM catalogo WHERE MATCH (titulo) AGAINST ('comunicaciones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('poder') AND MATCH (titulo) AGAINST ('mesones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('totems') AND NOT MATCH(titulo) AGAINST('bariones')
然后我想应该显示所有带有“comunicaciones”、“y”和“poder”的记录,以及带有“mesones”、“y”和“totems”的记录,但不显示带有“bariones”的记录'。但是,该查询的结果仅是我的数据库中带有单词 comunicaciones 的那些