2

我仍在重做并删除代码中的旧 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']));
  }

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

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

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

我在整个网络项目中都$_SESSION['user_name']使用变量。$_SESSION['user_id']

概括:

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

$stmt->fetch(PDO::FETCH_ASSOC);2)使用和之间有什么区别$stmt->fetchAll();

谢谢你。

4

3 回答 3

3

答案如下:

  1. session_start()在您使用会话的每个页面的顶部调用。
  2. 不同之处在于$stmt->fetch()它将获取一行,fetchAll()并将获取整个结果集。
于 2012-06-09T16:25:48.360 回答
2

PDOStatement::rowCount()mysql 不起作用,所以 $rows 不会返回任何东西。另外,PDO与会话无关,它是处理数据库的扩展。

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

$stmt->execute();
$results = $stmt->fetchAll();
$results = count($results);
于 2012-06-09T15:54:28.643 回答
1

答案:

1) 确保 session_start() 在所有使用 Sessions 的页面开始时被调用

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

更多信息

PDO::FETCH_ASSOC检索按列名索引的数据。即关联数组

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

如果您选择,您还可以使用此代码以关联数组格式获取所有行fetchAll(PDO::FETCH_ASSOC)

有关 FetchAllPDO 功能的更多信息,请查看此处

于 2012-06-09T16:37:06.087 回答