2009-08-08 3 views
0

私はsomeonesの名前のために検索結果を得ようとしていますが、それぞれのフィールド 'first'と 'last'に対して最初の名前と最後の名前がそれぞれ検索されます。PHPを使ったmysqlの複数のクエリ

しかし、誰かが= $ who = James David Smithのような最初のミドルネームを検索すると、それを分解して最初の列と最後の列に対してそれぞれの名前を検索します。ユーザーが最初に姓の名前を入力するか、中間の名前を追加する。

ここまでは私がこれまで持っていたものですが、私は固執しています。助けて。お願いします。

<? 

$search = explode(' ', $who); 

$limit=verify($get['page'])?" limit ".($get['page']*10).",10":" limit 10"; 

$q="select * from users where (first IN('%$search[]%') or last IN('%$search[]%') or full_name LIKE '%".$get['who']."%') AND (city LIKE '%".$get['where']."%' or province LIKE '%".$get['where']."%') order by province";   

$rows=get_recordset($q); 

if(count($rows)){ 
    foreach($rows as $row){ 

echo $q; 

?> 

答えて

2

私はあなたを得たかわからないが、何を意味している場合:

あなたはその後、3名持っている場合 - すべての3つの分野(最初、最後、フルネーム)に対するすべての名前をチェックします。

あなたはわずか2名、その後持っている - 最後のフィールドに対して最初のフィールドと最後の名に対して

を最初の名前を確認し、これはそれを成し遂げる必要があります。もちろん

 
$search = explode(' ', $who); 
if (count($search) >2) { // in case we do got a middle name - 
    $whereNameStringsArr = array(); 
    foreach ($search as $val) { 
     $whereNameStringsArr[] = " first LIKE '%$val%' 
         OR last LIKE '%$val%' 
         OR full_name LIKE '%$val%' "; 
    } 
    $whereNameClause = implode(" OR ",$whereNameStringsArr); 
} else { // in case we don't got a middle name 
    $whereNameClause = " first LIKE '%{$search[0]}%' 
       OR last LIKE '%{$search[1]}%' "; 
} 
$limit=verify($get['page'])?" limit ".($get['page']*10).",10":" limit 10"; 
$q="select * from users where ($whereNameClause) 
       AND (city LIKE '%".$get['where']."%' or province LIKE '%".$get['where']."%') 
       order by province 
       $limit";   

$rows=get_recordset($q); 
.... 

を - あなたを確認してくださいを検証するすべてユーザーの入力から得たデータ

+0

閉じる。私はあなたがどこへ行くのが好きですが、doesntの仕事が好きです。人名の順序を逆にして、姓を最初に検索する場合。何も返しません。 –

0

なぜファジー検索をしないのですか?あなたがデータを爆発すると、このような何かを:使用して

$name = $_POST['name'] // John Michael Smith 

$first_name = substr($name, 0, strrpos($name, ' ')); //Returns everything before last space, ie John Michael 

$last_name = strstr($name, ' '); //Returns everything after first space, ie John Michael 

あなただけ上記の値は、(検索のサブストリング)が含まれて何を探すためにmysqlのクエリを実行しますが、それを設定LOCATE:

$results = mysql_query("SELECT * FROM names 
       WHERE LOCATE(firstname, '$first_name') > 0 OR 
         LOCATE(lastname, '$last_name') > 0 
       ORDER BY lastname 

私はあなたが結果をどうするかを知っていると仮定します。


クイック更新、あなたは姓姓真ん中に入るのユーザーを心配している場合、またはあなたが、あなたは常に文字列全体に見つけ上記を使用していますが、行う可能性があります。

$results = mysql_query("SELECT * FROM names 
       WHERE LOCATE(firstname, '$name') > 0 OR 
         LOCATE(lastname, '$name') > 0 
       ORDER BY lastname 

これにより、両方の列で文字列のインスタンスがすべてチェックされます。あなたはおそらく(文字列を消毒した後、既に正しく提案されているように)また、誰かが最後に、最初に、または何を持っている場合には、コンマ(ハイフンではない)を削除するべきです。それらをスペースで置き換え、すべてのマルチスペースを1つのスペースに縮小して、確実にダブルスペースにします。


ごめんなさい。名前を(ブランクで)分割する方法は次のとおりです。私のsubstr構文に問題があります:

$name = $_POST['name'] // John Michael Smith 

$first_name = substr($name, 0, strrpos($name, ' ')); //Returns everything before last space, ie John Michael 

$last_name = strstr($name, ' '); //Returns everything after first space, ie John Michael 
+0

行の構文エラー $ first_name = substr(0、strrchr($ name、 "")); //最後のスペースの前のすべてを返します。つまり、John Michaelです。 –

+0

構文解析エラー:予期しない構文エラーT_VARIABLE –

+0

申し訳ありません。ドキュメントの例からコピーして貼り付けるために得たものです。これは最初の名前を取得する方法です。 '$ first_name = substr($ name、0、strrpos($ name、" "));' – Anthony

関連する問題