为了账号安全,请及时绑定邮箱和手机立即绑定

这两行PHP代码是什么意思?

这两行PHP代码是什么意思?

PHP
Cats萌萌 2021-07-06 17:28:05
如果用户在登录页面的密码和登录字段中键入正确的信息,我目前正在编写一个脚本来登录用户。该脚本运行良好,但我实际上并不知道这两行代码的含义以及对整体用户体验的作用。我很快就要参加考试,在那里我必须解释代码的含义,如果你们通过解释下面两行代码的作用来帮助我,那将绝对令人惊讶。这是完整的脚本:<?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";  }}?>我无法理解的两行代码是:$result = mysqli_query($connection, $query) or die(mysqli_error($connection));$count = mysqli_num_rows($result);他们做什么,为什么?
查看完整描述

3 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

这是一个很好的问题,因为根据现代安全和应用程序设计标准,这些行大多是错误的或无用的。我从来没有想过仅仅两行代码就会有这么多错误。

  • mysqli_query()将您的查询发送到 MySQL 服务器。但是,这不是使用 variables运行 mysql 查询的方式。一个事先准备好的声明必须代替。

  • die(mysqli_error($connection))目的是在查询执行失败并显示mysql错误时停止代码执行(特别是or die()做了很多有趣的事情,我有一篇文章解释了这一点。然而,这不是你在PHP中报告mysql错误的方式。单一配置必须使用 option 来代替。这在很多方面都会更好,从编写的代码量到更好的用户体验。

  • mysqli_num_rows($result)告诉您有多少行返回了您的查询。一个本质上没用的函数,你总是可以使用返回的数据代替

  • WHERE username='$username' and password='$password' 不是您在数据库中检查密码的方式。甲散列密码必须从数据库中检索,然后使用password_verify()函数检查

这是应该的样子

$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";

}

  • 在第一行中,我们正在准备 sql 查询,其中问号放在变量应该去的地方(所以它被称为占位符)。

  • 在第二行中,我们将实际变量绑定到占位符,因此它将被发送到与查询分离的 mysql 服务器,它们将无法干扰。

  • 然后查询被实际执行。

  • 然后我们得到了mysqli_result旧 mysql 或新 mysqli 查询的所有用户都熟悉的变量 - 查询返回的实际数据源。

  • 然后我们试图获取选定的行。

  • 然后我们同时检查两件事,

    • 我们的查询是否返回任何行

    • 如果是,从表单发送的密码是否与使用 password_verify() 函数存储在数据库中的密码相同

  • 其余的与您的代码相同,但有两件事

    • 在重定向用户之前,您应该将有关他们的一些信息写入会话,以便在其他页面上识别他们

    • exit在发送 Location 头之后添加是一个很好的做法。

希望这些解释对你的老师来说已经足够了

说真的,这个问题应该提高人们对 PHP 教育状况的认识。大多数来源,在线和离线,都在教导,就好像它仍然是 PHP3 一样,只有在不推荐使用的功能方面进行了轻微的改头换面。但是这种方法在很多方面都是错误的,但仍然保持不变。


查看完整回答
反对 回复 2021-07-16
?
九州编程

TA贡献1785条经验 获得超4个赞

首先我想说,请使用准备好的语句。

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

mysqli_query()函数对数据库执行查询,$connection变量打开一个到您已经在db_connect.php 中创建的 MySQL 服务器的新连接,并检查连接是否已建立。如果没有,则die()函数将运行。它用于打印消息并退出当前的 php 脚本。

$count = mysqli_num_rows($result);

mysqli_num_rows()函数将返回结果集中的行数,您将该数字存储到$count变量中。

希望这对你有帮助


查看完整回答
反对 回复 2021-07-16
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

我是一名初级开发人员,但我希望这个答案会根据您的代码有所帮助:

  1. $result = mysqli_query($connection, $query) 或 die(mysqli_error($connection));

    • $result 是一个 php 变量

    • mysqli_query($connection, $query) 表示 mysqli_query 将使用你的 db_connect.php 中声明的数据库连接数据库来运行查询 [$query = "SELECT * FROM dataforlogin WHERE username='$username' and password='$password' ";]

    • 或死(mysqli_error($connection)); 意味着如果mysqli_query没有找到指定的数据库或表,在这种情况下(dataforlogin),它会显示你的db_connect.php中指定的连接错误

  2. $count = mysqli_num_rows($result);

    • $count 是一个 php 变量

    • mysqli_num_rows($result); 表示 $count 等于在运行 mysqli_query($connection, $query) 时 $result 在表 (dataforlogin) 中找到的行数。

注意:请避免使用 --- or die(mysqli_error($connection) 行,因为它可能会阻止页面加载,这不是必需的。


查看完整回答
反对 回复 2021-07-16
  • 3 回答
  • 0 关注
  • 218 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信