【问题标题】:Storing Arrays as PHP Session Variables将数组存储为 PHP 会话变量
【发布时间】:2012-03-16 17:05:13
【问题描述】:

我的网站有一个用户列表,每个用户都是不同区域(组、位置等)的成员。我不想每次创建列表时都调用数据库,而是想将数组变量存储在会话中。

    //creates the array of groups that the user is in
    $_SESSION['gx']=mysql_query("SELECT * FROM `members` WHERE `user`='$user'");

现在我的页面加载并且 session_start() 运行。但是,当我的页面去检索该会话变量时,它不存在。有什么建议吗?

谢谢

【问题讨论】:

  • mysql_query 不返回数组...它返回结果资源...您需要根据查询结果构建数组...

标签: php arrays session


【解决方案1】:

mysql_query 的返回值无法序列化(存储到会话中)。但是您可以将结果拉出一个常规数组并序列化 that:

$res = mysql_query("SELECT * FROM `members` WHERE `user`='$user'");
if ($res) {
    $_SESSION['gx'] = mysql_fetch_array($res);
}

警告:根据$user 从何处获取其值,此代码可能容易受到 SQL 注入的攻击。负责任地编写代码。

【讨论】:

    【解决方案2】:

    mysql_query() 不返回结果数组,它返回可用于mysql_fetch_array() 等的资源。

    你必须先获取数据:

    $res = mysql_query("SELECT * FROM `members` WHERE `user`='$user'") or die('Error!');
    
    $_SESSION['gx'] = array();
    while ( $arr = mysql_fetch_array($res, MYSQL_ASSOC) )
    {
      $_SESSION['gx'][] = $arr;
    }
    

    我相信用户名是唯一的,所以你只需要拨打mysql_fetch_*(),例如:

    $res = mysql_query("SELECT * FROM `members` WHERE `user`='$user'") or die('Error!');
    
    $_SESSION['gx'] = mysql_fetch_array($res, MYSQL_ASSOC);
    

    【讨论】:

      【解决方案3】:

      mysql_query() 不返回数组,而是返回资源。首先从资源中获取值,然后将结果存储在会话中。

      【讨论】:

        【解决方案4】:

        您正在执行查询,但返回的是资源,而不是结果。如果你想要数据,你需要获取一个数组。

        $_SESSION['gx']=mysql_fetch_array(mysql_query("SELECT * FROM `members` WHERE `user`='$user'"));
        

        【讨论】:

          【解决方案5】:

          mysql_query() 返回一个资源,你需要像这样在一个数组中获取这个资源:

          $query = mysql_query("SELECT * FROM `members` WHERE `user`='" . mysql_escape_string($user) . "'");
          $_SESSION['gx'] = mysql_fetch_array($query, MYSQL_ASSOC);
          

          此外,您还有一个潜在的安全漏洞。您可能希望使用 mysql_escape_string() 转义 $user 以避免 SQL 注入。

          【讨论】:

          • 就是这样 - 非常感谢。 "$user" 来自一个从登录页面发布时被转义的变量,所以它很干净 - 无论如何感谢您的警告。
          猜你喜欢
          • 2021-02-01
          • 2013-03-02
          • 1970-01-01
          • 2013-09-01
          • 2013-10-11
          • 2011-04-17
          • 2015-04-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多