为什么我的php搜索表单会返回数据库中的所有内容?
我正在为游戏编写一个数据库搜索函数。我来自Python背景,所以PHP对我来说是非常新的,但我精通HTML/CSS,所以我认为是时候编写一些PHP了。无论如何,我的代码应该在数据库中查询游戏名称或基于搜索查询的系统。我用我喜欢的方式来完成这件事为什么我的php搜索表单会返回数据库中的所有内容?,php,html,mysql,sql,search,Php,Html,Mysql,Sql,Search,我正在为游戏编写一个数据库搜索函数。我来自Python背景,所以PHP对我来说是非常新的,但我精通HTML/CSS,所以我认为是时候编写一些PHP了。无论如何,我的代码应该在数据库中查询游戏名称或基于搜索查询的系统。我用我喜欢的方式来完成这件事 <?php if(isset($_POST['submit'])){ if(isset($_GET['go'])){ if(preg_match("^/[A-Za-z]+/^", $_POST['query'])){
<?php
if(isset($_POST['submit'])){
if(isset($_GET['go'])){
if(preg_match("^/[A-Za-z]+/^", $_POST['query'])){
$query=$_POST['query'];
}
}
$db=mysql_connect ("localhost", "********", "*****") or die ('I cannot connect to the database because: ' . mysql_error());
$mydb=mysql_select_db("*******");
$sql="SELECT ID, Name, System FROM Games WHERE Name LIKE '%" . $query . "%' OR System LIKE '%" . $query ."%'";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
$Name=$row['Name'];
$System=$row['System'];
$ID=$row['ID'];
echo "<ul>\n";
echo "<li>" . "<a href=\"search.php?id=$ID\">" .$Name . " " . $System . "</a></li>\n";
echo "</ul>";
}
}
else{
echo "<p>Please enter a search query</p>";
}
?>
这里是我的非常简单的HTML
<!DOCTYPE html>
<HTML>
<head>
<link rel="stylesheet" type="text/css" href="assets/style.css">
</head>
<body>
<h1>Search for Games</h1>
<p>You can search by genre, name, or just browse.</p>
<form method="post" action="search.php?go" id="searchform">
<input type="text" name="query">
<input type="submit" name="submit" value="Search">
</form>
</body>
</HTML>
搜索游戏
您可以按流派、名称进行搜索,也可以只是浏览
最后,这里是我运行它的网站,这样你就可以看到它做了什么/返回了什么。[由于存在漏洞,已删除网站]
现在只有3个数据库条目,无论我输入“starfox”还是“zelda”,我都会将所有3个条目返回给我。我做错了什么
编辑:我用mysqli清理了我的代码,这更完整吗?它的工作原理与我所希望的一样,但是它在SQL注入中安全吗
<?php
if(isset($_POST['submit'])){
if(isset($_GET['go'])){
$query=$_POST['query'];
}
$db=new mysqli ("localhost", "****", "*****", "******") or die ('I cannot connect to the database because: ' . mysql_error());
$sql="SELECT ID, Name, System FROM Games WHERE Name LIKE '%" . $query . "%' OR System LIKE '%" . $query ."%'";
$result = $db->query($sql);
while($row=$result->fetch_assoc()){
$Name=$row['Name'];
$System=$row['System'];
$ID=$row['ID'];
echo "<ul>\n";
echo "<li>" . "<a href=\"search.php?id=$ID\">" .$Name . " " . $System . "</a></li>\n";
echo "</ul>";
}
}
else{
echo "<p>Please enter a search query</p>";
}
?>
$query未定义(或为空),因此除非代码:
if(preg_match("^/[A-Za-z]+/^", $_POST['query'])){
$query=$_POST['query'];
}
返回true,因此您的db查询几乎可以确定
SELECT ID, Name, System FROM Games WHERE Name LIKE '%%' OR System LIKE '%%'
如果您选择显示所有错误,您将收到警告
另外,您的代码非常危险,因为查询可能导致注入
编辑您的表单是一个$\u POST,您正在尝试$\u获取值。您的正则表达式匹配任何包含斜杠、后跟一个或多个字母、后跟另一个斜杠的字符串。您键入的搜索词根本不包含任何斜杠字符,因此
$query
将始终是一个空字符串,它将匹配所有内容
您可能想:
- 使用
作为分隔符,而不是/
(这是传统的)^
- 使用
^
- 使用
$
if(preg_match("^/[A-Za-z]+/^", $_POST['query'])){
应该是
if(preg_match("/^[A-Za-z]+$/", $_POST['query'])){
祝你好运 危险:您正在使用并且应该使用。您还容易受到现代API的影响,因为它会使您更容易使用。您的查询在数据库CLI或IDE中是否作为独立查询工作?使用mysqli函数而不是mysql函数。啊,我不知道我使用的是过时的东西!我会调查mysqli并修复它。谢谢。:)我们知道正则表达式不会返回true,因为问题包含示例输入。代码试图从
$\u get
读取的唯一值将在$\u get
中(我们可以在HTML源代码中看到)。嗯,我遵循的教程说正则表达式是为了防止SQL注入。但我想我无论如何都应该使用MySQLi。所以我要改变所有这些,去掉正则表达式。谢谢。preg_match不返回布尔值,而是返回位置。您应该检查preg_match!==false,(注意!==)我编辑了我的代码并发布了它,这更正确吗?@Vales从纯技术的角度来看,这是正确的,应该可以工作。但您仍然可以接受注射…是的,我在调试期间添加了定界,因为教程按您的方式进行了。@Vales您的定界是正确的,确实您需要一个定界,尽管我不建议为此使用^
,尽管在这个答案中,他删除了结束定界,这将导致它无法编译或失败。对不起。我修好了。我已经切换了/
和^
。
if(preg_match("/^[A-Za-z]+$/", $_POST['query'])){