Php 从数据库将某些内容放入$\u会话

Php 从数据库将某些内容放入$\u会话,php,session,Php,Session,我试图在用户登录时向会话添加一些内容。例如,用户级别或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

我试图在用户登录时向会话添加一些内容。例如,用户级别或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;
     }
如你所见,我正在添加用户名,并尝试添加id。用户名工作正常,但一旦我从数据库中获取id,我就会遇到一些问题。它没有被存储,实际上,如果我把它转储,它会说
bool(false)

有人能告诉我我做错了什么吗?或者给我一些建议。我还想知道在会话中存储诸如用户级别和id之类的内容是否安全,以限制对网站某些部分的访问。

而不是

$_SESSION['id'] = $stmt->fetchColumn(1);
考虑到您的id列名为id,请使用

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC)
$_SESSION['id'] = $rows[0]['id'];
直接从PHP文档:

fetchColumn从结果集的下一行返回单个列,如果没有更多行,则返回FALSE


$stmt->fetchColumn(1)
可能没有达到您期望的效果是的,我尝试按照本文()进行操作,但可能是错误的尝试$stmt->debugDumpParams()它显示了什么?如果您确实想使用$stmt->fetchColumn(),请确保您知道哪一列是您的id,然后使用它进行“有效”检查。然后使$\u会话['id']=$有效。您的问题是,您要调用fetchColumn()两次,第一次调用会拉入第一行,第二次调用会尝试获取不存在的第二行,因此返回false。但是,使用FETCH_ASSOC允许您确保始终获取id,无论它在哪个列中。我建议用这个。如果你的really@ProgrammerJeff嘿,伙计,谢谢你的回答,它有一些逻辑,我现在明白我做错了什么,不幸的是它没有解决问题。它仍然在$_会话['id']中不显示任何内容,而且我在想如果
$rows[0]['id']
id在这个代码中表示column的名称,如果是,我的column名称是usedID(我更改了它,并且尝试了也没有效果)@MartinFerko是的,你必须用你的列名('usedID')替换'id'。您确定您的查询实际上返回了一行吗?还有为什么要使用限制1?当按用户名搜索时,只应显示一行,除非数据库的设计很奇怪。