php搜索引擎关键字不起作用

时间:2014-08-23 04:54:08

标签: php

当我搜索我在数据库中指定的关键字时,它将返回我数据库中的所有内容,而不仅仅是链接附加关键字的相应链接。这是我的代码

        <?php
        $q = $_GET['q'];
        $terms = explode(" ", $q);
        $query = "SELECT * FROM search ";

        foreach ($terms as $each){
            $i=0;
            $i++;
                if ($i == 1)
                    $query .= "keywords LIKE '%$each%' ";
                else
                    $query .= "OR keywords LIKE '%$each%' ";

        }

        //connect
        mysql_connect("localhost", "root", "");
        mysql_select_db("search");

        $query = mysql_query("SELECT * FROM search");
        $numrows = mysql_num_rows($query);
        if ($numrows > 0){      

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

                echo "<h3><a href='$link'>$title</a></h3><h4>$link</h4>$description<br /><br />";
            }
        }
        else
            echo "<b>No Results Found</b><br><br>Suggestions:<br>
                Make sure all words are spelled correctly.<br>
                Try different keywords.<br>
                Try more general keywords.";

        //disconnect
        mysql_close();

    ?>

4 个答案:

答案 0 :(得分:1)

 <?php
    $q = $_GET['q'];
    $terms = explode(" ", $q);

    //connect
    mysql_connect("localhost", "root", "");
    mysql_select_db("search");

    $query = "SELECT * FROM search ";

    $i=1;
    foreach ($terms as $each){
        if ($i == 1) {
            $query .= "WHERE ";
            $query .= "keywords LIKE '" . mysql_real_escape_string("%" . $each . "%") . "' ";
        } else {
            $query .= "OR keywords LIKE '" . mysql_real_escape_string("%" . $each . "%") . "' ";
        }
        $i++;
    }

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

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

            echo "<h3><a href='$link'>$title</a></h3><h4>$link</h4>$description<br /><br />";
        }
    } else {
        echo "<b>No Results Found</b><br><br>Suggestions:<br>
            Make sure all words are spelled correctly.<br>
            Try different keywords.<br>
            Try more general keywords.";
    }
    //disconnect
    mysql_close();

?>

修正:

1)删除了正在定义的第二个$查询。它选择了所有行。

2)移动了初始$ i声明。每个循环都被设置为0。

3)添加WHERE

4)在if语句后移动$ i ++并将初始$ i设置为1。

5)添加了mysql_real_escape_string,以便正确转义数据。

建议:

我强烈建议您查看MySQLi(http://us2.php.net/mysqli)或PDO(http://us3.php.net/pdo

如果有效,或者您需要进一步的帮助,请告知我们。

答案 1 :(得分:0)

第一眼,我看到了几个错误。

 $i=0;
 $i++;
     if ($i == 1)

$ i将永远是一个人。 你可能想要移动$ i = 0;在foreach之前

$query = mysql_query("SELECT * FROM search");

您构建了一个查询,但最终您没有使用它。你可能想这样做:$ query = mysql_query($ query);代替。 (以及使用输出的不同变量名称的代码清晰度?)。

不推荐使用mysql_query。没用你就赶紧行,查看PDO

答案 2 :(得分:0)

首先,您在条件之前错过了WHERE关键字。所以它应该是:

    foreach ($terms as $i => $each){
        $each = mysql_real_escape_string($each); // Prevent SQL injection
        if ($i == 0)
            $query .= "WHERE keywords LIKE '%$each%' ";
        else
            $query .= "OR keywords LIKE '%$each%' ";

    }

您不需要递增自己的计数器变量,您可以使用$terms中的数组索引。

其次,在创建$query的所有工作之后,您还没有使用它。你写道:

    $query = mysql_query("SELECT * FROM search");

应该是:

    $query = mysql_query($query);
顺便说一句,重复使用这样的变量通常是一个坏主意,当你为不同的事情使用相同的变量时会让人感到困惑。我建议你拨打$query之类的第二个$results

答案 3 :(得分:0)

更改此行

$query .= "keywords LIKE '%$each%' ";

通过

$query .= " Where keywords LIKE '%$each%' ";

并且还要改变这一行

$query = mysql_query("SELECT * FROM search");

通过

$query = mysql_query($query);