2008-12-24 8 views
4

Je suis assez nouveau pour PHP. Quel est le meilleur moyen de contrôler l'accès à une classe dans une application PHP et quel est le meilleur endroit pour stocker ces classes qui devront être accessibles dans toute l'application? Exemple; J'ai une classe d'utilisateur qui est créée au cours du processus de connexion, mais chaque fois que la page affiche qu'il apparaît que l'objet est réinitialisé.PHP Class Scope

J'ai essayé de définir la propriété IsLoggedIn, puis de vérifier cette variable à chaque fois avant de créer à nouveau l'objet, mais cela ne semble pas fonctionner. J'ai également essayé d'utiliser la fonction isSet en PHP pour voir si la variable de classe existe déjà

Répondre

6

Vous avez raison, l'état de votre demande n'est pas reporté de la demande à la demande.

Contrairement aux applications de bureau, les applications web ne resteront pas initialisées parce que le serveur, chaque fois qu'il peut être un autre visiteur, veut quelque chose de complètement différent. Vous savez qui utilise l'application de bureau, mais vous ne savez pas nécessairement qui demande la page. Imaginez 10 utilisateurs qui font des choses différentes simultanément sur votre application web? L'application entière ne fonctionnerait pas nécessairement pour chacun de ces visiteurs. Imaginez avec 10 000 visiteurs ...

Il existe des moyens de conserver certaines données de la demande à la demande. L'application sera réinitialisée à chaque fois, oui, mais vous pourrez alors recharger l'état de ce que vous faisiez. Il tourne toujours autour des mêmes méthodes générales:

  1. Cookies; Les cookies sont un petit fichier qui est conservé du côté client et quel contenu sera disponible sur chaque requête. En PHP, ceci est disponible en utilisant $_COOKIE variable. Dans tous les cas, vous pouvez serialize vos instances de classe et les recharger ensuite. Le problème est que vous ne voudriez pas y mettre des données sensibles car tout corps (malveillant) peut les voir et les modifier.

  2. POST ou GET; Dans chaque requête, vous passez un état dans le $_GET request (l'URL telle que http://localhost/myscript.php?iamatstep=4) ou via un $_POST comme l'utilisation d'un champ de saisie masqué dans un formulaire, ces données peuvent être cryptées et n'ont de sens que pour vous, mais vous êtes toujours Remettre les données sensibles au client et n'importe qui pourrait les manipuler

  3. Base de données, disque ou toute autre chose sur le serveur Encore une fois, vous sérialisez vos données dans un fichier par exemple à la fin d'une requête prête à être L'avantage principal est qu'il reste sur votre serveur. L'inconvénient est qu'à ce stade, vous ne savez pas quelles données extraire pour quelle requête, car il peut y avoir plusieurs utilisateurs sur votre application au niveau du serveur. en même temps...

Et c'est là qu'intervient la notion de $_SESSION. C'est juste une façon emballée d'utiliser tout cela en même temps. Ce n'est pas magique comme souvent c'est perçu par les débutants. Lorsque vous utilisez une session, les données placées dans le $ _SESSION sont stockées quelque part sur le serveur (normalement un fichier dans un répertoire temporaire bien qu'il puisse être changé en quelque chose comme une base de données) et un ID unique est attribué à cette session. dans un cookie qui suivra le visiteur de la demande à la demande. Donc, la seule chose du côté du client est un grand nombre dans le cookie. Sur la prochaine requête, le navigateur indique à PHP sur le serveur que c'est le numéro de session 12345, charge le fichier correspondant s'il existe et que les données sont à nouveau disponibles. Si les cookies ne sont pas activés, ils peuvent être transmis dans un GET ou un POST, bien qu'il soit souvent préférable de ne pas y aller (voir session.use_trans_sid's note).

Il semble souvent que sur chacune de vos pages vous avez besoin d'authentification.

<?php 

// verify if we have a current session 
if (isset($_SESSION['login'])) { 
    // get data in current session 
    $username = $_SESSION['login']['username']; 
    $isLoggedIn = $_SESSION['login']['isLoggedIn']; 
} else { 
    $username = ''; 
    $isLoggedIn = false; 
} 

// take care of the unauthorized users 
if (!$isLoggedIn) { 
    // maybe a redirection here... 
} 

// do the things a logged in users has the permission to do 

Et pour régler la session, il regardera probablement comme ça:

<?php 

// handle the form post of your login page for example 
if (isset($_POST['username']) && isset($_POST['password'])) { 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    // verify the username and password against a database 
    if ($everythingIsOkay) { 
    // we can consider this user logged in and create a session 
    $_SESSION['login']['username'] = $username; 
    $_SESSION['login']['isLoggedIn'] = true; 
    // and now maybe redirect the user to the correct page 
    } 
} 
// raise an error about an invalid login 

Et enfin, peut-être une page qui logout.php quelque chose comme ça:

<?php 

unset($_SESSION['login']); 
// redirect the user to the login page 
2

Ce type de données va devoir être stocké dans une session, la seule chose qui est transportée de page en page est Session data (sessions/cookies/...) afin que votre initialisation de classe ne soit pas reportée.

Vous pouvez ajouter des informations comme les utilisateurs nom d'utilisateur pour la session avec:

$username //username from db 
$name //name from db 
$_SESSION['username'] = $username; 
$_SESSION['name'] = $name; 

ou si vous voulez juste d'avoir un accès facile à toutes les informations sur l'utilisateur que vous pouvez faire:

$_SESSION['user'] = mysql_fetch_assoc($result); //where $result is the response from the db to your login query 

après avoir fait cela $ _SESSION ['user'] sera un tableau avec tous les détails que vous avez sélectionnés dans la base de données.