我有一个搜索框脚本。它会在用户输入的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>
答案 0 :(得分:1)
您正在做的是交叉加入。在那里,配置文件表,统计表和用户表中的所有行被组合成一个具有所有各种组合的表。因此,您多次获得同一个用户。
您需要的是“内部联接”或表格之间的某些连接,以缩小您的选择范围。
如果您需要“交叉连接”,请使用MAXIM建议的DISTINCT关键字。
答案 1 :(得分: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语句。它不会复制你的行。
答案 2 :(得分: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;--"