亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這兩行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 關注
  • 246 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號