0

您好我正在尝试使用 OOP PHP 创建搜索功能,但是当我运行查询并输入错误数据时,我仍然得到结果。不在数据库中的结果。

我觉得我的代码中缺少一些东西,

也许我的查询是错误的我不确定,因为我是整个编程方面的新手。

欢迎任何帮助!

索引.php

  <?php
 include("classes/class.House.inc"); 
 ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <title>UndergradPad</title>
 <link rel="stylesheet" type="text/css" href="css/style.css" />

 </head>
 <body>
 <div id="bodyWrapper">
 <div id"header">
 <img id="banner" alt="UnderGradPad Logo" src="images/banner.png"/>
 </div> <!-- End header -->

 <div id="search">
<h1>Find student accomodation</h1><br/>
<p> Location  </p>
    <form method="post" action="search.php" name="search" id="searchform">
    <input type="text" name="term" id="searchinput"/>
    <input type="submit" name="submit" id="searchsubmit" value=""/>
    </form>
 <div class="help">e.g. 'PO5' or 'Portsmouth'</div>
 </div> <!--End search -->
 </body>
 </html>

类/class.House.inc

  <?php 
     include("connect/class.Database.inc");

    class House extends Database {

     public function search (){

        $query = "SELECT * FROM houses WHERE postcode like '%$term%'";

                $result = $this->mysqli->query($query);

                $num_result = $result->num_rows;    
                if($num_result > 0){
                    while($rows =$result->fetch_assoc()){               
                        $this->data[]=$rows;
                        //print_r($rows);
                    }           
                    return $this->data;
            } 
    } else {
        echo 'No Records Found';    
        }
             } }
 ?>
4

1 回答 1

1

第一点,$term变量没有定义。

你的意思可能是$_POST['term']?这是 PHP 为发布的数据定义的全局变量。

但是,我建议将变量作为函数的参数,因为它可以让您灵活地使用它而无需依赖发布数据。

例如:

function Search($term) {
    // now you can use $term as a local variable within the function.
}

...并在您调用它的代码中,$_POST['term']作为参数传递。使用这样的东西:

$houseobject->Search($_POST['term']);

其次,您需要对您的 SQL 数据进行转义,否则您将面临 SQL 注入的风险。由于您使用 MySQLi 类进行数据库访问,因此这里有两种方法:自己转义变量,或使用参数化查询并让 MySQLi 为您完成工作。

  • 自己逃避:

    $query = "SELECT * FROM houses WHERE postcode like '%".$this->mysqli->real_escape_string($term)."%'";
    $result = $this->mysqli->query($query);
    
  • 参数化查询:

    $query = "SELECT * FROM houses WHERE postcode like ?";  // ? placeholder in query
    $stmt = $this->mysqli->prepare($query);
    $stmt->bind_param("s", "%$term%");       // insert your variable into the placeholder (still need to add % wildcards)
    $stmt->execute();
    

    有关准备好的语句的更多信息,请参阅PHP 手册

参数化查询被认为是更安全和更现代的方法,但无论哪种方式都可以正常工作。但是,您必须做其中之一;没有它们,一旦有人在代码中输入引号,您的程序就会中断,并且很容易被用来入侵网站。

最后一点:在 SQL 中使用%字符串两端的 a 进行通配符搜索非常慢。如果你的数据库很小,你会没事的,但是随着它的增长,查询会越来越慢。如果您希望表中有超过几百条记录,您应该认真考虑替代搜索方法。(这里有很多选项,具体取决于您的需要,所以我现在不会介绍它们,但做一些研究,看看什么最适合您)。

希望有帮助。

于 2012-11-04T14:42:54.527 回答