[PHP] Loginscript met classes en sessie/userId

Status
Niet open voor verdere reacties.

Woutertjuh88

Terugkerende gebruiker
Lid geworden
20 nov 2005
Berichten
3.532
Goede morgen!

Ik ben bezig om een klein cms aan het maken en hiervoor moet er uiteraard ingelogd worden om de pagina's te kunnen wijzigen.

Het probleem is alleen dat ik met classes wil werken en ik heb in meerdere classes het userId nodig.

Normaal gebruik je een $_SESSION om daarin je een userId in op te slaan, welke je later weer oproept.

Helaas kun je een $_SESSION niet buiten de class benaderen.

Wat ik dus wil is:
Ik heb een inlogpagina die gekoppeld is aan de login class.
Hier wordt de gebruikersnaam en het wachtwoord gecontroleerd en vervolgens moet ik hier een userId gaan opslaan die ik in meerdere classes(pagina, admin enz enz.) wil gebruiken.

Weet iemand een manier om dus de userId op te slaan, zodat ik deze kan gebruiken in meerdere classes?
 
Er zijn meerdere methoden om dit te doen. De meest simepel methode is door in elke functie waar je de varriabele wilt gebruiken "globel $_SESSION['username']" te plaatsen.
Je kunt ook lastig gaan doen door elke keer de varriabale mee te geven ;)
Je kunt ook elke keer die (en andere) varriabelen ophalen, dit kun je doen door gebruik te maken van een Singleton Pattern: Read food: http://en.wikipedia.org/wiki/Singleton_pattern

Je hebt dan één classe waar je alle variabelen in opslaat, welke zichzelf aanroept als je hem aanroept. Die instance die hij "zelf" aanroept, bevat elke keer dezelfde informatie. Op die manier worden o.a. Error classes gemaakt, MySQL classes, en eeh... je kunt er dus ook een variabelen opsla classe van maken :)

http://php.net/manual/en/language.oop5.patterns.php

Gegroet,
Jeffrey
 
Na wat lezen van jouw leesvoer, heb ik de oplossing! :D Mocht ook wel na een aantal dagen lang zoeken! :D Bedankt!

Ik was al bezig om een eigen class te maken voor de sessie, maar deed al mijn functies binnen die class 'public' en die moesten 'static' worden...
Had ik kunnen weten natuurlijk! *Geeft zichzelf een klap op zijn hoofd!*

Login:
PHP:
<?php
class LoginController{
	function __construct(){
		$this->Smarty 		= new Smarty();
		$this->DbManager	= new DatabaseManager();
		$this->Sessions		= new Sessions();
		$this->User			= new UserController();
		
		$this->Smarty->assign("javascript", "<script type='text/javascript' src='http://".$_SERVER['HTTP_HOST']."/public_html/javascript/login.js'></script>");
		
		Config::host();
		Config::keywords();
		Config::description();
	}
	
	function index(){
		$this->Smarty->assign("content", $this->Smarty->fetch("Login/index.html"));
		return $this->Smarty->fetch("main.html");
	}
	
