会话数组仅存储最后一个元素

时间:2013-05-07 20:20:01

标签: php

我正在尝试使用会话变量跟踪用户访问的网页和访问日期。在我的页面中,我将变量分配为这样的数组:

session_start();
$_SESSION['page']=array();
$_SESSION['page'][]=$_SERVER['REQUEST_URI'];
$_SESSION['time']=array();
$_SESSION['time'][]=date("m/d/y", time());

我使用以下脚本打印变量:

<?php
session_start();
print_r($_SESSION['page']);
print_r($_SESSION['time']);
?>

在我访问了几个页面之后,上面的脚本只打印了我访问过的最后一页而不是显示所有页面。有人可以帮我解决问题吗?谢谢。

6 个答案:

答案 0 :(得分:5)

那是因为你在每次访问页面时反复初始化数组。请改用这样的东西:

// initialize array only if it not already exists:
if(!is_array($_SESSION['page'])) {
    $_SESSION['page']=array();
}
$_SESSION['page'][]=$_SERVER['REQUEST_URI'];

... 

答案 1 :(得分:1)

每次重新声明数组,从而清除它:

$_SESSION['page']=array();

解决方案:检查数组是否存在,添加元素。

if (!isset($_SESSION['page'])){
  $_SESSION['page'] = array();
}
$_SESSION['page'][] = "New data" ;

答案 2 :(得分:1)

是的,你必须这样做:

if (!isset($_SESSION['time'])) {
   $_SESSION['time'] = array();
}
if (!isset($_SESSION['page'])) {
   $_SESSION['page'] = array();
}
$_SESSION['time'][] = date("m/d/y", time());

否则,您只需反复覆盖'time'密钥..

答案 3 :(得分:0)

从代码中删除以下行。

$_SESSION['page']=array();
$_SESSION['time']=array();

以上行重置会话变量。

答案 4 :(得分:0)

每次保存新会话时,您都会将它们重新设置为空数组:

$_SESSION['page']=array(); // the $_SESSION['page'] now is empty
$_SESSION['page'][]=$_SERVER['REQUEST_URI'];

答案 5 :(得分:0)

我会将这类信息存储在数据库中,并在需要时随时调用它。

但要回答关于在会话变量中执行此操作的确切问题,请使用以下内容:

session_start();

/****Record visit****/
$newvisit=array();
$newvisit['page']=$_SERVER['REQUEST_URI'];
$newvisit['time']=date("m/d/y",time());

/****Store visit in SESSION****/
if(!empty($_SESSION['visits'])){
    array_push($_SESSION['visits'],$newvisit);
}else{
    $_SESSION['visits'][0]=$newvisit;
}

与其他人提到的一样,您的代码的主要问题是您正在编写相同的会话变量。