2015-02-05 117 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