CodeIgniter 3登录类抛出array_key_exists()期望参数2为array, null给定


CodeIgniter 3 Login Class Throws array_key_exists() expects parameter 2 to be array, null given

我们的CodeIgniter 3源代码有一个位于应用程序/库中的Auth类,其函数如下:

public function login($attempt) {
    $CI = & get_instance();
    $CI->load->model("users");
    // Store password entry
    $password = $attempt["password"];
    // Get user from database
    $user = $CI->users->get(array("screen_name" => $attempt["screen_name"]));
    if (!array_key_exists("password", $user)) {
        return null;
    }
    // Validate password
    $valid = crypt($password, $user["password"]) == $user["password"];
    if ($valid) {
        // Remove password - user data will be stored in session 
        unset($user["password"]);
        // If no photo uploaded, set default
        if (!isset($user["photo"]) || $user["photo"] == null) {
            $user["photo"] = "http://oururl/ourroute/assets/images/DefaultAvatar.png";
        } else {
            //$user["photo"] = "files/images/" . $user["photo"];
        }
        return $user;
    } else {
        return false;
    }
}

起初,我认为必须将返回值从false更改为null,然而,更改返回值后错误仍然存在。既然null和false返回值都不能缓解这种情况,那么应该采取什么其他方法来补救手头的错误呢?

问题在于这一行返回null,而不是数组

$user = $CI->users->get(array("screen_name" => $attempt["screen_name"]));

在将$user传递给array_key_exists()函数之前,应该验证数据库是否返回了一个有意义的结果。

这段代码将写成如下

if ($user == null || !array_key_exists("password", $user)) {
    return null;
}

这样做,你不会传递一个空值给array_key_exists