2015-02-05 112 views
1

首先,我要在WampServer中显示我的项目目录来理解我的问题。 app是使用Slim Framework的PHP中的应用程序,也许将来它会成为一个Web服务(暂时还没有)。此文件夹以外的其余文件是用户网络:PHP会话变量在新页面上消失了吗?

Project directory

我在PHP工作与会话变量和超薄框架。在页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。 Inthis文件我试图获得我在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)); 
} 

?> 

感谢阿尔瓦罗·蒙托罗的答案!

+1

我始终认为,如果你想使用会话变量,你必须在session_destroy()之后调用'session_start()'。这可能是一个问题吗? – 2015-02-05 20:19:46

+1

当你明显没有完成这个任务时,你为什么要破坏会话? – Slime 2015-02-05 20:29:06

回答

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)); 
+0

为什么在你完全没有完成它的时候破坏会话呢? – Slime 2015-02-05 20:26:31

+0

您必须向@ChristiamMercado询问。这是他的代码,我刚刚添加了一个'session_start()':) – 2015-02-05 20:28:17

+0

@slime:创建新变量后,我在'login.php'文件中销毁了会话,因为我需要清理所有在其他文件中使用的会话变量登录工具。关于@Alvaro Montoro回答,这就是问题所在!我不知道我需要重新启动会话变量。非常感谢! – 2015-02-06 01:54:57