我嘗試使用 Hash,但一直收到此錯誤:
Class "App\Http\Controllers\Hash" not found
我也嘗試過匯入 Hash,但后來又出現了另一個錯誤。
Attempt to read property "password" on null
這是我來自UserController.php檔案的代碼:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;
use App\Models\User;
class UserController extends Controller
{
//
function login(Request $req)
{
$user= User::where(['email'=>$req->email])->first();
if($user || Hash::check($req->password,$user->password))
{
return "Username or password is not matched";
}
else{
$req->session()->put('user',$user);
return redirect('/');
}
}
}
uj5u.com熱心網友回復:
使用 時||,如果第一個運算元的計算結果為真值,則計算是短路的,因為結果總是true與任何運算元一樣快true。
在您的情況下,$user變數可能是null(如果在資料庫中找不到電子郵件)。因為null是一個假值,所以評估繼續到下一個運算元,您嘗試在其中讀取$user->password.
在您的情況下,您只想在$user不為空時評估第二個運算元,因此您應該將您的替換||為&&.
您可以在以下頁面上找到此行為的檔案:https ://www.php.net/manual/en/language.operators.logical.php
if ($user && Hash::check($req->password,$user->password))
// ^^ <--- use "&&" instead of "||"
uj5u.com熱心網友回復:
嘗試除錯$req和$user值。發生這種情況是因為其中一個變數具有空值。因此,當您嘗試獲取密碼屬性時,它將回傳這些錯誤。
function login(Request $req)
{
$user= User::where(['email'=>$req->email])->first();
// Uncomment this following statement to check is those 2 variable has value or not
// dd($req, $user);
if($user || Hash::check($req->password,$user->password))
{
return "Username or password is not matched";
}
else{
$req->session()->put('user',$user);
return redirect('/');
}
}
uj5u.com熱心網友回復:
預期邏輯存在錯誤。它應該是
public function login(Request $request)
{
$user = User::where([
'email' => $request->email
])
->first();
// correct logic would be read as 'if there is no user in database found by provided email
// OR
// if there is that kind of user but provided password is not one stored in database, return error'
if (!$user || !Hash::check($request->password, $user?->password)) {
return "Username or password is not matched";
}
// otherwise do what ever need to be done
$request->session()->put('user', $user);
return redirect('/');
}
如果您不使用 PHP 8,則在嘗試對變數執行方法之前,用檢查物件是否不為空來替換空安全運算子
IE
// instead $user?->password
// it could be
if (!is_null($user)) { /** do something with $user->password */}
但這是次要的事情,最重要的是具有類似于我在代碼中上面放置的正確邏輯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/433755.html
