首页 > 解决方案 > 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']);
    }
}

?>

提前谢谢各位!

标签: codeigniter-4

解决方案


首先,用户名和电子邮件必须是唯一的。因此,当用户输入电子邮件或用户名时,您可以使用以下代码检查用户是否输入电子邮件

$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 =''

推荐阅读