打开页面时,PHP搜索显示整个数据库表

时间:2013-09-27 18:50:25

标签: php mysql search space

当我打开搜索页面时,

(1)它会立即显示所有结果(我的数据库中的每个条目。)

(2)当使用空输入单击搜索按钮时,它还会显示我的数据库中的每个条目。

我该如何解决这个问题?任何帮助将不胜感激。

<form action="search.php" method="get">


<input type="text" name="k" size="50" value="<?php echo $_GET['k']; ?>"/>

<input type="submit" value="search" />


</form>
<hr color="white">

<?php

$k = $_GET['k'];
$terms = explode(" ", $k);

$query = "SELECT * FROM table WHERE ";

foreach ($terms as $each) {
    $i++;

    if ($i == 1)
        $query .= "keywords LIKE '%$each%' ";
    else
        $query .= "OR keywords LIKE '%$each%' ";
}

//connect
mysql_connect("localhost", "abc", "pass");
mysql_select_db("mydb");


$query = mysql_query($query);
$numrows = mysql_num_rows($query);
if ($numrows > 0) {

    while ($row = mysql_fetch_assoc($query)) {
        $id = $row['id'];
        $title = $row['title'];
        $link = $row['link'];
        $picture = $row['picture'];
        $keywords = $row['keywords'];
        $date = $row['date'];


    echo $row['title'];

    }

}
else
    echo "No results found for \"<b>$k</b>\"";

//disconnect
mysql_close();



?>

2 个答案:

答案 0 :(得分:0)

你的问题最有可能出现在前几行:

$k = $_GET['k'];
$terms = explode(" ", $k);

$query = "SELECT * FROM table WHERE ";

foreach ($terms as $each) {
    $i++;

    if ($i == 1)
        $query .= "keywords LIKE '%$each%' ";
    else
        $query .= "OR keywords LIKE '%$each%' ";
}

在运行$termsexplode(" ", $k)之前检查$query数组。您必须检查以确保至少在foreach语句中$each元素不为空。

爆炸可能会在您的查询中放入空白项目,因此您拥有:

`SELECT * FROM table WHERE keywords LIKE '%%'`

这将使任何其他OR keywords LIKE无用。

答案 1 :(得分:0)

这里有一些强制性的样板回答

  1. 您有安全问题。您应该始终清理放入查询的输入!请查看 SQL Injection
  2. 自li 5.5起,
  3. mysql_ * 已弃用。请改用mysqli_*
  4. 现在问题......

    您总是添加

    "keywords LIKE '%%' ";
    
    查询的

    子句。为什么?第一次调用页面意味着有没有 GET参数名为k。这一行:

    $terms = explode(" ", $k);
    

    返回一个长度为1的数组,其中包含一个空字符串文字...

    此外,在搜索条件为空字符串的情况下,猜猜你得到了什么:相同的情况......