2012-12-10 50 views
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> 
+0

欢迎来到堆栈溢出! [**请不要在新代码中使用'mysql_ *'函数**](http:// bit。LY/phpmsql)。他们不再被维护[并被正式弃用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果你选择PDO,[这里是一个很好的教程](http://j.mp/PoWehJ)。 –

+0

你能举一个你期望的表格和结果的例子吗?这三个表中的每个用户总是有一行? – Jim

回答

0

试着改变你的MySQL quesry这样:

$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语句。它不会复制你的行。

+0

,给了我这个错误:警告:mysql_fetch_array()期望参数1是资源,在/Applications/XAMPP/xamppfiles/htdocs/PTB1/includes/mod_sidebar/search.php在线34给出的布尔值 –

1

你在做什么是一个交叉连接。在此,配置文件表,统计表和用户表中的所有行都会合并到具有所有各种组合的表中。因此你多次获得同一个用户。

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

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

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

0

假设所有的表都有USER_ID领域,这正是存在在每个表中的一行给定用户,那么你可以使用内部连接的巴拉斯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"]吨找出要得到的结果集。

也不要使用$查询没有正确sanitisng它,甚至更好,使用准备好的语句。由于$查询来自用户,它可能有危险的内容,如:

"'DROP TABLE foo;--"