класс не сохраняет защищенные значения

Я просмотрел существующие ответы на мою проблему.

Я повторил значение прямо через процесс и вплоть до инструкции «header («Местоположение»), значения остаются нетронутыми.

Я не думаю, что это проблема сериализации, как предлагается для подобных проблем...

Вот соответствующие биты класса:

class clsSetUser {
  protected $UserID = 0;

  public function initUser($id) {
     // get user details from database

     $this->setUserID($id);
     // etc...
  }

  private function setUserID($value) { $this->UserID = $value; }
  public function getUserID() { return $this->UserID; }
}

общий.php:

if(unset($clsUser)) $clsUser = new clsSetUser;

логин-exec.php:

$clsUser->initUser($id);   

header("Location: somewhere.php");

где-то.php:

echo $clsUser->getUserID();

// here it equals 0

Любые идеи? сериализует ли «заголовок» все?


person Jane Alford    schedule 23.06.2013    source источник


Ответы (1)


Это потому, что PHP фактически начинается с чистого листа в somewhere.php.

header("Location: somewhere.php"); отправляет команду браузеру подключиться к другой странице. На этой странице ни одна из переменных предыдущей страницы не доступна в PHP.

Вам нужно установить userId в $_SESSION, чтобы вы могли перезагрузить пользователя из базы данных, когда он посещает somewhere.php.

логин-exec.php

$clsUser->initUser($id);   
$_SESSION['user_id'] = $id;
header("Location: somewhere.php");

где-то.php

$clsUser->initUser($_SESSION['user_id']);
person EWit    schedule 23.06.2013
comment
Взрыв - я надеялся избежать слишком частого использования $_SESSION. Нелогично обращаться к базе данных каждый раз, когда я открываю новую страницу. Спасибо за информацию. - person Jane Alford; 23.06.2013
comment
Почему вы хотите избежать попадания в базу данных для пользовательского объекта? Если таблица пользователя/сеанса правильно проиндексирована, получение пользовательского объекта не займет много времени. В противном случае вы можете попробовать сохранить необходимую информацию о пользователе в файле cookie, но тогда эти данные будут передаваться на сервер при каждом запросе. Что может увеличить время загрузки страницы. - person EWit; 23.06.2013
comment
Это не просто пользовательский объект, это объект базы данных и различные значения, которые никогда не меняются и поступают из ini-файла. Все это требует дополнительного времени обработки и должно выполняться только один раз. У меня есть ОЧЕНЬ большое приложение с сотнями страниц. Я надеялся построить полноценную объектно-ориентированную систему, но, очевидно, не на PHP, я не могу этого сделать, если класс уничтожается каждый раз, когда выдается инструкция заголовка... - person Jane Alford; 24.06.2013
comment
Это не просто когда используется инструкция заголовка. Это всякий раз, когда веб-сайт возвращает страницу. PHP не имеет состояния, каждый запрос, который пользователь отправляет на сервер, то есть каждая ссылка, по которой пользователь щелкает, является полностью новым запросом с чистого листа. Я не уверен, над каким проектом вы работаете, но если вам нужно, чтобы он был постоянным, я не уверен, что PHP — это самый простой путь вперед. Возможно, это может дать подсказку: stackoverflow.com/questions/2940610/ - person EWit; 24.06.2013
comment
Я не собираюсь сейчас переделывать на один из языков VB (ASP.NET) или Java. Накладные расходы слишком велики. Мне просто придется использовать $_SESSION. - person Jane Alford; 24.06.2013