0

我有一个我制作的搜索框脚本。它在用户输入的 mysql 数据库中查找具有匹配查询的用户,例如用户名、位置等。

当我将它设置为从我的数据库中的一个表中选择时,该脚本工作正常,即“ptb_profiles”,但是当我尝试添加更多表以供它搜索时,它不喜欢它并多次列出同一个用户。它应该只根据用户键入的搜索查询将每个用户调出一次。

我已经对搜索结果的数量进行了限制,以节省空间并允许用户在单独的窗口中打开更多结果(尽管这些位尚未完成)。为了清楚起见,我不想将搜索限制为一个结果,而是列出 5 个结果,并且每个结果仅显示一次,具体取决于用户是在 ptb_profiles 下搜索 display_name 还是在 ptb_stats 下搜索国籍或在 ptb_users 下搜索电子邮件。

谁能建议我在 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 表中的所有行都被合并到一个包含所有各种组合的表中。因此,您多次获得同一个用户。

您需要的是“内部连接”或表格之间的某种连接来缩小您的选择范围。

如果您确实需要“交叉连接”,请使用 MAXIM 建议的 DISTINCT 关键字。

链接到上述建议:http ://www.tizag.com/mysqlTutorial/mysqljoins.php

于 2012-12-10T20:08:22.943 回答
0

假设所有表都有一个 user_id 字段,并且给定用户的每个表中只有一行,那么您可以按照 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

至于您的第二个问题,您可以执行以下操作:

<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 回答
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 回答