Положите что-то в $_SESSION из базы данных

Я пытаюсь добавить несколько вещей в сеанс, когда пользователь входит в систему. Например, user_level или id.

Итак, мой код выглядит так:

 public function userLogin() {
     $success = false;
     try{
        $con = new PDO( DB_HOST, DB_USER, DB_PASS ); 
        $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        $sql = "SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1";

        $stmt = $con->prepare( $sql );
        $stmt->bindValue( "username", $this->username, PDO::PARAM_STR );
        $stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );
        $stmt->execute();

        $valid = $stmt->fetchColumn();
        $_SESSION['username'] = $this->username;
        $_SESSION['id'] = $stmt->fetchColumn(1);

        if( $valid ) {
            $success = true;
        }
        $con = null;
        return $success;
     }catch (PDOException $e) {
         echo $e->getMessage();
         return $success;
     }

Так что, как вы можете видеть, я добавляю имя пользователя и пытаюсь добавить идентификатор. Имя пользователя работает нормально, но как только я беру идентификатор из базы данных, у меня возникают некоторые проблемы. Это не хранится, на самом деле, если я var_dump это говорит bool(false)

Может кто-нибудь сказать мне, что я делаю не так? Или дай мне какой-нибудь совет. Мне также интересно, безопасно ли хранить такие вещи, как уровень пользователя и идентификатор в сеансе, чтобы ограничить доступ к какой-либо части веб-сайта.

1 ответ

Вместо

$_SESSION['id'] = $stmt->fetchColumn(1);

учитывая, что ваш столбец id называется id, используйте

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC)
$_SESSION['id'] = $rows[0]['id'];

Непосредственно из PHP документов:

fetchColumn возвращает один столбец из следующей строки набора результатов или FALSE, если строк больше нет.

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