如何在PDO中使用会话?

时间:2012-06-09 15:44:48

标签: php session login pdo

我仍然在我的代码中重做并删除旧的mysql_ *命令。我试图转移我的会话登录表单旧代码,这是我到目前为止所得到的:

  public function login($user, $password)
  {
    if (!empty($user) && !empty($password))
    {    
      $password = $web->doHash($user, $password); // in this function is (return sha1(strtoupper($user).':'.strtoupper($password))
      $stmt = $db_login->prepare("SELECT * FROM account WHERE username=:user AND pass_hash=:password");
      $stmt->bindValue(':user', $user, PDO::PARAM_STR);
      $stmt->bindValue(':password', $password, PDO::PARAM_STR);
      $stmt->execute();
      $rows = $stmt->rowCount();

      if ($rows > 0)      
      {    
        $results_login = $stmt->fetch(PDO::FETCH_ASSOC);
        $_SESSION['user_name'] = $results_login['username'];
        $_SESSION['user_id'] = $results_login['id'];  
        return true;
      }
      else
      {
        return false;
      }
    }
    else
    {
      return false;
    }
  }

之后,如果用户登录网站,我将使用支票:

  public function isLogged()
  {
    return (!empty($_SESSION['user_id']) && !empty($_SESSION['user_name']));
  }

但似乎 - 此函数返回总是为空,因为PDO中不存在$ _SESSION?当然,在我的网站上以这种形式使用注销:

  public function logout()
  { 
      unset($_SESSION['user_id']);
      unset($_SESSION['user_name']);       
  } 

但我认为PDO有不同的处理会话方式?我没有找到任何这样的东西我能以某种方式在PDO中添加$ _SESSION而不用更改代码吗?

我在我的网络项目中使用变量$_SESSION['user_name']$_SESSION['user_id']

要点:

1)如何正确使用PDO中的会话?

2)使用$stmt->fetch(PDO::FETCH_ASSOC);$stmt->fetchAll();

之间有什么区别

谢谢。

3 个答案:

答案 0 :(得分:3)

答案如下:

  1. 在您正在使用会话的每个页面的顶部调用session_start()
  2. 区别在于$stmt->fetch()将获取一行,fetchAll()将获取整个结果集。

答案 1 :(得分:2)

PDOStatement::rowCount()不能运行mysql,所以$ rows不会返回任何内容。 另外,PDO与会话无关,它是处理数据库的扩展。

如果你想计算你可以做的结果数

$stmt->execute();
$results = $stmt->fetchAll();
$results = count($results);

答案 2 :(得分:1)

数目:

1)确保在使用Sessions

的所有页面的开头调用session_start()

2)确保从查询中返回数据

更多信息

PDO::FETCH_ASSOC检索按列名索引的数据。即associative array

在我看来,使用PDO::FETCH_ASSOC总是更好,因为很清楚正在提取哪些数据&处理。

如果选择fetchAll(PDO::FETCH_ASSOC)

,您也可以使用此代码获取关联数组格式的所有行

有关 FetchAll PDO功能的更多信息,请查看here