【问题标题】:PHP/MYSQLI simple search not workingPHP/MYSQLI 简单搜索不起作用
【发布时间】:2018-01-15 14:14:21
【问题描述】:

我是 PHP/MYSQLI 的新手,在创建简单的搜索来搜索我的数据库时遇到了麻烦。我的数据库中的列是:'ID'、'Name'、'Age'。我的数据库名称是“用户”,表名称是“员工”。

代码如下:

<?php require('Connections/Localhost.php'); ?>
<?php
if (isset($_POST['Search'])) {
    $search = $_POST['element'];
    $sql = mysqli_query("SELECT * FROM employees WHERE Name = '$search' ");
    if($sql->num_rows > 0 ) {
        while($rows = $sql->fetch_assoc()) {
            $id = $rows['ID'];
            $name = $rows['Name'];
            $age = $rows['Age'];
            echo "ID: $id <br> Name: $name <br> Age: $age <br>";
        }
    }
    else {
        echo "No Result Found!";
    }
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<form method="post">
<input type="text" name="element" placeholder="Enter A Name"/>
<input type="button" name="Search" value="Search" />
</form>
</body>
</html>

它只是返回一个空白页,没有别的。我希望用户在表单的文本区域中输入一个名称,然后单击“搜索”按钮,数据库中与该名称对应的所有数据都应显示在网页上。请纠正我的错误之处。

【问题讨论】:

  • function mysqli_query 也需要connection参数(程序接口),它在手册中有说明并且至少打开你的错误报告
  • 你的mysqli_query函数有错误,你需要指定两个参数。先尝试调试代码
  • 您需要使用准备好的语句来防止SQL-injections。因为现在您的代码对 SQL 注入开放。
  • @BRoebie 是的,我知道我的代码对 SQL 注入是开放的,但正如我所说,我现在正处于学习过程中,但我会尽快完成。
  • 很好,我会说一步;) 对我来说,无论情况如何,我都想使用准备好的语句,即使它用于 Intranet 应用程序。因为一些同事来找我(顺便说一句,我是这家公司的实习生),他试图说服我我不需要实施这个(这当然是一个巨大的 BS)。因为用户限制。这当然与它无关xD。

标签: php mysql mysqli


【解决方案1】:

您需要将按钮类型更改为submit

您的表单没有发布。

改变

<input type="button" name="Search" value="Search" />

收件人:

<input type="submit" name="Search" value="Search" />

另外,mysqli_query() 需要数据库连接资源。

你只给出了 sql 查询。

$sql = mysqli_query($databaseConnection, "SELECT * FROM employees WHERE Name = '$search' ");

混合 mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ])

Reference

【讨论】:

    【解决方案2】:

    根据 OP 的要求,我将解释 mysqli 中 Prepared 语句的一般概念,如果您觉得我没有详细说明某个主题,请随时编辑。

    1. 您需要做的第一件事是准备查询(准备 query 正在向数据库发送一个空查询)。但不是 定义参数你会打一个问号。

      1. 之后,您需要将参数绑定到问号 按照查询中的确切顺序!您要做的第一件事是定义参数字符串的类型是 s 整数是我和斑点 为B。之后,您需要使用数据定义变量。

        1. 您需要做的第三件事也是最后一件事是执行查询。我总是在 if 语句中使用它,因为它会返回一个 真或假,这样您可以检查查询是否失败并处理错误。在这种情况下,您将不需要 else,因为如果查询返回 false,页面将会死掉。

          /*1.*/
          $stmt = $databaseConnection->prepare("SELECT * FROM `employees` WHERE `name` = ?"); 
          /*2.*/
          $stmt->bind_param("s",$search); 
          /*3.*/
          if(!$stmt->execute())
          {
          die("There went something wrong: " . $stmt->error);
          }
          

    编辑:这里的问题解释了如何防止SQL-injections

    【讨论】:

    • 感谢您的帮助。我已经理解了mysqli中Prepared statement的概念。
    • 没问题的朋友,如果您有任何问题,我很乐意帮助您