Предупреждение: попытка доступа к смещению массива по значению типа bool

Форма входа работает нормально, но когда я ввожу неправильное имя пользователя, получаю ошибку

Предупреждение: попытка доступа к смещению массива по значению типа bool

У меня есть форма входа с этим кодом:

<?php
include('class.password.php');

class User extends Password{

    private $db;

    function __construct($db){
        parent::__construct();

        $this->_db = $db;
    }

    public function is_logged_in(){
        if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true){
            return true;
        }
    }

    private function get_user_hash($username){

        try {

            $stmt = $this->_db->prepare('SELECT MemberID, username, password FROM admins WHERE username = :username');
            $stmt->execute(array('username' => $username));

            return $stmt->fetch();

        } catch(PDOException $e) {
            echo '<p class = "error">'.$e->getMessage().'</p>';
        }
    }


    public function login($username,$password){

        $user = $this->get_user_hash($username);

        if ($this->password_verify($password,$user['password']) == 1){

            $_SESSION['loggedin'] = true;
            $_SESSION['memberID'] = $user['memberID'];
            $_SESSION['username'] = $user['username'];
            return true;
        }
    }


    public function logout(){
        session_destroy();
    }

}


?>

Это то, что находится в строке, которая дает ошибку:

if ($this->password_verify($password,$user['password']) == 1){

Возможно, что $stmt->fetch может вернуть false, если строка не найдена.

Nigel Ren 21.12.2020 17:27

Примечание: это плохая практика — иметь функции, которые иногда возвращают значение, а иногда нет. Убедитесь, что вы либо всегда возвращаете значение, либо вообще не возвращаете значение.

El_Vanja 21.12.2020 17:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
8 299
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что метод get_user_hash вернет false, когда такого пользователя с указанным именем пользователя нет. Вам следует подумать об изменении кода на:

if (!empty($user) && $this->password_verify($password,$user['password']) == 1){
$this->password_verify должно быть просто password_verify.
El_Vanja 21.12.2020 17:31

@El_Vanja, именно эта часть кода скопирована из вопроса. И автор сказал, что этот код работает, когда пользователь существует. Я предполагаю, что этот метод унаследован от класса Password. Хорошо это или плохо - это другой вопрос. Но я пытался решить заданный вопрос, а не что-то еще

Urmat Zhenaliev 21.12.2020 17:35

Правда, я пропустил ту часть, что класс расширяет другой.

El_Vanja 21.12.2020 17:36
!empty($user) является избыточным. Можно просто сказать if ($user && $this->password_verify)
Dharman 28.12.2020 17:05

Другие вопросы по теме