	function inloggen(){		
		if(isset($_POST) && isset($_POST["gebruikersnaam"]) && ($_POST["gebruikersnaam"]!= "")){
			$users = new Users();
			$users->gebruikersnaam 	= $_POST["gebruikersnaam"];
			$users->wachtwoord 		= md5($_POST["wachtwoord"]);
			
			$login = $this->DbManager->checkLogin($users);
			if($login[0] == true && $login[1] > 0){
				$user = new Users();
				$user = $this->DbManager->select($user, $login[1]);
				if($user[0]->actief == 1){
					//gooi de data in een sessie	
					$this->Sessions->nieuw("user_id",   $user[0]->id);
					$this->Sessions->nieuw("user_name", $user[0]->gebruikersnaam);
					$this->Sessions->nieuw("user_type", $user[0]->type);

					$this->Smarty->assign("user_id", 	$_SESSION["user_id"]);
					$this->Smarty->assign("user_name", 	$_SESSION["user_name"]);
					$this->Smarty->assign("user_type", 	$_SESSION["user_type"]);
					$this->Smarty->assign("content", 	$this->Smarty->fetch("User/index.html"));
				}else{
					$this->Smarty->assign("melding", 	"Gebruikersnaam en/of wachtwoord klopt niet. <br /> Weet u zeker dat dit wel klopt? Neem dan contact op met de beheerder van de website.");
					$this->Smarty->assign("content", $this->Smarty->fetch("Login/index.html"));
				}
			}else{
				$this->Smarty->assign("melding", 	"Gebruikersnaam en/of wachtwoord klopt niet. <br /> Weet u zeker dat dit wel klopt? Neem dan contact op met de beheerder van de website.");
				$this->Smarty->assign("content", $this->Smarty->fetch("Login/index.html"));
			}
		}else{
			$this->Smarty->assign("melding", 	"U moet ingelogd zijn om deze pagina te zien.");
			$this->Smarty->assign("content", $this->Smarty->fetch("Login/index.html"));
		}
		return $this->Smarty->fetch("main.html");
	}
}
?>

user:
PHP:
<?php 
class UserController{
	function __construct(){
		$this->Smarty 		= new Smarty();
		$this->DbManager	= new DatabaseManager();
		$this->Sessions		= new Sessions();
		
		$this->Sessions->sessionStart();
		
		Config::host();
		Config::keywords();
		Config::description();
	}
	
	function index(){		
		if($_SESSION["user_type"] == 1){
			//beheerder
			$this->Smarty->assign("user_name", $_SESSION["user_name"]);
			$this->Smarty->assign("content", $this->Smarty->fetch("User/beheerder/index.html"));
		}elseif($_SESSION["user_type"] == 2){
			//medewerkers
			$this->Smarty->assign("user_name", $_SESSION["user_name"]);
			$this->Smarty->assign("content", $this->Smarty->fetch("User/medewerker/index.html"));
		}else{
			$this->Smarty->assign("melding", "U moet ingelogd zijn om deze pagina te zien.");
			$this->Smarty->assign("content", $this->Smarty->fetch("Login/index.html"));
		}
		return $this->Smarty->fetch("main.html");
	}
}
?>

sessions:
PHP:
<?php
class Sessions{
	function __construct(){
		
	}
	
	static function sessionTime($tijd){
		session_cache_expire($tijd);
	}
	
	static function sessionStart(){
		session_start();
	}
	
	static function nieuw($naam, $inhoud){
		$_SESSION[$naam] = $inhoud;
	}
	
	static function getsession($naam){
		return $_SESSION[$naam];
	}

	static function wijzig($naam, $inhoud){
		if(isset($_SESSION[$naam])){
			$_SESSION[$naam] = $inhoud;
		}else{
			echo "Sessie(".$naam.") bestaat niet.";
		}		
	}
	
	static function deleteName($naam){
		if(isset($_SESSION[$naam])){
			unset($_SESSION[$naam]);
		}else{
			echo "Sessie(".$naam.") bestaat niet.";
		}	
	}
}
?>
 
Hallo Woutertjuh88,

Blij dat het gelukt is :)

Als ik zo vrij mag zijn, zou ik graag van tips geven op je code. De classen zien er allemaal netjes uit, daarvoor hulde ;) Ook is de code zoals men mag verwachten van een goede programeur.

wellicht kun je wat met de tips, wellicht weet je ze al of heb je ze al opgemerkt :)

Session class:
Je gebruikt een aparte functie om de session te starten. Echter, zoals je vast weet moet session_start() aangeroepen zijn om "$_SESSION" te kunnen laten werken. Je zou dus in plaats van een apparte functie sessionStart(), de session_start() gewoon in de constructor kunnen zetten. Voordeel is dat je zult vergeten om die aan te roepen ;)

Session::wijzig / nieuw zijn "exact" hetzelfde. Ze setten beide de informatie in een (nieuwe / of bestaande) session. Behalve dat bij wijzig de sessie daadwerkelijk moet bestaan.
Gezien wijzig hetzelfde is als nieuw (met een extratje) zou ik nieuw vervangen voor "setsession / set" en "wijzig" vervangen voor puur een "exists" check. Ik neem dan wel aan dat het niet belangrijk is dat wijzig echt puur wijzigd als het al bestaat...

