这两行PHP代码的含义是什么?

Clo*_*ses 1 php mysql sql database mysqli

如果用户在登录页面的“密码”和“登录”字段中输入正确的信息,我目前正在编写脚本来登录用户。脚本工作得很好,但是我实际上不知道这两行代码对整体用户体验意味着什么和做了什么。

我即将参加考试,我必须解释代码的含义,如果你们通过解释下面两行代码的作用来帮助我,那将是绝对令人惊讶的。这是完整的脚本:

<?php  

require('db_connect.php');

if (isset($_POST['user_id']) and isset($_POST['user_pass'])) {

    $username = $_POST['user_id'];
    $password = $_POST['user_pass'];

    $query = "SELECT * FROM dataforlogin WHERE username='$username' and password='$password'";

    $result = mysqli_query($connection, $query) or die(mysqli_error($connection));
    $count = mysqli_num_rows($result);

    if ($count == 1) {

        header("location: ../staudal/dashboard/index.php");

    } else {

        echo "Fail";

  }
}

?>
Run Code Online (Sandbox Code Playgroud)

我难以理解的两行代码是:

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));
$count = mysqli_num_rows($result);
Run Code Online (Sandbox Code Playgroud)

他们做什么,为什么?

You*_*nse 21

这是一个很好的问题,因为根据现代安全性和应用程序设计标准,这些行大多是错误的或无用的。在两行代码中可能出现如此多的错误之前,我从未想到过。

这应该是这样

$stmt = $mysqli->prepare("SELECT * FROM dataforlogin WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result= $stmt->get_result()
$user = $result->fetch_assoc();

if ($user && password_verify($password, $user['password']))
{
    // write some info into the session
    header("location: ../staudal/dashboard/index.php");
    exit;
} else {
    echo "invalid";
}
Run Code Online (Sandbox Code Playgroud)
  • 在第一行中,我们正在准备带有问号的sql查询,该问号放置在变量应到达的位置(因此称为占位符)。
  • 在第二行中,我们将实际变量绑定到占位符,因此它将被发送到与查询分离的mysql服务器,并且它们将无法干预。
  • 然后查询将被实际执行。
  • 那么我们得到的mysqli_result变量,对于旧mysql或新mysqli查询的所有用户都是熟悉的-查询返回的实际数据源。
  • 那么我们正在尝试获取选定的行。
  • 然后我们同时检查两件事,
    • 我们的查询是否返回任何行
    • 如果是,则从表单发送的密码是否与使用password_verify()函数存储在数据库中的密码相同
  • 其余与代码中相同,除了两点
    • 在重定向用户之前,您应该在会话中写入一些有关他们的信息,以便在其他页面上识别他们
    • 最好exit在发送Location标头后添加。

希望这些解释对您的老师足够

认真地讲,这个问题应该提高人们对PHP教育状况的认识。无论是在线还是离线,大多数资源都在教授PHP3,但对于不推荐使用的功能仅作了一些小改动。但是这种方法在很多方面都是错误的,但仍保持不变。