使PHP MySql搜索引擎和分页工作

时间:2012-01-09 23:52:36

标签: php mysql search search-engine

我不知道如何通过另一张表进行搜索。我该怎么做? 表名是注释,我想搜索存储在列名kom

中的所有帖子

另一件事是我不能让分页开始工作...... 我在一个其他的声明中开始了分页,因为当我得到超过1个结果时我只需要它。 我可以显示页面链接并限制显示的搜索帖子,但是当我点击链接中的一个时我无法进入下一页 继承人的代码

<?php 
    $search = $_POST["search"];
    $field = $_POST["field"];

    if($_POST["submit"] && $search)
    {   
        echo "<div id='result'>";
        echo "<h2>Resultat</h2>";
    $search = strtoupper($search);
    $search = strip_tags($search);
    $search = trim($search);

    $query = "SELECT * FROM blogTable WHERE title LIKE '%$search%' 
              UNION 
              SELECT * FROM blogTable WHERE post LIKE '%$search%'";
    $result = mysql_query($query, $conn) or die(mysql_error());

    $matches = mysql_num_rows($result);

    if($matches == 0)
        //code if serch didnt result any results

    else if($matches == 1)
            //code if the matches only 1

    else
    {

        $per_page = 4;
        $pages = ceil($matches / $per_page);
        $page = (isset($_GET['page'])) ? (int)$_GET['page']: 1;
        $start = ($page - 1) * $per_page;
        $query2 = "SELECT * FROM blogTable WHERE title LIKE '%$search%' 
                          UNION 
                          SELECT * FROM blogTable WHERE post LIKE '%$search%' LIMIT $start, $per_page";
        $result2 = mysql_query($query2, $conn) or die(mysql_error());


        echo "<font size='-1'>Sökningen $search gav $matches resultat</font><br/>";
        while ($r2 = mysql_fetch_array($result2))
        {
            $id = $r["id"]; 
            $title = $r["title"]; 
            $post = $r["post"]; 
            $time = $r["time"];

            echo "<br/><strong><a href='comment.php?id=$id'>$title</a></strong><br/>";
            echo "<font size='-1'>".substr($post, 0, 60)."</font><br/>";
            echo "<font size='-1'>".substr($post, 60, 70)."</font><br/>";
            echo "<font size='-3'>$time</font><br/>";   
        }

            //theese are showin but cannot click of any of them
                if($pages >= 1 && $page <= $pages)
            {
                for($nr = 1; $nr <= $pages; $nr++)
                {
                    if($nr == $page)
                        echo "<a href='?page=".$nr."' style='font-size:20px;'>$nr</a>";
                    else
                        echo "<a href='?page=".$nr."' style='font-size:15px;'>$nr</a> ";
                }
            } 
        }   
    }

    ?>

3 个答案:

答案 0 :(得分:0)

您使用UNION是否有特定原因?

如果没有,您可以更改:

$query = "SELECT * FROM blogTable WHERE title LIKE '%$search%' 
          UNION 
          SELECT * FROM blogTable WHERE post LIKE '%$search%'";

为:

$query = "SELECT * FROM blogTable WHERE (title LIKE '%$search%') OR (post LIKE '%$search%')";

无论如何,我永远不会执行相同的查询两次,如果没有给出启动参数(例如查询字符串中的页码),则只获取前x个结果,并计算启动参数时的起点。 / p>

如果您想要总计,请使用COUNT(*)查询或更改您的查询:

$query = "SELECT SQL_CALC_FOUND_ROWS * FROM blogTable WHERE (title LIKE '%$search%') OR (post LIKE '%$search%')";

答案 1 :(得分:0)

吸引眼球的一点是,您展示的代码容易受到SQL injection的攻击。<​​/ p>

摆脱strip_tags()(如果是为了安全,在这种情况下它是无用的)并对搜索查询中使用的每个值执行mysql_real_escape_string(),或检查该值是否实际为使用int列时的号码。

另一件事是<font>标签已经过时了。样式文本的酷CSS方式是使用外部CSS样式表,并在其中定义类似

的内容
span.small { font-size: 12px; color: green }

然后在HTML中使用它:

<span class="small">Text goes here</span>

说,这可能属于CodeReview.SE ....

答案 2 :(得分:0)

抱歉我的英语...... 首先,我总是建议使用GET方法而不是POST方法进行搜索和过滤,接下来,也许这个pagination php类可以帮助你。

问候。