Php 如何在PDO中使用会话?

Php 如何在PDO中使用会话?,php,session,login,pdo,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 sh

我仍在重新编写和删除代码中的旧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']));
  }
但是,这个函数似乎总是返回空的,因为$u会话在PDO中不存在?当然,在我的网站上,注销是以这种形式使用的:

  public function logout()
  { 
      unset($_SESSION['user_id']);
      unset($_SESSION['user_name']);       
  } 
但我认为PDO有不同的处理会话的方式?我没有发现任何问题,所以我可以在PDO中添加$_会话,而不需要对代码进行太多更改吗

我在整个web项目中使用变量
$\u SESSION['user\u name']
$\u SESSION['user\u id']

总结:

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

2) 使用
$stmt->fetch(PDO::fetch_ASSOC)有什么区别
$stmt->fetchAll()


谢谢。

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

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

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

答案如下:

  • 在使用会话的每个页面顶部调用
    session\u start()
  • 区别在于
    $stmt->fetch()
    将获取一行,而
    fetchAll()
    将获取整个结果集
  • 答复:

    1) 确保在使用会话的所有页面的开头调用会话_start()

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

    进一步资料

    PDO::FETCH_ASSOC
    检索按列名索引的数据。i、 伊安

    在我看来,最好使用
    PDO::FETCH_ASSOC
    ,因为它非常清楚正在获取和处理哪些数据

    如果选择
    fetchAll(PDO::fetch\u ASSOC)


    有关
    FetchAll
    PDO函数的更多信息,请查看摆脱mysql的+1。现在阅读您的问题:)PDO和会话是PHP的两个不相关的特性。它们可以而且通常可以共存。登录函数是否返回true而会话变量仍然为空?您是否事先调用了
    session\u start()
    ?我没有调用session\u start()-我应该把它放在哪里?我刚刚在那里施工,但我删除了它。@事实是这样的:我应该把它放回去还是以某种方式重做?你知道我第二个问题的答案吗?谢谢你,难道你看不到你的Byakugan吗?我想我的Rinnegan更强壮…:请看我的答案。你知道我第二个问题的答案吗我知道什么时候该用这个或那个,但无法解释清楚。你应该阅读手册,或者其他人可以解释。那么,这个案例是什么更好地使用?或者更安全或更实用?:)
    fetch()。因此,这取决于您需要什么,所以即使我只需要获取一个,我也可以使用fetchAll,不在乎我是否理解正确:)如果它在没有会话的情况下也能工作,我还应该使用它吗?我应该在我的注销函数中使用session_destroy()之类的东西吗?所以似乎它没有正确地将变量添加到$_session['user_name']和$_session['user_id']中。最后,在编辑函数之后,它出现了,但是当我打印会话变量时,它们是空的。你知道吗?即使打印成功地打印在该函数中,但变量为空。。。我很绝望。您是否确保正在运行if语句-if($rows>0)以及在所有必需的页面中调用了session_start()?@Byakugan-在检查了我在前面的评论中建议的两项之后,我还建议检查填充了以下变量:$results_login['username']和$results_login['id']