【问题标题】:How to loop through session array in php如何在php中循环遍历会话数组
【发布时间】:2011-07-21 04:43:05
【问题描述】:

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

<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>

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

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

?>

我明白了:

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

用户 ID:1 用户名:哟

用户 ID:2 用户名:max

【问题讨论】:

  • 尽量避免SQL注入或问题:将POST数据插入查询时使用mysql_real_escape_string()
  • @Frosty only string 来自 any 来源的数据。
  • 显然,但是感谢您为任何阅读本文的初学者指出这一点。

标签: php mysql session


【解决方案1】:
session_start();
foreach ($_SESSION as $name => $value)
{
    echo $name."=".$value."<br>";
}

【讨论】:

  • 问题建议应该完成每个用户会话的输出。正确的答案是它不能在 $_SESSION 上进行迭代。
【解决方案2】:

UPDATE:非数字索引。

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

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

【讨论】:

  • $_SESSION 数组不支持数字索引
  • 还是不行,因为PHP变量名不能从数字开始。
  • 另外,迭代 $_SESSION 本身是一种不好的做法。可能(并且很可能会有)其他项目,例如购物车、用户偏好等
【解决方案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";
}

【讨论】:

    【解决方案4】:

    你为什么不把它存储起来

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

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

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

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

    【讨论】:

    • 我认为如果有人从另一个客户端(浏览器、机器...)连接,这将不起作用...
    • $_SESSION 数组不支持数字索引
    【解决方案5】:

    $_SESSION 仅适用于实际打开页面的访问者。 (如果能看到每个人的 $_SESSION 变量就好了,不是吗?)

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

    更新:

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

    【讨论】:

    • 想为当前用户制作一张桌子?或在用户表上进行开关?(如果已登录,则为 1,如果未登录,则为 0)。这是你要我做的吗?
    • 刚刚更新了我的答案,概述了如何轻松做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2012-11-14
    • 2011-04-25
    • 1970-01-01
    • 2019-07-10
    • 2013-03-03
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多