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

时间:2014-09-27 07:26:57

标签: php mysqli

我有一个PHP网站来展示产品。我需要介绍一下搜索'可以在多个产品中找到关键字或短语的功能。

我浏览了一些现有脚本并为我编写/修改了一个脚本虽然可以连接到数据库但是没有返回任何值。调试模式会发出警告" mysqli_num_rows()期望参数1为mysqli_result,boolean给出"。似乎我没有正确收集查询值。 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();
     }

2 个答案:

答案 0 :(得分:0)

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

Google的显示在查询中使用LIMIT,因此它一次只显示一定数量的结果(称为pagination)。

这是经过测试和运作的。您需要在搜索引擎类中更改1)数据库连接信息。 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>

答案 1 :(得分:0)

要进行文字搜索,您需要将代码'%{searchterm}%'更改为'%$searchterm%',因为the brackets aren't needed并且您正在搜索短语“{ searchterm}。“除此之外,您可能需要查看FULLTEXT search capabilities,因为您正在使用当前方法进行文字搜索。

要使输出看起来像Google的输出,您只需为每个搜索结果编写一个包装器,并使用CSS和HTML设置它们的样式。