搜索功能适用于localhost,但不适用于服务器

时间:2011-03-25 16:17:51

标签: php mysql

我正在尝试向我的网站添加搜索功能。现在它非常简陋,搜索只是使用select从MySQL中提取结果。问题是,当我在localhost上测试时,搜索效果很好但是当我把它放在服务器上时根本不起作用。使用它时,它只选择整个数据库。我认为问题是变量没有传递到搜索结果页面,但我不知道。

这是搜索框的代码。它位于名为“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的代码:

var valid=true;

function validate(field, helptext, type, min, max, field1)
{
var x=field.value;
var text=document.getElementById(helptext);
if (x==null || x=="")
{
if (text!=null)
    {
    text.innerHTML="Please input "+field.id;
    }
valid=false;
}
else if (type=="length")
{
valLength(min,max,field,helptext);
}
else if (type=="email")
{
valEmail(field,helptext);
}
else if (type=="pass")
{
valPass(field, field1, helptext);
}
else
{
if (text!=null)
    {
    text.innerHTML="";
    }
valid=true;
}
}

function searchSubmit()
{
validate(search.query);
if (valid==true)
{
search.submit();
}
else
{
alert("Please enter a search term");
}
}

正如我所说,当我在计算机上的本地主机上使用它时,它运行正常,只返回标题与搜索匹配的行。但是,当我把它放在服务器上时,它会返回表中的所有行。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我在代码中看不到会导致这种情况的任何内容。我认为你的分析是正确的;我认为$_GET['query']由于某种原因是空的。

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

我唯一能想到的是确保服务器上存在$_GET;在PHP 4.1.0中它是introduced,现在很久以前了。但是,远程服务器上的PHP可能很古老。

祝你好运!


更新

在进行连接之前,您使用mysql_real_escape_string requires a connection。如果没有,则尝试使用在本地计算机上运行的默认参数,而不是在[可能更安全的]生产服务器上。

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

只需使用不需要连接的mysql_escape_string