php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 20.03.2007, 19:14  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard Session in Session

Hallo ihr,

klingt zunächst komisch, aber lasst mich kurz erklären.
Ich wurde heute gefragt, ob ich nicht innerhalb eines Frameworks eine
kleine Erweiterung schreiben kann. Soweit so gut. Der Code ist dabei
diesmal nicht das Problem, vielmehr bin ich mir nicht sicher, wie man
das innerhalb eines Frameworks macht. Wohl möglich - sogar ziemlich
sicher - werden dort schon Session gestartet. Darf man nun innerhalb
einer Funktion einfach eine neue Session starten? Oder wie läuft das
genau? Reicht so etwas wie

Code:
if(!is_array($_SESSION)) {
	session_start();
}
? Zu dem Zeitpunkt war keine Session gestartet worden, so dass ich
mit session_start() angefangen bin, allerdings bin ich mir nicht sicher,
ob das so eine gute Idee ist. Kann mir da mal jemand was zu sagen?

Grüße
Tine
tinchen ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 20.03.2007, 19:50  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von tinchen
Darf man nun innerhalb einer Funktion einfach eine neue Session starten?
Jein. Theoretisch darfst du eine Session überall starten, wo du willst, allerdings darf da vorher absolute keine und wirklich keine Aussage statt gefunden habe. Setz dich doch erstmal mit dem Framework auseinander, ob die nicht bereits ein Session-Handler haben, anstatt eine Session selbstständig zu starten Denn: Ob du es darfst, ist auch eine Frage des Framework-Konzepts

Zitat:
Zitat von tinchen
Oder wie läuft das
genau? Reicht so etwas wie
Wieso nicht gleich
Code:
(!isset($_SESSION))
?

Würde wirklich erstmal vorschlagen: Schau, ob das Framework ein Session-Handler anbietet und benutzt den dann.
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 20.03.2007, 21:07  
Erfahrener Benutzer
 
Registriert seit: 27.08.2007
Beiträge: 391
jens76 befindet sich auf einem aufstrebenden Ast
Standard

soweit wie ich frameworks kenne werden die session da meißt in internen variablen gehandhabt

mei mojavi ist das zb $user
jens76 ist offline  
Alt 20.03.2007, 21:29  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard

Ich habe ein wenig mehr recherchiert und herausgefunden, dass es keinen
Session Handler gibt. Die Möglichkeit danach zu suchen hat sich erst mit deinem
Suchwort Session Handler ergeben. Das einzige was ich jetzt noch in Erfahrung
bringen konnte ist, dass die Session global gestartet wird.
Code:
session_name( md5( $live_site ) );
session_start();
Wenn ich das einfach ausführe kann ich meine Var da auch anhängen. Allerdings
kann ich damit dann nichts übergeben, da in der anderen Funktion die Session
nicht zur Verfügung steht. Auch Versuche mit
Code:
global $_SESSION;
sind nicht besonders eingeschlagen. Wie kann man da drankommen?
Ich kann doch nicht in jeder Funktion die Session starten oder ist das kein
Problem? Irgendwie sehr merkwürdig, weitere Informationen zur Sessionverwaltung
liefert auch die API des Frameworks nicht. Ja, nun steh ich da...
tinchen ist offline  
Alt 20.03.2007, 21:37  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo tinchen,

wie bereits schon geschrieben wurde implementieren die meißten (guten) Frameworks einen Session-Handler, der irgendwo im Code aufgerufen und instanziiert werden kann, solange noch keine Ausgabe in PHP getätigt wurde. MVC-Frameworks bauen ohnehin erst den kompletten PHP-Code zusammen und geben diesen zum Schluss per echo aus. Ist das bei dir auch der Fall, so kannst du das genauso machen.

Solltest du Anregungen für eine Implementierung suchen, sag mir Bescheid, dann kann ich mal ein Beispiel für Implementierung und Verwendung posten, da ich selbs soetwas einsetze. Hintergrund ist wie immer Abstraktion, sprich ich muss mich nicht mehr um das session_start() kümmern, sondern kann wo ich will im Code Sessions lesen und beschreiben.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 20.03.2007, 21:40  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

$_SESSION ist sogar superglobal, ebenso wie die gesamte Session an sich: Entweder sie läuft, oder sie läuft nicht. ^^ Da sollte man immer dran kommen, wenn die Session läuft.

Ich kann mir aber wirklich nicht vorstellen, dass das Framework keine eigene Session-Verwaltung besitzt. Ist das Framework öffentlich? Wenn ja, gibts nen Link?

