从空格分隔的句子创建LIKE友好字符串

Fél*_*ier 3 php mysql

我想允许我的用户使用任何顺序的部分单词在数据库中搜索值,以便搜索到的字符串:

nan mu
Run Code Online (Sandbox Code Playgroud)

会以任何顺序返回包含both nan和的任何字符串mu.只有两位,它很容易array_filter()这个答案中的解决方案创建字符串

%nan%mu%
%mu%nan%
Run Code Online (Sandbox Code Playgroud)

这样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%
Run Code Online (Sandbox Code Playgroud)

并使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;}
Run Code Online (Sandbox Code Playgroud)

只返回3个字符串,因为我的初始计数只有三个(我的爆炸字符串有三位):(这是var_dump($aLiterals))

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

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

$vNb = $vNb * max($vNb-1,1);
Run Code Online (Sandbox Code Playgroud)

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

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

dav*_*ave 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 . '%'; }));
Run Code Online (Sandbox Code Playgroud)