2014-09-27 42 views
-2

我有一个PHP网站来显示产品。我需要介绍一个'搜索'功能,可以在多个产品中找到关键字或短语。搜索PHP网站与MySQL数据库的脚本

我经历了一些现有的脚本,并写了/修改了一个虽然能够连接到数据库,但不返回任何值。调试模式会发出警告“mysqli_num_rows()期望参数1为mysqli_result,布尔给定”。似乎我没有正确收集查询值。在PHP手册说,mysqli_query()回报失败和成功的SELECT,SHOW FALSE,描述或解释查询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(); 
    } 
+0

更正了@Rasclatt指出的错误代码。 – Manish 2014-09-27 11:35:30

+0

那你有工作吗? – Rasclatt 2014-09-27 16:03:15

+0

不,它没有。如上所述,似乎我无法在'mysqli_query()'函数中正确收集返回对象/值。 – Manish 2014-09-27 16:53:55

回答

0

我想应该是在查询像'%$searchterm%',不'%{searchterm}%'。你是不是在寻找你的榜样您的变量$searchterm

谷歌的显示使用LIMIT,因此它一次只显示一定数量的结果(称为pagination)。

这是测试和工作。你将需要在搜索引擎类中更改1)db连接信息。 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> 
+0

@Rascallat良好的观察。将其更改为“%$ searchterm%”。但没有帮助。查询结构是否正确? – Manish 2014-09-27 07:48:28

+0

看起来正确。它只是说0行返回? – Rasclatt 2014-09-27 07:56:05

+0

不。对于找到的结果数量,它呈现空白。 – Manish 2014-09-27 08:08:21

0

做你的文字搜索,你拥有它,你将需要更改代码'%{searchterm}%''%$searchterm%',因为the brackets aren't needed和你搜索短语“{}搜索关键词。”除此之外,您可能需要查看FULLTEXT search capabilities,因为您正在使用当前方法进行文字搜索。

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