Nastavení unikátní session proměnné

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
James
Člen | 54
+
0
-

Ahoj,

potřebuji vytvořit aplikaci, kde se při každém spuštění vytvoří unikátní session proměnná tak, aby když se aplikace spustí vícekrát za sebou existovali session proměnné nezávisle na sobě.

Nevím jestli s těmito proměnnými pracuji tak jak by se správně mělo.
Vytvářím si vždy sessionManager pracující jako model

<?php

namespace Model;

use Nette;


/**
 * Session management.
 */
class SessionManager extends Nette\Object
{
	const SECTION = 'database';

	/** @var Session variable */
	private $session;

	/** @var Section variable */
	private $section;


	/**
	 * @param Nette\Http\Session $session
	 */
	public function __construct(Nette\Http\Session $session)
	{
		$this->session = $session;
		$this->section = $this->session->getSection(self::SECTION);
	}


	/**
	 * Table name setter
	 * @param String $table
	 */
	public function setTable($table)
	{
		$this->section->table = $table;
	}


	/**
	 * Table name getter
	 * @param String $table
	 */
	public function getTable()
	{
		return $this->section->table;
	}


	/**
	 * Server setter
	 * @param String $server
	 */
	public function setServer($server)
	{
		$this->section->server = $server;
	}


	/**
	 * Server name getter
	 * @return String $server
	 */
	public function getServer()
	{
		return $this->section->server;
	}


	/**
	 * Database setter
	 * @param String $database
	 */
	public function setDatabase($database)
	{
		$this->section->database = $database;
	}


	/**
	 * Database name getter
	 * @return String $database
	 */
	public function getDatabase()
	{
		return $this->section->database;
	}


	/**
	 * Database port setter
	 * @param int $port
	 */
	public function setPort($port)
	{
		$this->section->port = $port;
	}


	/**
	 * Database port getter
	 * @return int $port
	 */
	public function getPort()
	{
		return $this->section->port;
	}


	/**
	 * Username setter
	 * @param String $user
	 */
	public function setUser($user)
	{
		$this->section->user = $user;
	}


	/**
	 * Username getter
	 * @return String $user
	 */
	public function getUser()
	{
		return $this->section->user;
	}


	/**
	 * Password setter
	 * @param String $pass
	 */
	public function setPass($pass)
	{
		$this->section->pass = $pass;
	}


	/**
	 * Password getter
	 * @return String $pass
	 */
	public function getPass()
	{
		return $this->section->pass;
	}


	/**
	 * DSN record getter
	 * @return String $dsn
	 */
	public function getDsn()
	{
		if($this->getPort() == NULL) {
			return 'mysql:host='.$this->getServer().';dbname='.$this->getDatabase();
		} else {
			return 'mysql:host='.$this->getServer().';port='.$this->getPort().';dbname='.$this->getDatabase();
		}
	}
}

který si vždy injectuji do příslušného presenteru, kde potřebuji mít přístup k session proměnným.

class ConnectionPresenter extends BasePresenter
{
	/** @var Model\SessionManager */
	private $sessionMan;


	public function __construct(Model\SessionManager $sm)
	{
		$this->sessionMan = $sm;
	}
}

a potom tam kde potřebuji něco do session uložit zavolám odpovídající metodu

$this->sessionMan->setServer('server');

a ve výsledku, když se snažím v jedné spuštěné aplikaci něco do session uložit, tak to proběhne v pořádku. Ovšem při dalším spuštění nové aplikace, když se také snažím něco do této proměnné uložit, se mi původní hodnoty z prvního spuštění aplikace přemažou.

Díky za případné rady.

Šaman
Člen | 2668
+
0
-

No a kde vytváříš ten unikátní klíč? Session slouží k udržování proměnné napříč requesty, takže je logické, že při dalším spuštění přepisuješ stará data. Jestli je chceš unikátní, tak si v tom konstruktoru musíš vytvořit unikátní klíč jako název sekce (ale pak taky dořešit jak se k té unikátní sekci příště dostat).

