2011-03-25 95 views
0

我想向我的网站添加搜索功能。现在它非常简单,搜索只是使用select从MySQL中获取结果。问题是,当我在本地主机上测试它时,搜索功能非常好,但当我将它放到服务器上时,搜索功能根本无法工作。当它被使用时,它只是选择整个数据库。我相信问题是变量没有传递到搜索结果页面,但我不知道。搜索功能适用于本地主机,但不适用于服务器

下面是搜索框的代码。这是所谓的“header.php中”引用的文件:

<html> 
<head> 

<body> 
<div class="title"><img style="width:100%;" src="title.gif" /></div> 
<div class="search">Search: 
<form style="display:inline" name="search" action="search.php" method="get"><?php echo"   <input type='text' name='query' />";?> 
<a href="javascript: searchSubmit()"><img src="seo.png" alt="Search" title="Search" /> </a></form></div> 
<ul class="menu"> 
<li><a href="index.php#home">home</a></li> 
<li><a href="submit.php?title=&desc=">post an idea</a></li> 
<li><a href="#about">about us</a></li> 
<li><a href="#contact">contact us</a></li> 
<li><a href="login.php">log in</a></li> 
</ul> 

</body> 
</html> 

,这里是从的search.php代码:

<?php 
$search=$_GET['query']; 
$search=mysql_real_escape_string($search); 
?> 
<html> 
<head> 
<?php 
echo "<title>Search: $search</title>"; 
?> 
<link rel="stylesheet" type="text/css" href="mainstyle.css" /> 
<script type="text/javascript" src="validate.js"></script> 
</head> 
<body> 
<div class="title"><img style="width:100%;" src="title.gif" /></div> 
<div class="search">Search: 
<form style="display:inline" name="search" action="search.php" method="get"><?php echo" <input type='text' name='query' value='$search'/>";?> 
<a href="javascript: searchSubmit()"><img src="seo.png" alt="Search" title="Search" /></a></form></div> 
<ul class="menu"> 
<li><a href="index.php#home">home</a></li> 
<li><a href="submit.php?title=&desc=">post an idea</a></li> 
<li><a href="#about">about us</a></li> 
<li><a href="#contact">contact us</a></li> 
<li><a href="login.php">log in</a></li> 
</ul> 
<?php 

mysql_connect("localhost","root","root") or die(mysql_error()); 
mysql_select_db("date_ideas") or die(mysql_error()); 

$result=mysql_query("SELECT * FROM ideas WHERE title LIKE '%".$search."%' ORDER BY post_date DESC"); 
echo "SELECT * FROM ideas WHERE title LIKE '%".$search."%' ORDER BY post_date DESC"; 

echo "<span id='none'>"; 
while($row = mysql_fetch_array($result)) 
{ 
$id=$row['id']; 
echo "<h2 class='center'><a href='ideaview.php?id=$id' title='View ".$row['title']."  Description'>" . $row['title'] . "</a><br/>"; 
echo "<span class='date'>"; 
$date=$row['post_date']; 
$time=time(); 

if (($time-$date)<120) 
{ 
echo "Posted 1 minute ago"; 
} 

else if (($time-$date)>120&&($time-$date)<3600) 
{ 
$minutes=($time-$date)/60; 
echo ("Posted " . round($minutes) . " minutes ago"); 
} 
else if (($time-$date)>3600&&($time-$date)<7200) 
{ 
echo "Posted 1 hour ago"; 
} 
else if (($time-$date)<86400&&($time-$date)>7200) 
{ 
$hours=($time-$date)/3600; 
echo ("Posted " . round($hours) . " hours ago"); 
} 
else if (($time-$date)<172800&&($time-$date)>86400) 
{ 
echo "Posted 1 day ago"; 
} 
else 
{ 
echo ("Posted on " . date("m-d-y",$date)); 
} 
echo "</span></h2>"; 
} 
echo "</span>"; 
?> 

<script type="text/javascript"> 
document.getElementById("none"); 
if (none.innerHTML == "") 
{ 
none.innerHTML="<p class='center'>There are no ideas matching your search</p>"; 
} 
</script> 
</body> 
</html> 

最后,下面是用于提交表单的JavaScript代码:正如我所说的,当我在我的电脑上使用它在本地主机上时,它完美地工作,只返回标题匹配搜索的行。但是,当我将它放在服务器上时,它将返回表中的所有行。

+0

请提供完整的和格式化的代码 – strauberry 2011-03-25 16:20:04

+0

您不给'searchSubmit()'的正文,这是很重要的。 – Jon 2011-03-25 16:23:24

+0

好的,对不起,我是新手,我认为较少的代码会更容易阅读。我会发布完整的代码。 – FrizbeeFanatic14 2011-03-25 16:28:47

回答

0

我看不到中给出的任何代码,将导致此。我认为你的分析是正确的;我想像$_GET['query']由于某种原因是空的。

通过对此进行明确检查,可以使代码更健壮一些:您希望这是一个错误情况,而不是“返回所有”情况。但除了确认你的理论之外,这不会彻底解决问题。

我唯一能想到的就是确保$_GET存在于您的服务器上;在PHP 4.1.0中是introduced,现在已经很久以前了。尽管如此,远程服务器上的PHP很可能是古老的。

祝你好运!


更新

您使用mysql_real_escape_string,这requires a connection,你在建立连接之前。如果没有,则尝试使用在本地机器上运行的默认参数,但不会在您的[假定更安全]生产服务器上运行。

这导致转义失败,并且FALSE被写入$query

只需使用mysql_escape_string这不需要连接。

+0

这不可能是问题,因为我在另一个页面上使用$ _GET并且工作正常。 – FrizbeeFanatic14 2011-03-25 16:39:14

+0

此外,我确实在页面中添加了一个错误检查,问题是这个变量是空的。 $ _GET不起作用。 – FrizbeeFanatic14 2011-03-25 16:49:44

+0

@Frizbee:看我的更新。 – 2011-03-25 22:23:14

1

尝试印出查询,看它是否正确注入$搜索值(如果搜索不为空)

echo "SELECT * FROM ideas WHERE title LIKE '%".$search."%' ORDER BY post_date DESC"; 
+0

在localhost:“SELECT * FROM想法WHERE标题LIKE”%苹果%'ORDER BY post_date DESC。'在服务器上:'SELECT * FROM ideas WHERE标题LIKE'%%'ORDER BY post_date DESC。'由于某些原因,它没有正确传递变量。 – FrizbeeFanatic14 2011-03-25 16:27:03

+0

尝试的print_r($ _ GET)看到所传输的数据 – strauberry 2011-03-25 16:42:07

+0

有趣的 - 它仍然会返回数组([查询] =>想法)就像我的本地主机。为什么不把它传递给我想要使用的变量? – FrizbeeFanatic14 2011-03-25 16:55:51

相关问题