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



我希望允许我的用户使用任意顺序的部分词搜索数据库中的值,以便这个搜索字符串:

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个字符串,因为我的初始计数只有3个(从我的爆炸字符串中有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中以任何顺序查找所有这些单词?

我认为这种方法有点错误-为什么你需要检查它是否为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 . '%'; }));

将所述字符串插入数组:

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

之后,您可以为查询创建一个字符串,如:

$query = "SELECT * FROM table WHERE column LIKE (";

然后添加如下变量:

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

然后以:

结束字符串队列
$query .= ")";

可能不是最有效的方法,但可以完成工作。

相关内容

  • 没有找到相关文章

最新更新