Resp. čemu říkáš aplikace spustí vícekrát za sebou? On se spustí při každém requestu, tj. při každém obnovení, při každém kliku na interní odkaz, při každém odeslání formuláře apod. Ale pro každého uživatele (ve skutečnosti pro každý prohlížeč, ještě lépe pro každé uložené cookies) máš samostatné session.

James
Člen | 54
+
0
-

Šaman napsal(a):

No a kde vytváříš ten unikátní klíč? Session slouží k udržování proměnné napříč requesty, takže je logické, že při dalším spuštění přepisuješ stará data. Jestli je chceš unikátní, tak si v tom konstruktoru musíš vytvořit unikátní klíč jako název sekce (ale pak taky dořešit jak se k té unikátní sekci příště dostat).

Resp. čemu říkáš aplikace spustí vícekrát za sebou? On se spustí při každém requestu, tj. při každém obnovení, při každém kliku na interní odkaz, při každém odeslání formuláře apod. Ale pro každého uživatele (ve skutečnosti pro každý prohlížeč, ještě lépe pro každé uložené cookies) máš samostatné session.

Právě že ještě nikde nevytvářím, tuším, že se bude muset nějak vytvářet ten unikátní klíč jako název sekce, což nevím jak přesně bych měl realizovat. Moje představa je taková, že když odešlu jeden daný formulář, tak aby po odeslání se vytvořila právě ta unikátní sekce session proměnné, něco jako „přihlášení“ a zanikla po „odhlášení“

Editoval James (2. 1. 2014 16:34)

Šaman
Člen | 2668
+
0
-

Pak si ale budeš muset nejspíš předávat to id session v adrese. Serveru se prohlížeč identifikuje pomocí cookies, takže pokud si otevřeš dvě okna a v jednom se přihlásíš, tak v druhém si aplikace myslí, že už jsi přihlášený a pouze jsi kliknul v tom prvním okně.

Spíš napiš na co to potřebuješ, protože tohle zavání vlastním řešením problému, který při správném přístupu nemusí vůbec nastat. I když samozřejmě možné to je. Jednou ukázkou předávání takového id v session pomocí adresy je parametr fid, tedy id flash zprávy (která je uložená v session).

David Matějka
Moderator | 6445
+
0
-

a uzivatel bude moci onen formular odeslat v jednom prohlizeci vicekrat? ze treba v kazdem panelu budou unikatni? jestli jo, tak budes muset v url prenaset nejakej identifikator ty session sekce.. nebo jeste vic specifikuj, co vlastne chces :)

//edit: pozde

Editoval matej21 (2. 1. 2014 17:07)

James
Člen | 54
+
0
-

Šaman napsal(a):

Pak si ale budeš muset nejspíš předávat to id session v adrese. Serveru se prohlížeč identifikuje pomocí cookies, takže pokud si otevřeš dvě okna a v jednom se přihlásíš, tak v druhém si aplikace myslí, že už jsi přihlášený a pouze jsi kliknul v tom prvním okně.

Spíš napiš na co to potřebuješ, protože tohle zavání vlastním řešením problému, který při správném přístupu nemusí vůbec nastat. I když samozřejmě možné to je. Jednou ukázkou předávání takového id v session pomocí adresy je parametr fid, tedy id flash zprávy (která je uložená v session).

Dělám jednu aplikaci, která se bude schopná připojit na libovolný MySQL server a dělat další operace, které teď nejsou důležité rozebírat. Jde o to, že mám přihlašovací formulář a z odeslaných údajů vytvářím připojení k databázi a také je právě ukládám do zmiňovaných session proměnných. Takže když se v každé spuštěné aplikaci budu chtít připojit k jiné databázi, tak se mi momentálně hodnoty v session přepisují, což je nežádoucí.

David Matějka
Moderator | 6445
+
0
-

jo, v URL budes muset drzet nejakej identifikator, bud nahodnej, nebo dle zadanych udaju, podobne, jako to pouziva adminer, takze budes mit url
....?server=localhost&user=root a v session pro tyto udaje najdes heslo

Editoval matej21 (2. 1. 2014 18:29)