首先,我要在WampServer中顯示我的項目目錄來理解我的問題。 app
是使用Slim Framework的PHP中的應用程序,也許將來它會成爲一個Web服務(暫時還沒有)。此文件夾以外的其餘文件是用戶網絡:PHP會話變量在新頁面上消失了嗎?
我在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));
}
?>
感謝阿爾瓦羅·蒙託羅的答案!
我始終認爲,如果你想使用會話變量,你必須在session_destroy()之後調用'session_start()'。這可能是一個問題嗎? – 2015-02-05 20:19:46
當你明顯沒有完成這個任務時,你爲什麼要破壞會話? – Slime 2015-02-05 20:29:06