codeigniter-4 - Codeigniter 4 允许用户使用用户名或电子邮件登录
问题描述
目前我有一个登录功能,我只设置了用户可以使用用户名登录。如何让用户使用用户名或电子邮件登录并检查我的数据库当用户使用他们的用户名登录时用户名是否存在以及用户使用他们的电子邮件登录时是否存在电子邮件?以下是我当前的代码:
控制器
public function login()
{
$data = [];
helper(['form']);
$validation = \Config\Services::validation();
if($this->request->getMethod() == 'post'){
//validations
$rules = [
'username' => 'required',
'password' => 'required|validateUser[username, password]'
];
$errors = [
'password' => [
'validateUser' => 'Username or Password don\'t match'
]
];
if(!$this->validate($rules, $errors)){
$data['validation'] = $this->validator;
}else{
$model = new AccountModel();
$user = $model->where('username', $this->request->getVar('username'))
->first();
$this->setUserSession($user);
return redirect()->to('/account/profile');
}
}
echo view('templates/header', $data);
echo view('account/login');
echo view('templates/footer');
}
我的验证规则
<?php
namespace App\Validation;
use App\Models\AccountModel;
class UserRules
{
public function validateUser(string $str, string $fields, array $data)
{
$model = new AccountModel();
$user = $model->where('username', $data['username'])
->first();
if(!$user)
return false;
return password_verify($data['password'], $user['password']);
}
}
?>
提前谢谢各位!
解决方案
首先,用户名和电子邮件必须是唯一的。因此,当用户输入电子邮件或用户名时,您可以使用以下代码检查用户是否输入电子邮件
$email = $this->request->getPost('email');
if(substr_count($email , '@') > 0) // this is an email
check for the email if its exists in the database
else // not an email which means it is username
check for the username if its exists in the database
你可以找到这个函数substr_count()
编辑:您可以使用 orWhere 函数,例如
$model->where('username' , $username)->orWhere('email',$email)->find()
所以这将产生这个语句
select * from tablename where username='' or email =''
推荐阅读
- visual-studio - 在 Chrome 中调试 Blazor 应用程序时,会打开新的浏览器窗口并禁用扩展 - 希望在现有窗口中使用扩展的新选项卡
- r - 转换数据以根据唯一标识符将多行合并为一行
- c++ - 随后的 cout 语句更改了我的初始 cout 中的文本
- javascript - 如何从 JavaScript 中的代码中获取鼠标点击事件
- java - 如何将 Gradle 分发插件与 Kotlin 多平台一起使用
- css - 悬停时更改 SVG 填充颜色不起作用
- java - 在 Jakarta EE Batch 失败时恢复数据库更改
- c# - SHA1CryptoServiceProvider 和 SHA256Managed 是否应该返回相同的值
- azure-devops - JMeter - 基于百分位的断言
- azure-web-app-service - Azure 混合连接 | Handle Count 每天都在增加,这导致 Azure App 服务停止