0

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

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

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

$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++;               
}

}

我的问题是这个逻辑有什么问题?这似乎是准确的。

4

3 回答 3

0

首先:这将打破一个单词。第二:这是除 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";
于 2013-06-01T19:41:29.083 回答
0

嘿是这样的:

foreach($parts as $key => $part){
  $part=mysql_real_escape_string($part);
  $sql .= sprintf("(
                addresses.name LIKE %s OR
                addresses.localpart LIKE  %s OR
                addresses.domain LIKE %s
            )", $part);

  if ($key!=($cnt-1)) {
    $sql .= " AND ";
  }
}
于 2013-06-01T19:46:54.180 回答
0

很少注意,您在初始化之前使用了 $i 变量。此外,也许这将是使用 REGEXP 的更好方法。就像是:

// $search_terms = '%Jonathan%|%gmail%'
$sql = "addresses.name REGEXP  $search_terms OR addresses.localpart REGEXP  $search_terms    OR addresses.domain REGEXP  $search_terms";

有关REGEXP的更多详细信息

于 2013-06-01T19:47:10.820 回答