【问题标题】:Cannot get the previous session when new session is assigned using PHP使用 PHP 分配新会话时无法获取上一个会话
【发布时间】:2017-04-13 01:11:53
【问题描述】:

我正在尝试使用 PHP 存储会话。但是当我尝试存储新的会话值时,存储后我无法获得上一个会话值。这是我的代码:

id=17;
var url="common.php?action=savecid";
$.post(url,{"cat_data":id},function(data){  
var obj=JSON.parse(data);
console.log('catdata',obj);
})

这里我试图将 cat_data 存储到会话中,下面给出了 php 代码。

if($action=='savecid'){
    $id=$_POST['cat_data'];
    session_start();
    //if(isset($_SESSION['cid']) && !empty($_SESSION['cid'])){
    if(array_key_exists('cid',$_SESSION) && !empty($_SESSION['cid'])) {
        //unset($_SESSION['cid']);
        session_unset('cid');
        $_SESSION['cid']=$id;
        $flag="true";

    }else{
        $_SESSION['cid']=$id;
        $flag="false";
    }
    $result=array("isData"=>1,"cid"=>$_SESSION['cid'],"flag"=>$flag);
    echo json_encode($result);
}

上面的控制台输出为{ isData: 1, cid: Array[4], cat_id: "17" }。在这里我可以存储值并获取。下面给出了我的第二个 Ajax 调用。

sid=20
var url="common.php?action=setsubcatid";
$.post(url,{"subcat_data":sid},function(data){
    var obj=JSON.parse(data);
    console.log('subdata11',obj);

})

在这里,我尝试使用下面的 php 代码使用不同的键存储另一个 id。

if($action=='setsubcatid'){
    $id=$_POST['subcat_data'];
    $cat_id=$_SESSION['cid'];
    session_start();
    if(array_key_exists('subcat_id',$_SESSION) && !empty($_SESSION['subcat_id'])) {
        //unset($_SESSION['cid']);
        session_unset('subcat_id');
        $_SESSION['subcat_id']=$id;
        $flag="true";

    }else{
        $_SESSION['subcat_id']=$id;
        $flag="false";
    }
    $result=array("isData"=>1,"subcat_id"=>$_SESSION['subcat_id'],"flag"=>$flag,'cat_id'=>$cat_id);
    echo json_encode($result);
}

这里我也试图返回以前存储的 id (i.e-$_SESSION['cid']),但在相应的控制台中我得到了这个subdata11 Object { isData: 1, subcat_id: "20", flag: "true", cat_id: null }。在这里,我无法获得之前存储的 $_SESSION['cid'] 值。我需要在会话没有被破坏之前我应该​​得到所有的会话键值。

【问题讨论】:

  • 您是否尝试过使用命名会话? session_name('mySession')session_start() 之前。我记得有这样简单的事情可以让它工作,但我现在不确定,因为这次不工作。
  • @TypedSource : 不,我不使用session_name('mySession')。你能分享你的想法吗。
  • session_unset 不会通过键取消设置,它会取消设置所有会话变量,请阅读文档php.net/manual/en/function.session-unset.php
  • @Mr_KoKa :如何取消设置单个键值。
  • @satya 取消设置单个会话密钥操作会话数组:unset($_SESSION['myKeyToRemove']);

标签: php ajax session


【解决方案1】:
<?php
  session_name('mySession'); 
  // this helped in my case to set the cookie and use it in js
  session_start();

  ...

  switch($action) {
    case 'todo':
      // do anything;
      break;
    default:
      echo 'you have no rights, the session will be terminated now';
      session_write_close();
      $_SESSION = [];
  }
  // session is not longer available here

顺便说一句,如果你确定你有注销或类似的东西,每次只关闭(销毁)它是非常有用的。

【讨论】:

  • 如果一个会话一旦因为cookie没有法律效力而无法恢复就被破坏了。我忘记说的是,如果会话真的使用 cookie,请查看您的 php 配置(通常应该是默认设置)
猜你喜欢
  • 1970-01-01
  • 2018-11-19
  • 2014-09-13
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多