2013-06-01 43 views
0

我有一个用户查询和一个数据库。我的数据库包含表格。我很想知道,是我查询数据库的方法。我在想什么是:PHP在数据库表中查询多个单词

  • 独立查询到由空间
  • 遍历每个单词拆分阵列,做一个LIKE“%{$字}%”或
  • 上面的那个,只是在每次迭代之前,做一个'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++;    
} 

} 

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

+0

哪里是问题吗?你想达到什么目的? – Mifeet

+0

你能否提供''userQuery'不适合你的代码? –

+0

完成。添加问题和查询 – jkushner

回答

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"; 
+0

我不明白我是如何倾向于SQL攻击?我使用mysl_real_escape_string? – jkushner

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 "; 
    } 
} 
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

+0

现在我的问题是我应该使用OR而不是AND。我试图让说从地址。名称和gmail从addresses.domain抢Jonathan并显示结果都有。但是,这可能会遇到一个问题,因为我也想显示OR语句。例如,当搜索查询是Jonathan时,我不想要一个0结果集,因为它会产生所有来自addresses.name的结果,这些结果具有Jonathan – jkushner

相关问题