- Проблем със сесия
1234
WT форуми -> PHP MySQL ASP.NET -> Проблем със сесия
Създайте нова тема Напишете отговор 
Автор Съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 81
Bonus: 174
Мнения: 1644
Мнение 14/03/2018 5:44 pm     Проблем със сесия Отговорете с цитат


Ето какъв е проблема. Да кажем потребител отива на някаква страница, която изисква да бъде логнат за да може да извърши някакво действие. На страницата(вю-то) сетвам сесия.

PHP code:

session_start();
$_SESSION['userCurrentUrl'] = $this->_currentUrl;


Потребителят отива да се логва и аз проверявам дали е сетната сесия с url-a и ако не е го пращам на началната страница иначе го връщам на страницата от която идва.

PHP code:

if (!isset($_SESSION['userCurrentUrl']))
{
header("Location:" . $this->_link);
}
else
{
header("Location:" . $this->_link . '/' . $_SESSION['userCurrentUrl']);
}


На страницата в която сетвам имам сесията, но в логина сесията е null. Някакви идеи какво да правя?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
heytar
Нов
Нов

Регистриран на: 29/06/2015 9:28 am

Support: 1
Bonus: 2
Мнения: 67
Мнение 14/03/2018 5:55 pm     Re: Проблем със сесия Отговорете с цитат


PHP code:
session_start();

това имаш ли го във 2-та файла?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 81
Bonus: 174
Мнения: 1644
Мнение 14/03/2018 7:20 pm      Отговорете с цитат


По default нямам в логин контролера. Така работеше на локалхоста, но пробвах да слагам в конструктора на логин контролера също и във вю-то на
логин и няма резултат.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 47
Bonus: 94
Мнения: 611
Мнение 15/03/2018 12:02 am      Отговорете с цитат


Нещо липсва информация. Сигурен ли си, че реално сетваш сесията? Малко повече код няма да навреди да се погледне. Също ... дебъг.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 81
Bonus: 174
Мнения: 1644
Мнение 15/03/2018 11:02 am      Отговорете с цитат


Ето какво е положението.
Слагам session_start(); и var_dump($_SESSION['userCurrentUrl']); в конструктора на логин контролер-а и имам сесия преди да субмитна. След това вече сесията става null и проверката не минава. Пускам контролера и модела за повече информация.

Login controller


PHP code:

<?php

namespace controllers;

use application\Normalize;
use application\routers\DefaultRouter;
use application\View;
use models\IsLoggedModel;
use models\LoginModel;

class Login
{
private $_view;
private $_loginModel;
private $_defaultRouter;
private $_normalize;
private $_data;
private $_link;
private $_isLoggedModel;

public function __construct(View $view, LoginModel $loginModel, DefaultRouter $defaultRouter, Normalize $normalize, IsLoggedModel $isLoggedModel)
{
$this->_view = $view;

$this->_loginModel = $loginModel;

$this->_defaultRouter = $defaultRouter;

$this->_normalize = $normalize;

$this->_data = $this->_loginModel->html();

$this->_link = $this->_defaultRouter->link();

$this->_isLoggedModel = $isLoggedModel;

session_start();
var_dump($_SESSION['userCurrentUrl']);
}

public function run()
{
try
{
$this->_isLoggedModel->isLogged();
}
catch (\Throwable $exc)
{
if ($exc->getMessage() == 'logged')
{
header("Location:" . $this->_link);
}
}

$submit = $this->_normalize->post('submit', 'trim');

$email = $this->_normalize->post('email', 'trim');

$pass = $this->_normalize->post('pass', 'trim');

try
{
$this->_loginModel->run($email, $pass);
}
catch (\Throwable $exc)
{
$this->_view->_emailValue = $email;

if (isset($submit))
{
if ($exc->getMessage() == 'ok')
{
if (!isset($_SESSION['userCurrentUrl']))
{
header("Location:" . $this->_link);
}
else
{
header("Location:" . $this->_link . '/' . $_SESSION['userCurrentUrl']);
}
}
elseif ($exc->getMessage() == 'token')
{
$this->_view->_message = $this->_data['message_13'];

$this->layout();
}
elseif ($exc->getMessage() == 'empty')
{
$this->_view->_message = $this->_data['message_2'];

$this->layout();
}
elseif ($exc->getMessage() == 'email')
{
$this->_view->_emailValue = null;

$this->_view->_message = $this->_data['message_15'];

$this->layout();
}
elseif ($exc->getMessage() == 'pass')
{
$this->_view->_message = $this->_data['message_15'];

$this->layout();
}
elseif ($exc->getMessage() == 'active')
{
$this->_view->_message = $this->_data['message_16'];

$this->layout();
}
}
else
{
$this->_view->_emailValue = null;

$this->_view->_message = $this->_data['message_0'];

$this->layout();
}
}
}

public function layout()
{
// Display
$this->_view->display('header');
$this->_view->display('Login');
$this->_view->display('footer');
}
}


