0

作成した検索ボックス スクリプトがあります。ユーザーが入力したmysqlデータベースで、ユーザー名、場所などの一致するクエリを持つユーザーを探します。

データベース内の1つのテーブル、つまり「ptb_profiles」から選択するように設定すると、スクリプトは正常に機能しますが、検索するテーブルを追加しようとすると、スクリプトが気に入らず、同じユーザーが数回リストされます。ユーザーが入力した検索クエリに従って、各ユーザーを一度だけ表示する必要があります。

スペースを節約し、ユーザーが別のウィンドウでより多くの結果を開くことができるように、検索結果の数には既に制限があります (まだ少しは行われていません)。明確にするために、検索を 1 つの結果に制限するのではなく、5 つの結果をリストし、ユーザーが ptb_profiles で display_name を検索するか、ptb_stats で国籍を検索するか、ptb_users で電子メールを検索するかに応じて、各結果を 1 回だけ表示するようにします。

where句のどこが間違っているのか、誰かにアドバイスしてもらえますか? ありがとう。

<form method="get" action="">
<input type="text" name="query" class="search" placeholder="Search Name/Location" style="width:120px;"/>
<input type="image" src="../PTB1/assets/img/icons/loginarrow1.png" class="searchbutton" name="submit" value="Start Search" />
</form>

<?php
//PHP CODE STARTS HERE

if(isset($_GET['submit'])){

// Change the fields below as per the requirements
$db_host="localhost";
$db_username="root";
$db_password="";
$db_name="playtime";
$db_tb_atr_name="display_name";

//Now we are going to write a script that will do search task
// leave the below fields as it is except while loop, which will display results on screen

mysql_connect("$db_host","$db_username","$db_password");
mysql_select_db("$db_name");

$query=mysql_real_escape_string($_GET['query']);

$query_for_result=mysql_query("SELECT *
                        FROM ptb_profiles p, ptb_stats s, ptb_users u
                        WHERE p.display_name like '%".$query."%' 
        OR p.location LIKE '%".$query."%' OR p.hobbies LIKE '%".$query."%' OR s.nationality LIKE '%".$query."%'
        LIMIT 5");
echo "<div class=\"search-results\">";
while($data_fetch=mysql_fetch_array($query_for_result))
{

    echo "<div class=\"spacing\"><a href=\"profile.php?id={$data_fetch['user_id']}\" class=\"search\">";
    echo "<img width=40px height= 40px src=\"data/photos/{$data_fetch['user_id']}/_default.jpg\" class=\"boxgridsearch\"/> "; 
     echo substr($data_fetch[$db_tb_atr_name], 0,160);
    echo "</a></div>";

}
echo "<div class=\"morebutton-search\"><a href=\"echo '%".$query."%'\">+ view more results</a></div>";




mysql_close();
}

?>

ps ハイパーリンクを作成して、現在の検索クエリを新しいウィンドウに一覧表示する新しいページにユーザーを誘導する方法を誰かが知っている場合、明らかに今回は 5 つ以上を表示し、その検索のすべての結果を表示します。

私はこれを試しましたが、機能していないため、おそらく完全に間違っています:

echo "<div class=\"morebutton-search\"><a href=\"echo '%".$query."%'\">+ view more results</a>
4

3 に答える 3

1

あなたがしているのはクロスジョインです。その中で、profilesテーブル、statsテーブル、およびusersテーブルのすべての行が、さまざまな組み合わせすべてで1つのテーブルに結合されます。したがって、同じユーザーを複数回取得しています。

必要なのは、選択を絞り込むための「内部結合」またはテーブル間の接続です。

「クロスジョイン」が必要な場合は、MAXIMが提案するDISTINCTキーワードを使用してください。

上記の提案へのリンク:http ://www.tizag.com/mysqlTutorial/mysqljoins.php

于 2012-12-10T20:08:22.943 に答える
0

mySQL クエリを次のように変更してみてください。

$query_for_result=mysql_query("SELECT DISTINCT *
                    FROM ptb_profiles p, ptb_stats s, ptb_users u
                    WHERE p.display_name like '%".$query."%' 
    OR p.location LIKE '%".$query."%' OR p.hobbies LIKE '%".$query."%' OR s.nationality LIKE '%".$query."%'
    LIMIT 5");

DISTINCT ステートメントに注意してください。行が複製されることはありません。

于 2012-12-10T19:52:56.943 に答える
0

すべてのテーブルに user_id フィールドがあり、各テーブルに特定のユーザーの行が 1 つだけあると仮定すると、Bharath Parlapalli が提案するように内部結合を使用できます。

SELECT *
FROM ptb_profiles p
INNER JOIN ptb_stats s ON (p.user_id = s.user_id)
INNER JOIN ptb_users u ON (u.user_id = s.user_id)
WHERE p.display_name like 'foo' 
    OR p.location LIKE 'foo' 
    OR p.hobbies LIKE 'foo' 
    OR s.nationality LIKE 'foo'
LIMIT 5

2番目の質問に関しては、次のようなことができます:

<div class=\"morebutton-search\"><a href="mypage.php?query=<?php echo $query;?>&start=x">+ view more results</a>

次に$_GET["start"]、取得する結果のセットを見つけるために使用します。

また、適切にサニタイズせずに $query を使用しないでください。さらに良いのは、準備されたステートメントを使用することです。$query はユーザーからのものであるため、次のような危険なコンテンツが含まれる可能性があります。

"'DROP TABLE foo;--"
于 2012-12-10T22:47:33.580 に答える