2015-03-02 64 views
0

我正在从我的数据库中创建对First_name和Last_name的搜索,从而用户输入他想在字段中找到的内容,并且我的php脚本将搜索类似于名称。如何从Mysql中的两列进行精确搜索

,所以我做

$q=addslashes($_REQUEST['q']); 

$q =mysqli_real_escape_string($connection, $q); 

//In order to search word by word i explode the string 
$notre_tableau=explode(',',$q); 

//I count the string in order to search each word 
$compter_tableau=count($notre_tableau); 




$req_search = "SELECT first_name, last_name 

FROM mytable 

WHERE "; 


//Now i read the array and search for each word 
for ($i = 0; $i < $compter_tableau; $i++) 
{ 
$notremotchercher=trim($notre_tableau["$i"]); 


if($i==$compter_tableau) { $liaison="AND"; } else { $liaison=""; } 

if($i!=0) { $debutliaison="AND"; } else { $debutliaison=""; } 

//I search only if the string is not empty 

if($notremotchercher!='') 
{ 
$req_search .= "$debutliaison (first_name LIKE '%$notremotchercher%' OR last_name LIKE '%$notremotchercher%') $liaison"; 
} 


} 

//Now i proceed with my search 
$requete=mysqli_query($connection, "$req_search ORDER BY id DESC LIMIT 20 ") or die(mysqli_error($connection)); 

因此,如果有人的名字都是珍妮弗·简和姓是DOE,例如,如果在珍(仅珍)我输入它的工作原理, 如果我输入的珍妮弗简它的作品, ,如果我输入美国能源部,它也可以。

上面的代码会显示这样的基于詹妮弗

SELECT first_name, last_name FROM mytable WHERE (first_name LIKE '%Jennifer%' OR last_name LIKE '%Jennifer%') 

搜索所以我得到的结果

问题 如果我输入简珍妮弗,它不工作 另外,如果我输入珍妮弗DOE,它不起作用。请知道我无法知道用户在第一个输入内容时如何使它适用于两列?

谢谢

回答

0

首先,有一些东西,你必须在你的代码更正。您的名字和姓氏用空格而不是逗号分隔,所以不是

$notre_tableau=explode(',',$q); 

你还是使用

$notre_tableau=explode(' ',$q); 

这里您的信息是基于空间爆炸。

其次,您正在尝试搜索名和姓。我认为你需要做一个CONCAT的双方列,以便代替仅搜索名字或姓氏,您的请求将搜索夫妇的名字和姓氏或夫妻姓和名

简而言之而不是

$req_search .= "$debutliaison (first_name LIKE '%$notremotchercher%' OR last_name LIKE '%$notremotchercher%') $liaison"; 

你会宁愿把

$ req_search。=“$ debutliaison(CONCAT(first_name的, '',姓氏)LIKE '%$ notremotchercher%' 或CONCAT(姓氏, '',FIRST_NAME )LIKE'%$ notremotchercher%')$ liaison“;

如果您可以更改这两条线,我相信每个带空格的搜索都可以正常工作。无论您搜索简·多伊Jenniffer李四 OR Jenniffer李四,OR 伊简Jenniffer ..它都会给你准确的结果。

我测试过它

+0

哇。如果名字用双倍空格分隔,怎么样? – 2015-03-02 23:32:24

+0

我不确定它会影响代码 – 2015-03-03 01:01:40

1

您可能想分割搜索中的单词。因此,如果搜索词是“李四” ......

<?php 
    $search_phrase = "Jane Doe"; 
    $terms = explode(" ",$search_phrase); 
    $query = "SELECT first_name, last_name from myTable WHERE "; 

    for($i=0;$i<count($terms);$i++){ 
     if($i!=0) 
      $query.=" OR "; 
     $query.=" (first_name LIKE '%".$terms[$i]."%' OR last_name LIKE '%".$terms[$i]."%')"; 
    } 

    echo $query; //Should produce "SELECT first_name, last_name from myTable WHERE (first_name LIKE '%Jane%' OR last_name LIKE '%Jane%') OR (first_name LIKE '%Doe%' OR last_name LIKE '%Doe%')" 


?> 

您可以使用类似上面和泰勒这对你的需求,只喜欢使用术语的第二部分搜索的姓氏等。

1

您爆炸您的搜索字符串:

$searhStr  = 'Jane Jennifer'; 
$searchSplits = array(' ',',','.','-','?','!',"\n"); 
$searchArray = explode($searchSplits,$searhStr); 

,然后你看在阵列中的每个单词:

forach ($searchArray as $searchWord) 
{ 
    $queryParts[] = "first_name LIKE '%{$searchWord}%'"; 
    $queryParts[] = "prenom LIKE '%{$searchWord}%'"; 
} 
$query = 'SELECT first_name, 
       last_name 
      FROM mytable 
      WHERE '.implode(' OR ',$queryParts); 

学习新事物永远不会迟到。看看MySQL的是如何帮助您做搜索:

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

+0

准备好的语句怎么样? – seboettg 2015-03-02 22:35:52

+0

是的,好主意,你可以添加答案。 – 2015-03-02 22:40:06