2015-02-05 6 views
1

Прежде всего, я собираюсь показать свою директорию проектов в WampServer, чтобы понять мой вопрос. app - это приложение на PHP с Slim Framework, и, возможно, в будущем он станет веб-сервисом (пока еще нет). Остальные файлы за пределами этой папке веб для пользователя:Переменные сеанса PHP исчезают на новой странице?

Project directory

Я работаю в PHP с сеансовых переменных и Слим Framework. На странице 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); 
    } 
}); 

У меня нет проблем с этой функцией, потому что запрос был прав.

Проблема заключается в PHP-файле, который я вызываю через AJAX: var url = "./app/v1/acceso/web". В каталоге проекта изображение app/v1/index.php с маршрутизатором по ссылке /acceso/web. В этом файле я пытаюсь получить переменные $_SESSION, которые я создал в login.php, но они не существуют! Это очень странно, потому что весь проект находится на одном сервере (и я полагаю, что он не имеет проблем с идентификатором файла cookie).

Это часть 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 
}); 

Я не знаю, что это неправильно! Я думаю, это файл .htaccess, используемый для Slim, но я не уверен в этом! В любом случае я публикую файл .htaccess:

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

В чем проблема? Благодаря!

EDIT: РЕШЕНИЕ

мне нужно перезапустить переменные сессии после сессии разрушающие в 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_start()' после 'session_destroy()', если вы хотите использовать переменные сеанса. Это может быть одна проблема? –

+1

Почему вы уничтожаете сеанс, когда вы явно не сделали этого? – Slime

ответ

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

+0

Вы должны спросить об этом @ChristiamMercado. Это его код, я просто добавил 'session_start()' :) –

+0

@slime: я уничтожаю сеанс в файле 'login.php' после создания новых переменных, потому что мне нужно очистить все переменные сеанса, которые я использую в других файлах для Утилиты для входа в систему. А про @ Алваро Монторо ответ, вот в чем проблема! Я не знаю, что мне нужно снова запустить переменные сеанса. Большое спасибо! –

Смежные вопросы