PHP 在查询数据库表中搜索多个单词

标签 php mysql search

我有一个用户查询和一个数据库。我的数据库包含表。我很想知道的是我查询数据库的方法。我的想法是:

  • 将查询分隔成一个由空格分隔的数组
  • 循环遍历每个单词并执行 LIKE '%{$word}%' OR
  • 在此之上,在每次迭代之前执行“AND”

问题是,它无法正常工作。它没有对与我的查询相匹配的精确电子邮件进行切割。这是我的代码:

$i=0;
$userQuery = $_POST['q']; // q = "Jonathan gmail"
$sql = "SELECT * FROM addresses WHERE ";
$parts = explode(' ',$userQuery);
$cnt=count($parts);
foreach($parts as $part){
  $part = mysql_real_escape_string($part);
  if($i!==$cnt-1){
        $sql.="(
                addresses.name LIKE  '%".$part."%' OR
                addresses.localpart LIKE  '%".$part."%' OR
                addresses.domain LIKE  '%".$part."%'
            ) AND
        ";
    } else {
        $sql.="(
                addresses.name LIKE  '%".$part."%' OR
                addresses.localpart LIKE  '%".$part."%' OR
                addresses.domain LIKE  '%".$part."%'
            )
        ";
    }
    $i++;               
}

}

我的问题是这个逻辑有什么问题吗?看来是准确的。

最佳答案

首先:这会在一个单词上中断。 第二:这就是除了免受 SQL 攻击之外的一切。

现在 - 我会怎么做

$parts = preg_split('/[\s,]+/',$userQuery);
$sql=array();
foreach($parts as $part) {
  $part=mysql_real_escape_string($part); //Or whatever works with your DB access framework
  $sql[]="(addresses.name LIKE '%$part%' OR addresses.localpart LIKE '%$part%' OR addresses.domain LIKE '%$part%')";
}
$sql=implode(' AND ', $sql);
$sql="SELECT * FROM addresses WHERE $sql";

关于PHP 在查询数据库表中搜索多个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16876395/

相关文章:

mysql - MySQL 中 SELECT 和 INSERT 语句的条件

Mysql 查询导致整个站点崩溃

mysql - 配置 Sphinx 以索引一组动态表

python - 如何找到文件中连续重复字符分组的最长链

php - PDO 的 fetchAll() 方法返回查询请求的一半列。没有抛出异常

php - 计算 2 个字段中不同值的出现次数

php - 错误的时间戳/时区转换

php - 如何使表格将相同的列打印到一行中?

切换到 mysqli 后 PHP 代码不再工作

php - 如何搜索部分/屏蔽字符串?