PS: Wenn die Session global gestartet wird, solltest du es vermeiden sie selbst noch mal zu starten.
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 21.03.2007, 10:13  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard

Morgen, ich habe die ganze Nacht das Frameset durchgearbeitet und nun festgestellt,
dass wohl möglich im Frontend gar keine Session gestartet wird. In der index.php
befindet sich vor dem Setzen der header() die Funktion
Code:
$mainframe->initSession();
Inhalt der betreffenden Funktion sieht so aus:

Code:
	/**
	* Initialises the user session
	*
	* Old sessions are flushed based on the configuration value for the cookie
	* lifetime. If an existing session, then the last access time is updated.
	* If a new session, a session id is generated and a record is created in
	* the jos_sessions table.
	*/
	function initSession() {
		// initailize session variables
		$session 	=& $this->_session;
		$session 	= new mosSession( $this->_db );
		
		// purge expired sessions
		$session->purge('core');

		// Session Cookie `name`
		$sessionCookieName 	= mosMainFrame::sessionCookieName();
		// Get Session Cookie `value`
		$sessioncookie 		= strval( mosGetParam( $_COOKIE, $sessionCookieName, null ) );
		
		// Session ID / `value`
		$sessionValueCheck 	= mosMainFrame::sessionCookieValue( $sessioncookie );

		// Check if existing session exists in db corresponding to Session cookie `value` 
		// extra check added in 1.0.8 to test sessioncookie value is of correct length
		if ( $sessioncookie && strlen($sessioncookie) == 32 && $sessioncookie != '-' && $session->load($sessionValueCheck) ) {
			// update time in session table
			$session->time = time();
			$session->update();
		} else {
			// Remember Me Cookie `name`
			$remCookieName = mosMainFrame::remCookieName_User();
			
			// test if cookie found
			$cookie_found = false;
			if ( isset($_COOKIE[$sessionCookieName]) || isset($_COOKIE[$remCookieName]) || isset($_POST['force_session']) ) {
				$cookie_found = true;
			}
			
			$session->jaclplus	= jaclplusDefaultAL(); //'0';
			// check if neither remembermecookie or sessioncookie found
			if (!$cookie_found) {
				// create sessioncookie and set it to a test value set to expire on session end
				setcookie( $sessionCookieName, '-', false, '/' );				
			} else {
			// otherwise, sessioncookie was found, but set to test val or the session expired, prepare for session registration and register the session
				$url = strval( mosGetParam( $_SERVER, 'REQUEST_URI', null ) );
				// stop sessions being created for requests to syndicated feeds
				if ( strpos( $url, 'option=com_rss' ) === false && strpos( $url, 'feed=' ) === false ) {
					$session->guest 	= 1;
					$session->username 	= '';
					$session->time 		= time();
					$session->gid 		= 0;
					// Generate Session Cookie `value`
					$session->generateId();
					
					if (!$session->insert()) {
						die( $session->getError() );
					}
					
					// create Session Tracking Cookie set to expire on session end
					setcookie( $sessionCookieName, $session->getCookie(), false, '/' );
				}				
			}

			// Cookie used by Remember me functionality
			$remCookieValue	= strval( mosGetParam( $_COOKIE, $remCookieName, null ) );
			
			// test if cookie is correct length			
			if ( strlen($remCookieValue) > 64 ) {
				// Separate Values from Remember Me Cookie
				$remUser	= substr( $remCookieValue, 0, 32 );
				$remPass	= substr( $remCookieValue, 32, 32 );
				$remID		= intval( substr( $remCookieValue, 64  ) );

				// check if Remember me cookie exists. Login with usercookie info.
				if ( strlen($remUser) == 32 && strlen($remPass) == 32 ) {
					$this->login( $remUser, $remPass, 1, $remID );
				}
			}
		}
	}
Ich würde sagen, da wird gar keine Session gestartet, sondern lediglich in
DB und Cookie verwaltet. Im Administrationsbereich findet sich dann auch ein
session_start im Frontend nicht.

Nun bin ich hergegangen und habe in die index.php über der header() def geschrieben:
Code:
session_name( md5( $live_site ) );
session_start();
$_SESSION['session_userstate'] 		= array();
So wie es in der Administration auch gemacht wurde und siehe da es funktioniert.
Allerdings bin ich mir überhaupt nicht sicher, ob das so eine gute Idee ist, dass zu
machen, muss ich noch etwas beachten? Darf die Session genauso heißen wie
im Backend oder gibt das Probleme? [Wahrscheinlich gar nicht so ohne Code Kenntnis
zu beantworten]

Rückfragen oder Anregungen? Immer her damit.

