为什么我的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'])){

我正在为游戏编写一个数据库搜索函数。我来自Python背景,所以PHP对我来说是非常新的,但我精通HTML/CSS,所以我认为是时候编写一些PHP了。无论如何,我的代码应该在数据库中查询游戏名称或基于搜索查询的系统。我用我喜欢的方式来完成这件事

<?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'])){