如何从会话中获取$ _SESSION ['id']

问题描述:

您好,我的数据库中有两个表格,一个用于课程,一个用于用户,每个表格都有一个ID列。

我想创建它们之间的关系,一个用户订阅一门课程。我试图将结果存储在名为subscription的第三个表中,该表有一个用于用户ID的课程ID和列的列。

用户在通过与新会话连接的登录后注册。用户点击后订阅链接,是

<a href='subscribe.php?id=".$row['id']."'>subscribe!</a>

他们被带到后端PHP的页面,它是插入到数据库中的信息:

<?php 
session_start(); 

?> 
    $userid = $_SESSION['userID'];  
    $cursoid = $_GET['id']; 

    mysql_connect("localhost", "username", "password") or die(mysql_error()) ; 
    mysql_select_db("test") or die(mysql_error()) ; 


    mysql_query("INSERT INTO `subscriptions` 
        (curso_id, user_id) 
        VALUES ('$cursoid', '$userid ')") 
         or die(mysql_error()); 

在这一点上我已经获得的的ID当然,它被插入里面,问题是用户ID我没有得到任何东西。我如何获得当前登录用户的ID?

这里是我班的登录功能的代码:

public function userLogin() { 
$success = false; 
try{ 
$con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 
$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(); 

if($valid) { 
$success = true; 

} 


$con = null; 
return $success; 
}catch (PDOException $e) { 
echo $e->getMessage(); 
return $success; 

$user = $stmt->fetchObj(); 

    if($user->user_id > 0) { 

     $success = true; 

     // User has been successfully verified, lets sessionize his user id so we can refer to later 
     $_SESSION['userID'] = $user->user_id;} 

} 
} 

,并终于在这里是登录功能的代码:

session_start(); 
$usr = new Users; 
$usr->storeFormValues($_POST); 
if($usr->userLogin()) { 
    header('Location: cursos.php') ; 
    $_SESSION["loggedIn"] = true; 
    $_SESSION['username'] = $_POST['username']; 
    $_SESSION['password'] = $_POST['password']; 
    $_SESSION['id'] = $_POST['id']; 
+3

在进入一些大问题之前,您应该阅读SQLinjection。还混合'mysql_ *'和'PDO' ....你不是这个代码的原始程序员吗? –

你不应该使用sessionIds作为userIds,而应该在插入用户行后使用用户表的主键。此外,可能是迂腐,但你应该重命名你的用户变量为$user,$usr让我wince。

另一种方式来获取会话ID:session_id

- 编辑 -

public function userLogin() { 

    .... 

    $user = $stmt->fetchObj(); 

    if($user->user_id > 0) { 

     $success = true; 

     // User has been successfully verified, lets sessionize his user id so we can refer to later 
     $_SESSION['userId'] = $user->user_id; 
    } 
} 

// We sessionized user id after validation, so we now have access to it 
$userid = $_SESSION['userId']; 

// Using straight mysql api is frowned upon, this should be converted to PDO before production use 
mysql_query("INSERT INTO `subscriptions` (curso_id, user_id) VALUES ('$cursoid', '$userid ')") 
    or die(mysql_error()); 
+0

在我的用户第一列是“用户ID”这是主键也主键是用户名,但由于重复的用户名被允许我猜那个用户ID将是最好的情况,所以如何使用这个作为主键在subscription.php当前登录的用户并将其放入列中的新表订阅user_id –

+0

您每个表只能有一个主键,但是您可以有一个组合主键,但这不是您需要的。你想要的是用户表中没有签名的id列,而不是null auto_increment。然后,您可以将“user_id”列添加到订阅表。然后在下标表和用户表之间添加一个FK关系,这样如果有任何用户被删除,下标表中就不会有孤行。但为了这个工作,你的表必须是InnoDB。 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints。html –

+0

当用户登录时,您可以将他们的'user_id'存储在他们的会话中,所以如果他们点击订阅,则可以引用它以插入到下标表中。 –

你想用一个会话中工作每次,您必须在文件的开头调用session_start函数。你在login函数中调用它,但不要在subscribe.php中调用。试试这个:

session_start(); 

$userid = $_SESSION['id']; 
$cursoid = $_GET['id']; 
//rest of the code 

还你一个小错误这里好,你在这一行有一个空间VALUES ('$cursoid', '$userid ')")

mysql_query("INSERT INTO `subscriptions` 
      (curso_id, user_id) 
      VALUES ('$cursoid', '$userid')") 
       or die(mysql_error());