PHP会话变量在新页面上消失了吗?

时间:2015-02-05 20:10:26

标签: javascript php jquery session slim

首先,我将在WampServer中显示我的项目目录以了解我的问题。 app是PHP中使用Slim Framework的应用程序,可能在将来它成为一个Web服务(尚未)。此文件夹外的其余文件是用户的Web:

Project directory

我在PHP中使用会话变量和Slim Framework。在页面login.php上,我创建了两个会话变量。这个文件不在我正在做的Slim Framework app文件夹中。

这是文件login.php

<?php
session_start();

if (!empty($_SESSION) && array_key_exists("sesionIniciada", $_SESSION)) {
    if ($_SESSION["sesionIniciada"] === true) {
        header('Location: /index.php');
    } else {
        session_destroy();
        $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
        $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
    }
} else {
    session_destroy();
    $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
    $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
}

?>

当变量$_SESSION["sesionIniciada"]不存在或为假时,我会销毁会话并创建两个新变量。没问题。

在同一页面中,我有一个HTML格式的登录表单,当我按下提交按钮时,我调用了一个jquery AJAX函数来登录。

这是Javascript中的函数:

var url = "./app/v1/acceso/web";
var data = JSON.stringify({
    usuario: $.trim($("#usuario").val()),
    clave: $.trim($("#clave").val())
});

$.ajax({
    type: "POST",
    url: url,
    data: data,
    processData: false,
    headers: {
        'S-Publica': $.trim($("#llave").val()),
        'S-Hash': encriptacion(data, $.trim($("#llave").val())),
        'Content-Type': 'application/json'
    },
    success: function (response){ 
        console.log(response);
    },
    error: function (e){
        console.log(e);
    }
});

我对此功能没有问题,因为请求是正确的。

问题出在我通过AJAX调用的PHP文件中:var url = "./app/v1/acceso/web"。在项目目录图像上是app/v1/index.php,其中包含指向链接/acceso/web的路由器。在我的文件中,我正在尝试获取我在login.php中创建的$_SESSION变量,但它们不存在!这很奇怪,因为所有项目都在同一台服务器上(我假设它没有cookie ID的问题)。

这是index.php

的一部分
<?php
session_start();

require '../libs/Slim/Slim.php';
\Slim\Slim::registerAutoloader();

$app = new \Slim\Slim(array(
    'mode' => 'debug'
    ));

$app->post('/acceso/web', function () {
    var_dump($_SESSION); //doesn't show the variables session created in login.php
});

我不知道出了什么问题!我在想是用于Slim的.htaccess文件,但我不确定!无论如何,我发布了.htaccess文件:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ %{ENV:BASE}index.php [QSA,L]

有什么问题?谢谢!

编辑:解决方案

我需要在login.php文件中的会话销毁后重新启动会话变量:

<?php
session_start();

if (!empty($_SESSION) && array_key_exists("sesionIniciada", $_SESSION)) {
    if ($_SESSION["sesionIniciada"] === true) {
        header('Location: /index.php');
    } else {
        session_destroy();
        session_start(); // SOLUTION
        $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
        $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
    }
} else {
    session_destroy();
    session_start(); // SOLUTION
    $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
    $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
}

?>

感谢Alvaro Montoro的回答!

1 个答案:

答案 0 :(得分:1)

根据http://php.net/manual/en/function.session-destroy.php

  

session_destroy()会销毁与当前关联的所有数据   会话。它不会取消任何与之相关的全局变量   会话,或取消设置会话cookie。 使用会话变量   再一次,必须调用session_start()。

(大胆的部分是我突出我对上述问题所评论的内容)

因此解决方案是在销毁会话后调用session_start()

  session_destroy();
  session_start();
  $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
  $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));