从用空格分隔的句子中创建类似友好的字符串。

3
我可以帮助您进行翻译。以下是您需要翻译的内容:

我希望允许我的用户使用任意顺序的部分单词在数据库中搜索数值,因此要搜索的字符串为:

nan mu

这段代码会返回任何包含nanmu的字符串,顺序不限。使用array_filter()该答案中提供的解决方案,只需两个位即可创建字符串。

%nan%mu%
%mu%nan%

让MySQL搜索这些内容。现在当有两个以上的位时,例如 nan mu te, 我们就会遇到问题。目的是获取这些字符串:

$string1 = %nan%mu%te%
$string2 = %nan%te%mu%
$string3 = %mu%nan%te%
$string4 = %mu%te%nan%
$string5 = %te%nan%mu%
$string6 = %te%mu%nan%

需要构造6个mysql LIKE条件:WHERE Field LIKE $string1 AND Field LIKE $string2 ...,以便结果中包含这三个位的任何可能性。

对于那些要抱怨sql注入的人,谢谢,但我使用PDO和参数化查询。

我的实际尝试字符串为nan mu te

class EstDefini
 {private $STR;
  function __construct($vSTR)
   {$this->STR = $vSTR;}
  function Verifier($vSTR)
    {return !($vSTR == $this->STR);}}

$vString = 'nan mu te';

$aBits = explode(' ',$vString);
$vNb = count($aBits);

for ($i=0;$i<$vNb;$i++)
 {$vAppend = implode('%',array_filter($aBits,array(new EstDefini($aBits[$i]),'Verifier')));
  $aLiterals[$i] = '%' . $aBits[$i] . '%' . $vAppend;}

返回值只有3个字符串,因为我的初始计数只有三个(从我的爆炸字符串中得到了三个比特):(这是var_dump($aLiterals))。

array(3) {
  [0]=>
  string(10) "%nan%mu%te"
  [1]=>
  string(10) "%mu%nan%te"
  [2]=>
  string(10) "%te%nan%mu"
}

我最初的想法是修改计数:

$vNb = $vNb * max($vNb-1,1);

尝试移动其他位以获得不同的LIKE友好字符串,但由于我的初始$aBits数组仍然是大小为3的,因此这个类创建调用new EstDefini($aBits[$i])将尝试访问未定义的位。

如何从以空格分隔的单词创建LIKE友好字符串,以便在MySQL中以任何顺序查找所有这些单词?

2个回答

6

我认为这种方法有些不对 - 为什么需要检查是否 field LIKE '%a%b%' OR field LIKE '%b%a%',而不是直接检查它是否 field LIKE '%a%' AND field LIKE '%b%',这样可以覆盖两者。

$words = explode(' ', $string);
$params = array_fill(0, count($words), '(?)');
$search = implode(' AND field LIKE ', $params);
$db->prepare("SELECT * FROM table WHERE field LIKE $search");

$query->execute(array_map($words, function($word) { return '%' . $word . '%'; }));

1
+1 我只想评论一下过于复杂的检查。使用 lambda 函数的解决方案非常好。 - VMai

0

将该字符串分解为数组:

$array = explode(" ", $string);

在那之后,你可以为查询创建一个字符串,例如:
$query = "SELECT * FROM table WHERE column LIKE (";

然后像这样添加变量:

$query .= "" . $array[0] . " OR "; //Or there for multiple strings.

然后用以下方式结束字符串队列:

$query .= ")";

可能不是最有效的方法,但可以完成任务。如果需要更详细的解释,请在评论区留言。


这样不行:我不希望只包含其中一个位的字符串被返回,而使用或运算符会导致这种情况发生。 - Félix Adriyel Gagnon-Grenier
你们的搜索长度有限制吗? - Joe Kasavage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接