猿问

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

如果用户在登录页面的密码和登录字段中键入正确的信息,我目前正在编写一个脚本来登录用户。该脚本运行良好,但我实际上并不知道这两行代码的含义以及对整体用户体验的作用。


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


<?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);

他们做什么,为什么?


Cats萌萌
浏览 219回答 3
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'&nbsp;不是您在数据库中检查密码的方式。甲散列密码必须从数据库中检索,然后使用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'])){&nbsp; &nbsp; // write some info into the session&nbsp; &nbsp; header("location: ../staudal/dashboard/index.php");&nbsp; &nbsp; exit;} else {&nbsp; &nbsp; echo "invalid";}在第一行中,我们正在准备 sql 查询,其中问号放在变量应该去的地方(所以它被称为占位符)。在第二行中,我们将实际变量绑定到占位符,因此它将被发送到与查询分离的 mysql 服务器,它们将无法干扰。然后查询被实际执行。然后我们得到了mysqli_result旧 mysql 或新 mysqli 查询的所有用户都熟悉的变量 - 查询返回的实际数据源。然后我们试图获取选定的行。然后我们同时检查两件事,我们的查询是否返回任何行如果是,从表单发送的密码是否与使用 password_verify() 函数存储在数据库中的密码相同其余的与您的代码相同,但有两件事在重定向用户之前,您应该将有关他们的一些信息写入会话,以便在其他页面上识别他们exit在发送 Location 头之后添加是一个很好的做法。希望这些解释对你的老师来说已经足够了说真的,这个问题应该提高人们对 PHP 教育状况的认识。大多数来源,在线和离线,都在教导,就好像它仍然是 PHP3 一样,只有在不推荐使用的功能方面进行了轻微的改头换面。但是这种方法在很多方面都是错误的,但仍然保持不变。

九州编程

首先我想说,请使用准备好的语句。$result&nbsp;=&nbsp;mysqli_query($connection,&nbsp;$query)&nbsp;or&nbsp;die(mysqli_error($connection));该mysqli_query()函数对数据库执行查询,$connection变量打开一个到您已经在db_connect.php 中创建的 MySQL 服务器的新连接,并检查连接是否已建立。如果没有,则die()函数将运行。它用于打印消息并退出当前的 php 脚本。$count&nbsp;=&nbsp;mysqli_num_rows($result);mysqli_num_rows()函数将返回结果集中的行数,您将该数字存储到$count变量中。希望这对你有帮助

叮当猫咪

我是一名初级开发人员,但我希望这个答案会根据您的代码有所帮助:$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));&nbsp;意味着如果mysqli_query没有找到指定的数据库或表,在这种情况下(dataforlogin),它会显示你的db_connect.php中指定的连接错误$count = mysqli_num_rows($result);$count 是一个 php 变量mysqli_num_rows($result);&nbsp;表示 $count 等于在运行 mysqli_query($connection, $query) 时 $result 在表 (dataforlogin) 中找到的行数。注意:请避免使用 --- or die(mysqli_error($connection) 行,因为它可能会阻止页面加载,这不是必需的。
随时随地看视频慕课网APP
我要回答