1

タイトルの言い方が思いつかなかったので、申し訳ありませんが、基本的には自分のサイトに検索機能があり、入力したクエリが1番目、2番目、1番目、 2番目、またははそれらのファーストネームとセカンドネーム、ファーストネーム、またはセカンドネームです。(それは私がタイプするのを混乱させました)

コード:

    $query = mysql_real_escape_string(htmlentities(strip_tags(stripslashes(@$_GET['q']))));
    $searchArray = explode(" ", $query);
    $query = trim($query);

if($query == "" || $searchArray == "") {
                    echo("<div id='result'><p>Please enter a search term</p></div>");
                }
                if (!isset($query) || !isset($searchArray)){
                    echo("<div id='result'><p>Please enter a search term</p></div>");
                }
                if (count($searchArray) > 1) {
                    $sq = mysql_query("
                    SELECT * FROM users WHERE fname LIKE '%{$searchArray[0]}%' 
                    OR fname LIKE '%{$searchArray[1]}%' 
                    OR sname LIKE '%{$searchArray[0]}%' 
                    OR sname LIKE '%{$searchArray[1]}%' 
                    OR fname LIKE '%{$searchArray[0]}%' AND sname LIKE '%{$searchArray[1]}%' 
                    OR fname LIKE '%{$searchArray[1]}%' AND sname LIKE '%{$searchArray[0]}%'
                    OR fname = '%{$searchArray[0]}%' AND sname = '%{$searchArray[1]}%' 
                    OR fname = '%{$searchArray[1]}%' AND sname = '%{$searchArray[0]}%' 
                    ");
                } 

                else{
                    $sql = "SELECT * FROM users WHERE fname AND sname LIKE '%$query%' OR email LIKE '%$query%'";
                }

私のデータベースには、次のユーザーがいます。Declan SmithJosephBrailsfordテストユーザーテストユーザー2

電子メールを検索すると、正しい結果が得られます。Dec、Declan、またはSmithを検索すると、正しい結果が得られます。Test、Test User、またはUserを検索しても、結果が得られません。Joseph、Brailsford、またはJoseph Brailsfordを検索しても、結果は得られません。Declan Smithを検索すると、結果としてJosephBrailsfordが表示されます。

明らかに、それはまったく正しくないので、誰かが私が間違ったことを教えてもらえますか?:/

4

2 に答える 2

2
$sql = "SELECT * FROM users WHERE fname AND sname LIKE '%$query%' OR email LIKE '%$query%'";

する必要があります

$sql = "SELECT * FROM users
        WHERE 
             fname LIKE '%$query%' OR
             sname LIKE '%$query%' OR 
             email LIKE '%$query%'";

また

$sql = "SELECT * FROM users WHERE CONCAT(fname, ', ', sname, ', ', email) LIKE '%$query%'";

これらのOR条件を記述する必要がないように...

また、最初のクエリは

SELECT * FROM users
WHERE concat(fname, ', ', sname) LIKE '%{$searchArray[0]}%' 
OR concat(fname, ', ', sname) LIKE '%{$searchArray[1]}%'

これらの2つのクエリに違いはありますか?もお読みください。

于 2012-06-28T20:53:19.167 に答える
1

あなたが書いたロジックは正確にはわかりませんが、必要なのはこれらだけだと思います。

SELECT * FROM users
  WHERE fname LIKE '%{$searchArray[0]}%' 
     OR fname LIKE '%{$searchArray[1]}%' 
     OR sname LIKE '%{$searchArray[0]}%' 
     OR sname LIKE '%{$searchArray[1]}%' 

そのWHERE句の他のすべての部分は冗長に見えます。しかし、本当に必要な場合は、かっこが必要だと思います。それ以外の場合、「AND」はそれが機能するという希望を壊します。

SELECT * FROM users 
  WHERE fname LIKE '%{$searchArray[0]}%' 
     OR fname LIKE '%{$searchArray[1]}%' 
     OR sname LIKE '%{$searchArray[0]}%' 
     OR sname LIKE '%{$searchArray[1]}%' 
     OR (fname LIKE '%{$searchArray[0]}%' AND sname LIKE '%{$searchArray[1]}%')
     OR (fname LIKE '%{$searchArray[1]}%' AND sname LIKE '%{$searchArray[0]}%')
     OR (fname = '%{$searchArray[0]}%' AND sname = '%{$searchArray[1]}%')
     OR (fname = '%{$searchArray[1]}%' AND sname = '%{$searchArray[0]}%')

そして、これらの最後の2行...なぜ%が等しいテストなのですか?確かにあなたはそれらを必要としません。

于 2012-06-28T20:52:59.423 に答える