0

当我打开我的搜索页面时,

(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();



?>
4

2 回答 2

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%' ";
}

在运行它之前和之后检查您的$terms阵列。至少,您必须检查以确保您的 foreach 语句中的元素不为空。explode(" ", $k)$query$each

Explode 可能会将空项目放入您的查询中,因此您有:

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

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

于 2013-09-27T19:01:05.817 回答
0

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

  1. 你有一个安全问题。您应该始终清理您输入查询的输入!看看SQL 注入
  2. mysql_*自 PHP 5.5 起已弃用。改用mysqli_ *

而现在的问题...

你总是添加一个

"keywords LIKE '%%' ";

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

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

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

另外,用一个空字符串作为搜索条件,猜猜你得到了什么:同样的情况......

于 2013-09-27T19:01:55.963 回答