您好我正在尝试使用OOP PHP创建搜索功能但是当我运行查询并输入错误数据时,我仍然会得到结果。数据库中没有的结果。
我觉得我的代码中缺少某些东西,
也许我的查询错了我不确定因为我是整个编程方面的新手。
欢迎任何帮助!
的index.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';
}
} }
?>
答案 0 :(得分: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();
有关预准备陈述的更多信息,请参阅the PHP manual。
参数化查询被认为是更安全和更现代的方法,但无论哪种方式都可以正常工作。你必须做一个或另一个;没有它们,只要有人在代码中输入引号,你的程序就会中断,并且可以很容易地用来破解网站。
最后一点:在字符串两端使用%
在SQL中进行通配符搜索非常慢。如果DB很小,你会没事的,但随着它的增长,查询会越来越慢。如果您希望表中有超过几百条记录,则应认真考虑其他搜索方法。 (这里有很多选择,取决于你的需求,所以我现在不再讨论它们,而是做一些研究,看看什么对你最好)。
希望有所帮助。