2011-12-15 66 views
2
function StoreUserProfileInSession($username, $password) 
{ 
     session_start(); 
     $query = pg_query("SELECT * FROM mytable where username = '$username' AND password = '$password'"); 

     $rows = pg_fetch_array($query); 

     foreach($rows as $key => $value) 
     { 
      if($key == 'password') //do not store password in session because it's DANGEROUS! 
       continue; 

      $_SESSION[$key] = $value; 
     } 
} 

在调用这个函数之后,我被重定向到了我的前端。
当我尝试print_r($_SESSION);在那里,我只有一个会话中的值,这是user_id,我的表中有很多字段。
为什么我只能得到一个值?这有什么问题?PHP Session只存储一个值

任何帮助或想法将不胜感激和奖励!
谢谢! :)

+1

您是否记得在调用此函数的请求中使用`session_start()`? – mauris 2011-12-15 03:30:34

+0

@thephpdeveloper:函数顶部有一个`session_start()`,应该不够吗? – 2011-12-15 03:35:05

回答

5

两件事情:

  1. pg_fetch_array()没有返回你所期望的。
  2. $_SESSION不能有任何键名不能也是一个PHP变量名

$rows看起来是这样的:

$rows = array(
    'user_id' => 1 
    1, 
    'password' => 'THE PASSWORD', 
    'THE PASSWORD', 
); 
$rows['user_id'] === $rows[0]; 
// etc 

因此,在您的foreach循环,在user_id键之后,你实际上是这样:

$_SESSION[0] = 1; 

这是非法的,所以会议对象停止工作。

而是做到这一点:

// PGSQL_ASSOC says, "only return named keys, not numeric keys" 
$therow = pg_fetch_array($query, null, PGSQL_ASSOC); 
unset($therow['password']); 
$_SESSION['user'] = $therow; 
pg_free_result($query); 


// get user data like this: 
$_SESSION['user']['user_id'] 
1

也许是这一点,因为你只让你执行查询后一排?

有多少行被返回:

"SELECT * FROM mytable where username = '$username' AND password = '$password'" 
0

谢谢回答。我设法回答这个问题。

function StoreUserProfileInSession($username, $password) 
    { 
     session_start(); 
     $query = pg_query("SELECT * FROM mytable where username = '$username' AND password = '$password'"); 
     $fields = array(); 

     while($rows = pg_fetch_array($query)) 
     { 
      $fields[] = $rows; 
     } 

     foreach($fields[0] as $key => $value) 
     { 
      if(is_int($key) || $key == 'password') 
       continue; 
      $_SESSION[$key] = $value; 
     } 
    }