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

标签 php mysql

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

nan mu

将以任何顺序返回包含 nanmu 的任何字符串。只有两位,使用 array_filter()this 中的解决方案相当容易回答创建字符串

%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 注入(inject)的人,谢谢,但不用了,我使用 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 以任意顺序查找所有这些单词?

最佳答案

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

关于php - 从空格分隔的句子创建 LIKE 友好字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25125251/

相关文章:

php - 使用 php/html 表单插入 mysql - 不起作用

php - MySQL JSON 编码数据

mysql - 使用 mysql 和 knex 将 SELECT COUNT 保存到变量中

php - Left Join 在 CMD 提示下工作,而不是 PHP

sql - 执行 Django 原始 SQL(使用 "WHERE col IN"语法)或将原始 SQL 转换为 .raw() 或 .extra()

php - 如何在 WORDPRESS 中将图像作为 "SSL"提供

php - 为什么 Linkedin Ugc Image Post 返回 500 错误?

javascript - 使用 Ajax 将数据传递到 PHP 文件

javascript - 我可以使用 php 对 API 进行计划查询并将其保存在本地吗?

javascript - 如何将数据从 HTML 表单获取到 JavaScript 文件并添加 MySQL?