【问题标题】:PHP Session variables disappearing on new page?PHP 会话变量在新页面上消失?
【发布时间】:2015-02-05 20:10:26
【问题描述】:

首先,我将在 WampServer 中显示我的项目目录以了解我的问题。 app 是带有 Slim 框架的 PHP 应用程序,将来可能会成为 Web 服务(还没有)。此文件夹之外的其余文件是用户的网络:

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

这是文件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 的回答!

【问题讨论】:

  • 我一直认为如果你想使用会话变量,你必须在session_destroy()之后调用session_start()。这可能是一个问题吗?
  • 当你显然没有完成会话时,为什么要销毁它?

标签: javascript php jquery session slim


【解决方案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));

【讨论】:

  • 既然你显然没有完成会话,为什么还要销毁它呢?
  • 您必须向@ChristiamMercado 询问。这是他的代码,我刚刚添加了一个session_start() :)
  • @slime:我在创建新变量后销毁了login.php 文件中的会话,因为我需要清除在其他文件中用于登录实用程序的所有会话变量。关于@Alvaro Montoro 的回答,这就是问题所在!我不知道我需要重新开始会话变量。非常感谢!
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2017-03-22
  • 2012-06-04
  • 1970-01-01
  • 2020-01-16
相关资源
最近更新 更多