Als je met grotere classes gaat werken, is het ook aan te raden bij een taal te blijven (NL of EN) :)


UserController::index()
om warnings tegen te gaan, zou ik nog een isset om $_SESSION["user_type"] zetten :) en een check doen of user_name bestaat.

LoginController::inloggen()
als "isset($_POST["gebruikersnaam"])" true is, dan is "isset($_POST)" ook true. Je kunt eventueel de check op isset($_POST) weglaten.

$this->DbManager->checkLogin($users) --> Zorg ervoor dat de $users ge-mysql_real_escape_string() wordt. zodat SQL injection niet mogelijk is (wellicht heb je dat al :))

Je gebruikt $_SESSION["iets"] zoals het hoord, gewoon in de code. Maar je hebt in de classe Sessions een functie getsessions --> wellicht een beetje overbodig :)?

Succes met je script!
Jeffrey :thumb:
 
Tips zijn altijd welkom! :D
Session class:
Je gebruikt een aparte functie om de session te starten. Echter, zoals je vast weet moet session_start() aangeroepen zijn om "$_SESSION" te kunnen laten werken. Je zou dus in plaats van een apparte functie sessionStart(), de session_start() gewoon in de constructor kunnen zetten. Voordeel is dat je zult vergeten om die aan te roepen ;)
Ohw ja! :D Heb hem aangepast!
Session::wijzig / nieuw zijn "exact" hetzelfde. Ze setten beide de informatie in een (nieuwe / of bestaande) session. Behalve dat bij wijzig de sessie daadwerkelijk moet bestaan.
Gezien wijzig hetzelfde is als nieuw (met een extratje) zou ik nieuw vervangen voor "setsession / set" en "wijzig" vervangen voor puur een "exists" check. Ik neem dan wel aan dat het niet belangrijk is dat wijzig echt puur wijzigd als het al bestaat...
Dat is wel qua code netter/overzichtelijker. Ga ik aanpassen!
Als je met grotere classes gaat werken, is het ook aan te raden bij een taal te blijven (NL of EN) :)
Ook hier heb je gelijk in, vraag me nu af waarom ik 2 talen door elkaar gebruik. Ga ik aanpassen!
UserController::index()
om warnings tegen te gaan, zou ik nog een isset om $_SESSION["user_type"] zetten :) en een check doen of user_name bestaat.
Is inderdaad verstandig! Heb hem aangepast!
LoginController::inloggen()
als "isset($_POST["gebruikersnaam"])" true is, dan is "isset($_POST)" ook true. Je kunt eventueel de check op isset($_POST) weglaten.
Je hebt gelijk! Heb het weggehaald!
$this->DbManager->checkLogin($users) --> Zorg ervoor dat de $users ge-mysql_real_escape_string() wordt. zodat SQL injection niet mogelijk is (wellicht heb je dat al :))
Daar had ik inderdaad aangedacht! Die zit er al in! :D
Je gebruikt $_SESSION["iets"] zoals het hoord, gewoon in de code. Maar je hebt in de classe Sessions een functie getsessions --> wellicht een beetje overbodig :)?
Ik zie het! Inderdaad overbodig!
 
Tips zijn altijd welkom! :D

Ohw ja! :D Heb hem aangepast!

Dat is wel qua code netter/overzichtelijker. Ga ik aanpassen!

Ook hier heb je gelijk in, vraag me nu af waarom ik 2 talen door elkaar gebruik. Ga ik aanpassen!

Is inderdaad verstandig! Heb hem aangepast!

Je hebt gelijk! Heb het weggehaald!

Daar had ik inderdaad aangedacht! Die zit er al in! :D

Ik zie het! Inderdaad overbodig!

Heerlijk als iemand me gelijk geeft hehehehe! :thumb:
 
Waarom zou ik tips gaan afkraken als je gelijk hebt :D
Ben alleen maar blij met tips :D
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan