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

6

我想循环遍历会话,但似乎无法获得预期的结果。 我仍在尝试探索事物。所以请教一下有更好的方法来做这件事。如果您发现我的代码不安全或不合适,请告诉我。 首先,我有这个登录表单:

<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

尝试避免 SQL 注入或问题:在将 POST 数据插入查询时使用 mysql_real_escape_string() - Maxime Pacary
1
只应该从任何来源提取字符串数据,@Frosty。 - Your Common Sense
显然,不过感谢您为任何初学者指出这一点。 - Maxime Pacary
5个回答

6

$_SESSION 只对实际打开页面的访问者可用。(能看到每个人的 $_SESSION 变量会很好,不是吗?)

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

更新:

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

你是想为当前用户创建一个表格吗?或者在用户表上进行开关操作(1表示已登录,0表示未登录)。这是你想让我做的吗? - Wern Ancheta
我刚刚更新了我的答案,并提供了一个简单的操作步骤。 - fabrik

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";
}

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

问题建议应该完成每个用户会话的输出。正确的答案是无法通过迭代 $_SESSION 来完成。 - Sven

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/>";
}

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


1
$_SESSION数组不支持数字索引。 - Your Common Sense
它仍然无法工作,因为PHP变量名不能以数字开头。 - Your Common Sense
此外,循环遍历 $_SESSION 本身是一种不好的做法。可能会有其他项目,例如购物车、用户偏好等。 - Your Common Sense

-1
为什么不像这样存储:

$_SESSION[$uid] = $name; 或者 $_SESSION[] = array('uid' => $uid, 'name' => $name);

然后你可以轻松地遍历所有条目。
foreach($_SESSION as $uid=> $name){
   ....
}

或者

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

我认为如果有人从另一个客户端(浏览器,机器......)连接,这将无法正常工作... - Maxime Pacary
$_SESSION数组不支持数字索引。 - Your Common Sense

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接