使用MySQL数据库搜索PHP网站的脚本


Search Script for PHP website with MySQL Database

我有一个PHP网站来展示产品。我需要介绍一个"搜索"功能,通过该功能可以在许多产品中找到关键词或短语。

我浏览了许多现有的脚本,并为我编写/修改了一个脚本,虽然它能够连接到数据库,但不会返回任何值。调试模式抛出警告"mysqli_num_rows()期望参数1为mysqli_result,给定布尔值"。似乎我没有正确收集查询值。PHP手册规定,mysqli_query()在失败时返回FALSE,对于成功的SELECT、SHOW、DESCRIBE或EXPLAIN查询,mysqli_query()将返回mysqli_result对象,对于其他成功的查询,mysqli_query()将返回TRUE"。

有什么建议吗?

<form name="search" method="post" action="search.php">
        <input type="text" name="searchterm" />
        <input type="hidden" name="searching" value="yes" />
        <input type="submit" name="submit" value="Search" />
    </form>
    <?php 
     $searchterm=trim($_POST['searchterm']);
     $searching = $_POST['searching'];
     $search = $_POST['search'];
     //This is only displayed if they have submitted the form 
     if ($searching =="yes") 
     {
        echo 'Results'; 
         //If they forget to enter a search term display an error 
         if (!$searchterm) 
         { 
            echo 'You forgot to enter a search term'; 
            exit; 
         } 
         //Filter the user input
         if (!get_magic_quotes_gpc())
            $searchterm = addslashes($searchterm);
         // Now connect to Database 
         @ $db = mysqli_connect('localhost','username','password','database' );
         if (mysqli_connect_errno()) {
            echo 'Error: Could not connect to the database. Please try again later.';
            exit;
         }
         else {
             echo "Database connection successful."; //Check to see whether we have connected to database at all!
         }
         //Query the database
         $query = "SELECT * FROM wp_posts WHERE post_title LIKE '%$searchterm%' OR post_excerpt LIKE '%$searchterm%' OR post_content LIKE '%$searchterm%'";
         $result = mysqli_query($db, $query);
         if (!$result)
            echo "No result found";
         $num_results = mysqli_num_rows($result);
         echo "<p>Number of match found: ".$num_results."</p>";
        foreach ($result as $searchResult) {
            print_r($searchResult);
        }
        echo "You searched for $searchterm";
        $result->free();
        $db->close();
     }

要按现有方式进行文字搜索,您需要将代码'%{searchterm}%'更改为'%$searchterm%',因为不需要方括号,而且您正在搜索短语"{searchterm}"。除此之外,您可能还需要了解FULLTEXT搜索功能,因为您正在使用当前方法进行文字搜索。

为了使输出看起来像谷歌的输出,您只需为每个搜索结果编写一个包装器,并使用CSS和HTML对其进行样式设置。

我认为它应该类似于查询中的'%$searchterm%',而不是'%{searchterm}%'。您在示例中没有搜索变量$searchterm

谷歌的显示在查询中使用LIMIT,因此一次只显示一定数量的结果(称为分页)。

这是经过测试和工作的。您需要更改搜索引擎类中的数据库连接信息。2) 如果你想把它放在不同的页面上,你就必须把它分开。如果没有,请将整个代码复制到一个页面上,它将在该页面上工作。

<?php
    class DBEngine
        {
            protected   $con;
            // Create a default database element
            public  function __construct($host = '',$db = '',$user = '',$pass = '')
                {
                    try {
                            $this->con  =   new PDO("mysql:host=$host;dbname=$db",$user,$pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
                        }
                    catch (Exception $e) {
                          return 0;
                        }
                }
            // Simple fetch and return method
            public  function Fetch($_sql)
                {
                    $query  =   $this->con->prepare($_sql);
                    $query->execute();
                    if($query->rowCount() > 0) {
                            $rows   =   $query->fetchAll();
                        }
                    return (isset($rows) && $rows !== 0 && !empty($rows))? $rows: 0;
                }
            // Simple write to db method
            public  function Write($_sql)
                {
                    $query  =   $this->con->prepare($_sql);
                    $query->execute();
                }
        }
    class   SearchEngine
        {
            protected   $searchterm;
            public  function execute($searchword)
                {
                    $this->searchterm   =   htmlentities(trim($searchword), ENT_QUOTES);
                }
            public  function display()
                { ?>
                    <h1>Results</h1>
                <?php 
                    //If they forget to enter a search term display an error 
                    if(empty($this->searchterm)) { ?>
                    <h3>Search Empty</h3>
                    <p>You must fill out search field.</p>
                    <?php }
                    else {
                            $con        =    new DBEngine('localhost','database','username','password');
                            $results    =   $con->Fetch( "SELECT * FROM wp_posts WHERE post_title LIKE '%".$this->searchterm."%' OR post_excerpt LIKE '%".$this->searchterm."%' OR post_content LIKE '%".$this->searchterm."%'");
                            if($results !== 0 && !empty($results)) { ?>
                                    <p>Number of match found: <?php echo count($results); ?> on search:<br />
                                    <?php echo strip_tags(html_entity_decode($this->searchterm)); ?></p>
                                    <?php
                                    foreach($results as $rows) {
                                            echo '<pre>';
                                            print_r($rows);
                                            echo '</pre>';
                                        }
                                }
                            else { ?>
                                    <h3>No results found.</h3>
                                    <?php
                                }
                        }
                }
        }
    if(isset($_POST['submit'])) {
            $searcher   =   new SearchEngine();
            $searcher->execute($_POST['searchterm']);
            $searcher->display();
        } ?>
    <form name="search" method="post" action="">
        <input type="text" name="searchterm" />
        <input type="hidden" name="searching" value="yes" />
        <input type="submit" name="submit" value="Search" />
    </form>