如何在php中循环遍历会话数组

时间:2011-03-23 10:20:23

标签: php mysql session

我正在尝试循环会话。但我似乎无法获得预期的结果。 我还在努力探索一些事情。所以请教我一个更好的方法来做到这一点。如果您发现我的代码不安全或不合适。 首先我有这个登录表单:

<form name="x" action="login.php" method="post">

Username:<input type="text" name="uname" value=""></input><br/>
Password:<input type="password" name="pword" value=""></input>
<input type="submit" value="login"></input>
</form>

这是login.php,如果在mysql数据库中找到记录,它会设置会话:

<?php
require_once("conn.php");

$username=$_POST['uname'];
$pword=md5($_POST['pword']);

echo $username."<br/>";
echo $pword;

$check=mysql_query("SELECT * FROM users WHERE Uname='$username' AND Hpword='$pword'");

if(mysql_num_rows($check)==0){
    header('Location:loginform.php');
}else{

    session_start();

    while($result=mysql_fetch_assoc($check)){
        $_SESSION['uid'].=$result['ID'];
        $_SESSION['uname'].=$result['Uname'];


    }

}
?>

这是循环会话的文件:

<?php

session_start();
echo "Logged in users:<br/>";


foreach($_SESSION as $sir){


}

echo "User id: ". $_SESSION['uid']."<br/>";
echo "Username: ".$_SESSION['uname']."<br/>";

?>

我明白了:

enter image description here

虽然我期待得到这样的东西:

用户ID:1 用户名:yoh

用户ID:2 用户名:max

5 个答案:

答案 0 :(得分:7)

$ _ SESSION仅适用于实际打开页面的访问者。 (看到每个人的$ _SESSION变量会很高兴,不是吗?)

您可能希望将这些$ _SESSION变量存储在数据库中,然后循环遍历它们。

更新

  • 创建一个会话表,您可以在其中存储当前登录的用户
  • 每次登录用户打开页面时,都会增加last_seen
  • 之类的值(时间戳)
  • 同时检查死会话(例如,删除last_seen值小于now的所有行 - 服务器的会话生存期

答案 1 :(得分:3)

除了非常正确的fabrik的回答,只需几行代码:

foreach($_SESSION as $sir){

}

这个循环显然什么也没做。你无法从没有输出的代码中获得任何输出:)

另外,如果你想将多个值存储到会话中,比如在购物车中,你必须存储在数组中,而不是长串联字符串:

    $_SESSION['cart'][] =$result;

会产生一个名为$ _SESSION ['cart']的数组,可以按照你想要的方式迭代:

foreach ($_SESSION['cart'] as $result){
  echo "Item id: ".$result['id'].", name: ".$result['name']."<br>\n";
}

答案 2 :(得分:1)

session_start();
foreach ($_SESSION as $name => $value)
{
    echo $name."=".$value."<br>";
}

答案 3 :(得分:0)

更新:非数字索引。

在login.php中

while($result=mysql_fetch_assoc($check)){
     $_SESSION[$result['Uname'].$result['ID']] = array(
         "uid"=>$result['ID'], 
         "uname"=>$result['Uname']
     );
}

在你的foreach

foreach($_SESSION as $uinfos){
    echo "User id: ".$uinfos["uid"]."<br/>Username: ".$uinfos["uname"]."<br/>";
}

像这样,每个用户只有一个条目。

答案 4 :(得分:-1)

为什么不像

那样存储它

$ _ SESSION [$ uid] = $ name;或$ _SESSION [] = array('uid'=&gt; $ uid,'name'=&gt; $ name);

然后您可以简单地遍历所有条目..

foreach($_SESSION as $uid=> $name){
   ....
}

foreach($_SESSION as $userArray){
    $uid = $userArray['uid']; 
    $name = $userArray['name']; 
}