【问题标题】:Make the PHP MySql Search Engine and Pagination work使 PHP MySql 搜索引擎和分页工作
【发布时间】:2019-07-11 18:10:38
【问题描述】:

我不知道如何通过另一个表进行搜索。我该怎么做? 表名是 cmets,我想搜索存储在列名 kom 中的所有帖子

另一件事是我无法让分页开始工作...... 我在 else 语句中开始了分页,因为我只有在获得超过 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> ";
                }
            } 
        }   
    }

    ?>

【问题讨论】:

  • 您遇到的具体问题是什么?是不是脚本太慢了?
  • 分页也想搜索另一个表,现在只能搜索一个表
  • “优化”还有另外一个意思。编辑了您的问题

标签: php mysql search search-engine


【解决方案1】:

您使用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 个结果,并在给出起始参数时计算起始点。

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

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

【讨论】:

  • 不是,但它也有效。现在我搜索一张桌子。我将如何使用列名comments 搜索另一个表?
【解决方案2】:

引人注目的一点是,您显示的代码容易受到SQL injection 的攻击。

去掉strip_tags()(如果是为了安全,在这种情况下就没用了)并对您在搜索查询中使用的每个值执行mysql_real_escape_string(),或者在使用@时检查该值是否实际上是一个数字987654324@列。

另一件事是&lt;font&gt; 标签已经过时了。设置文本样式的最酷的 CSS 方式是拥有一个外部 CSS 样式表,并在其中定义类似

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

然后像这样在 HTML 中使用它:

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

也就是说,这可能属于 CodeReview.SE....

【讨论】:

  • 现已将strip_tags() 更改为mysql_real_escape_string(),感谢您提供的信息!现在我不关心css:P
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多