PDO用户会话

时间:2013-03-06 02:56:19

标签: php session pdo

我将旧的mysql转换为PDO,我遇到了第一个问题。

我希望根据$_SESSION['user_id']回显用户信息,但数据库中的user_id未分配给$_SESSION['user_id'],因此我在{{1}的帐户页面中获得Notice: Undefined index: user_id in }和$user_id = $_SESSION['user_id'];行。

我在页面顶部有print_r($_SESSION['user_id']);

session_start();

登录

class User {
public $user_id = null;

public function userInfo($user_id) {
    global $db;

    $query = $db->prepare("SELECT user_id, username, email FROM users WHERE user_id = :id");
    $query->bindValue(':id', $user_id);
    $query->execute();

    return $query->fetch();
}

public function login($login, $password){
    global $db;

    $query = $db->prepare("SELECT COUNT(user_id) as count, user_id FROM users WHERE username = :user AND password = :pass");

    $query->bindValue(':user', $login);
    $query->bindValue(':pass', $password);
    $query->execute();

    $result = $query->fetchColumn();

    if ($result) {  
        $this->user_id = $result['user_id'];
    }

    return $result;
   }
}

帐户页面

if (isset($_POST['login'], $_POST['password'])) {

$login = $_POST['login'];
$password = sha1($_POST['password']);

$errors = array();

if (empty($login) || empty($password))
{
 $errors[] = 'All fields required!';
} 
else {
    $user = new User;
    $log_in = $user->login($login, $password); 

    if($log_in) {
        $_SESSION['user_id'] = $user->user_id;
        header('Location: account.php');
        exit();
    } else { 
            $errors[] = 'Username or password incorrect!';
           }
}

if (!empty($errors)){

        foreach ($errors as $error)
        {
            echo '<div id="error"><strong>', $error, '</strong></div><br />';
        }
    }
}

2 个答案:

答案 0 :(得分:1)

主要问题是,您的登录方法是返回数据,而您的调用代码正在将其视为设置内部变量:

$user = new User;
$log_in = $user->login($login, $password); 

if($log_in) {
    $_SESSION['user_id'] = $user->user_id;

请参阅..你的user_id实际上是在$ log_in中,而不是$ user ...正确的,你应该没事。

答案 1 :(得分:0)

  

$ _ SESSION ['user_id']但是数据库中的user_id没有分配给$ _SESSION ['user_id']所以我收到通知:未定义索引:帐户页面中的user_id

这是逻辑上不正确的陈述 它的第一部分可以证明是真的只有如果你真的立即,即:

$_SESSION['user_id'] = ...//being populated 
var_dump($_SESSION['user_id']);die;

如果它不会显示正确的值 - 只有这样你就可以说它没有被填充。否则你所有的进一步扣除都是不正确的。因为可能有1000个原因(尽管正确填充)不能在另一页上显示 好吧,如果它不会死在这里 - 移动这个var-die代码,看看出了什么问题。等等。

抱歉,但整个问题看起来像是“为我调试代码” 为什么不自己调试,使用你手头的翻译和环境的所有功能和运行它所必需的能力多少次? 你为什么要求陌生人只是心理调试你的代码,只是用他们的大脑运行你的代码?这是错误的设计和非常低效!
请自行调试代码,找到某些问题,然后询问有关它的特定问题。