Grüße
Tine
tinchen ist offline  
Alt 21.03.2007, 12:56  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Tinchen,

welchen Code verwendest du hier? Ist das ein fertiges Framework?

Grundsätzlich sollte man Session-Handling kapseln (wie bereits beschreiben) und das init-Zeug sollte selbständig dafür sorgen, dass eine Session angelegt wird.

Sessions dürfen natürlich im FE und BE gleich heißen, lediglich der Inhalt sollte unterschiedlich sein, da höchstwahrscheinlich unterschiedliche Inhalte benötigt werden.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 21.03.2007, 15:43  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Und nochmal: Kann man in Link zum Framework zum Framework bekommen?

Und auch noch mal: Es kann eh immer nur eine Session gleichzeitig laufen, weswegen der Session-Bezeichner auch gleich lauten sollte
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 21.03.2007, 15:49  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard

Zitat:
welchen Code verwendest du hier? Ist das ein fertiges Framework?
Ja, das ist der Code aus dem CMS Framework. Allerdings ist der schon ein
paar jährlichen alt. Es wird gerade ein neues Framework erstellt, dass befindet sich
allerdings im Beta Stadium.

Nun ich habe mir das alles sehr genau angesehen und möchte mal sagen, dass im
Frontend gar keine Session gestartet wird. Die Daten werden in einem Cookie und
in der DB in der Tabelle sessions geschrieben. Mehr passiert da nicht. Alle Versuche
mit var_dump($_SESSION) schlagen im Frontend auch fehl. Lediglich ein Hinweis,
dass die Variable nicht bekannt ist und NULL. Also keine Session im Frontend, denn
die müsste ja superglobal zur Verfügung stehen, da ist aber nichts.

Mein Problem ist nun, ob ich das mit der Session einfach so machen kann. Ich denke
die Entwickler werden sich etwas dabei gedacht haben und ich bin mir derzeit nicht
wirklich sicher, ob das Starten der Session im Frontend ggf. Sicherheitslücken etc.
verursachen könnte. Wenn ich die Session selbst starte, steht auf jeden Fall die
Session auch global zur Verfügung. Das mit dem Kapseln kann ich so noch
nicht nachvollziehen, was soll das genau bedeuteten?

Es gibt derzeit nur ein API für die Beta, so merkwürdig das klingt.
Ich schau mich noch einmal um, ob ich da etwas finde.
Die API für das CMS findet sich hier: http://api.joomla.org/
Allerdings ist das für die kommende beta und nicht für die aktuelle
Version. Zudem ist der Code in den 1.0.x Versionen eher mittelmäßig,
aber schau es dir an, dort kannst du auch das ganze Paket downloaden,
allerdings weiß ich nicht, ob sich da eine Einarbeitung lohnt.

Gruß
Tine
tinchen ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Session Problem karina_02 PHP Tipps 2008 6 18.05.2008 22:37
Problem bei session Lifetime Cyberbob_at_tot PHP Tipps 2007 5 05.06.2007 17:47
session nach seitenwechsel leer... GELight PHP Tipps 2006 8 17.09.2006 15:17
Session Logout Login Navigation TailerD PHP Tipps 2006 10 24.06.2006 17:12
session array Timo Trallala PHP Tipps 2006 18 22.04.2006 13:45
Frage zur Anwendung einer Session mehrfach... GELight PHP Tipps 2006 10 12.03.2006 16:47
[Erledigt] php session problem :( PHP Tipps 2005-2 5 21.10.2005 16:37
Session abschaltbar?? Probleme mit Objekten in Session! becks123 PHP-Fortgeschrittene 3 19.09.2005 15:47
Session wird nicht angelegt PHP Tipps 2005-2 7 24.07.2005 13:35
Kreieren einer Session PHP Tipps 2005 11 28.05.2005 15:16
Session error nach Umstellung auf PHP 5 PHP Tipps 2005 15 13.05.2005 14:35
verliere Session Sonja PHP Tipps 2005 3 27.04.2005 09:32
Session Problem PHP-Fortgeschrittene 3 18.02.2005 14:37
[Erledigt] Formulardaten in einer Session speichern, per Link übergeben PHP Tipps 2004-2 2 29.12.2004 15:47
[Erledigt] Hilfe...PhpBB Session Problem!! PHP Tipps 2004-2 2 15.12.2004 18:28

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php login framework sessions, session login framework php, formulardaten an session vor bekannt geben, php \get session cookie\, / / setcookie ($ sessioncookiename, \'-\', false, \'/\');, if session, phpbb purge session

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:40 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.