Login model

PHP code:


<?php

namespace models;

use application\App;
use application\Config;
use application\Database;
use application\Normalize;

class LoginModel
{
private $_config;
private $_database;
private $_app;
private $_normalize;

public function __construct(Config $config, Database $database, App $app, Normalize $normalize)
{
$this->_config = $config;

$this->_database = $database;

$this->_app = $app;

$this->_normalize = $normalize;
}

public static function generate()
{
return $_SESSION['tokenLogin'] = bin2hex(openssl_random_pseudo_bytes(16));
}

public function run($email, $pass)
{
session_start();

$token = $this->_normalize->post('token', 'trim');

if ($token != isset($_SESSION['tokenLogin']))
{
throw new \Exception('token', 405);
}

$this->_database->prepare('USE market')->execute();

if (empty($email) || empty($pass))
{
throw new \Exception('empty', 405);
}

$sql = $this->_database->prepare('SELECT email FROM users WHERE email=?', array($email))->execute()->fetchAllAssoc();

if ($sql == null)
{
throw new \Exception('email', 405);
}

$sqlPass = $this->_database->prepare('SELECT pass FROM users WHERE email=?', array($email))->execute()->fetchAllAssoc();

foreach ($sqlPass as $value)
{
foreach ($value as $hash)
{
$verify = password_verify($pass, $hash);

if ($verify == true)
{
$sqlActive = $this->_database->prepare('SELECT active FROM users WHERE email=?', array($email))->execute()->fetchAllAssoc();

foreach ($sqlActive as $val)
{
foreach ($val as $active)
{
if ($active == 'no')
{
throw new \Exception('active', 405);
}
}
}

$this->_database->prepare('USE session')->execute();

$id = $this->_app->getSession()->getSessionId();

$this->_database->prepare('UPDATE sess SET email = ? WHERE sess_id = ?', array($email, $id))->execute();

$this->_app->getSession()->setSessionData('logged');

$this->_app->getSession()->saveSessionData();

throw new \Exception('ok', 200);
}
else
{
throw new \Exception('pass', 405);
}
}
}
}

public function html()
{
$arr = $this->_config->getConfigFile('htmlArr');

return $arr;
}
}
[/php]
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 347
Bonus: 692
Мнения: 2612
Мнение 15/03/2018 11:17 am      Отговорете с цитат


Как load-ваш класовете (инклудваш файловете)?

Може би е вече късно, защото искаш да ползваш системката, която си си написал, но този начин на хвърляне на ексепшъни дори и за неща, които не са грешка е много грешен. Ползвай булеви изрази за връщане и разбий дългите (големи методи) на по-малки, които да вършат само един task с return type bool.

Последната промяна е направена от Fakeheal на 15/03/2018 11:23 am; мнението е било променяно общо 2 пъти
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 81
Bonus: 174
Мнения: 1644
Мнение 15/03/2018 11:20 am      Отговорете с цитат


С dependency injection container.

Благодаря за съвета, за напред ще го имам на предвид, но за този сайт вече няма за кога да го пренаписвам.

Последната промяна е направена от teroristd на 15/03/2018 11:34 am; мнението е било променяно общо 1 път
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 347
Bonus: 692
Мнения: 2612
Мнение 15/03/2018 11:24 am      Отговорете с цитат


teroristd написа:
С dependency injection container.


LoginModel->run() къде се вика?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 81
Bonus: 174
Мнения: 1644
Мнение 15/03/2018 11:27 am      Отговорете с цитат


Fakeheal написа:
teroristd написа:
С dependency injection container.


LoginModel->run() къде се вика?


В контролера.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 81
Bonus: 174
Мнения: 1644
Мнение 15/03/2018 12:41 pm      Отговорете с цитат


Значи тази сесия която идва от модела $_SESSION['tokenLogin'] си съществува. Дали е възможно да презаписва другата защото тя изчезва след като извикам модела?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Fakeheal
Support
Support

Регистриран на: 17/04/2010 8:37 am

Support: 347
Bonus: 692
Мнения: 2612
Мнение 15/03/2018 2:43 pm      Отговорете с цитат


teroristd написа:
Значи тази сесия която идва от модела $_SESSION['tokenLogin'] си съществува. Дали е възможно да презаписва другата защото тя изчезва след като извикам модела?


session_start трябва да го викаш смао веднъж при изпълнение на скрипт.

намери някъде другаде къде да го сложиш
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 81
Bonus: 174
Мнения: 1644
Мнение 15/03/2018 3:17 pm      Отговорете с цитат


Еми само един път имам в модела.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
1234
Страница 1 от 4


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети