PHP les variables de session ne portant pas sur mon enregistré dans la page, mais l'ID de session est
Je suis en utilisant PHP 4.3.9, Apache/2.0.52
Je vais essayer d'obtenir un système d'ouverture de session de travail qui s'inscrit DB valeurs dans une session où ils sont disponibles une fois connecté. Je perds les variables de session une fois que je suis redirigé.
J'utilise le code suivant pour imprimer l'ID de session/valeurs sur mon formulaire de connexion à la page et de la redirection de la page:
echo '<font color="red">session id:</font> ' . session_id() . '<br>';
echo '<font color="red">session first name:</font> ' . $_SESSION['first_name'] . '<br>';
echo '<font color="red">session user id:</font> ' . $_SESSION['user_id'] . '<br>';
echo '<font color="red">session user level:</font> ' . $_SESSION['user_level'] . '<br><br>';
C'est ce qui est imprimé dans mon navigateur à partir de ma page de connexion (j'ai juste un commentaire de l'en-tête de redirection de l'utilisateur connecté en page). C'est la bonne info venant de ma DB, donc tout est beau à ce point.
session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name: elvis
session user id: 2
session user level: 1
C'est ce qui est imprimé sur mon redirigé/enregistré dans la page (quand je dé-commenter l'en-tête/redirect). ID de Session est la même, mais je n'ai pas de valeurs pour l'individu des variables de session.
session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name:
session user id:
session user level:
J'obtiens les erreurs suivantes:
Undefined index: prenom
Undefined index: user_id
Undefined index: user_level
J'ai un mondial header.php fichier qui ma loggedIN.php ne PAS appeler, si loggedOUT.php - pour porter un toast à la session):
header.php
<?php
ob_start();
session_start();
//if NOT on loggedout.php, check for cookie. if exists, they haven't explicity logged out so take user to loggedin.php
if (!strpos($_SERVER['PHP_SELF'], 'loggedout.php')) {
/*if (isset($_COOKIE['access'])) {
header('Location: www.mydomain.com/loggedin.php');
}*/
} else {
//if on loggedout.php delete cookie
//setcookie('access', '', time()-3600);
//destroy session
$_SESSION = array();
session_destroy();
setcookie(session_name(), '', time()-3600);
}
//defines constants and sets up custom error handler
require_once('config.php');
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
some page layout stuff
Login portion is eventually called via include
footer stuff
Mon loggedIN.php ne fait rien, mais le début de la séance
<?php
session_start();
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
La la logique de mon script de connexion, la clé de la partie, je suis aller chercher de la DB à droite dans $_SESSION (environ à mi-chemin vers le bas):
if (isset($_POST['login'])) {
//access db
require_once(MYSQL);
//initialize an errors array for non-filled out form fields
$errors = array();
//setup $_POST aliases, clean for db and trim any whitespace
$email = mysql_real_escape_string(trim($_POST['email']), $dbc);
$pass = mysql_real_escape_string(trim($_POST['pass']), $dbc);
if (empty($email)) {
$errors[] = 'Please enter your e-mail address.';
}
if (empty($pass)) {
$errors[] = 'Please enter your password.';
}
//if all fields filled out and everything is OK
if (empty($errors)) {
//check db for a match
$query = "SELECT user_id, first_name, user_level
FROM the rest of my sql here, blah blah blah";
$result = @mysql_query($query, $dbc)
OR trigger_error("Query: $query\n<br />MySQL Error: " . mysql_error($dbc));
if (@mysql_num_rows($result) == 1) { //a match was made, OK to login
//register the retrieved values into $_SESSION
$_SESSION = mysql_fetch_array($result);
mysql_free_result($result);
mysql_close($dbc);
/*
setcookie('access'); //if "remember me" not checked, session cookie, expires when browser closes
//in FF you must close the tab before quitting/relaunching, otherwise cookie persists
//"remember me" checked?
if(isset($_POST['remember'])){ //expire in 1 hour (3600 = 60 seconds * 60 minutes)
setcookie('access', md5(uniqid(rand())), time()+60); //EXPIRES IN ONE MINUTE FOR TESTING
}
*/
echo '<font color="red">cookie:</font> ' . print_r($_COOKIE) . '<br><br>';
echo '<font color="red">session id:</font> ' . session_id() . '<br>';
echo '<font color="red">session first name:</font> ' . $_SESSION['first_name'] . '<br>';
echo '<font color="red">session user id:</font> ' . $_SESSION['user_id'] . '<br>';
echo '<font color="red">session user level:</font> ' . $_SESSION['user_level'] . '<br><br>';
ob_end_clean();
session_write_close();
$url = BASE_URL . 'loggedin_test2.php';
header("Location: $url");
exit();
} else {
//wrong username/password combo
echo '<div id="errors"><span>Either the e-mail address or password entered is incorrect or you have not activated your account. Please try again.</span></div>';
}
//clear $_POST so the form isn't sticky
$_POST = array();
} else {
//report the errors
echo '<div id="errors"><span>The following error(s) occurred:</span>';
echo '<ul>';
foreach($errors as $error) {
echo "<li>$error</li>";
}
echo '</ul></div>';
}
} //end isset($_POST['login'])
si je commenter l'en-tête de redirection sur la page de connexion, je peux écho les $_SESSION variables avec la bonne info de la bd. Une fois redirigé vers la page de connexion, cependant, ils sont partis/unset.
Quelqu'un a des idées? J'ai passé presque toute la journée sur ce point et ne peut pas dire que je suis plus proche d'essayer de le comprendre.
BTW, j'ai récemment fait 2 pages de test, on a commencé une session, de définir certaines variables sur elle, a eu la soumission d'un formulaire qui redirigés vers une deuxième page qui n'a rien fait, mais en lecture/sortie de la session de vars. Tout semble bien fonctionner, je suis juste d'avoir des problèmes avec quelque chose que je fais dans mon application principale.
OriginalL'auteur | 2009-01-06
Vous devez vous connecter pour publier un commentaire.
Je ne vois pas
session_start()
dans votre script de connexion. Si vous n'êtes pas le début de la session, je ne pense pas que php va enregistrer toutes les données que vous mettez dans le$_SESSION
tableau. Aussi pour être sûr que j'avais explicitement la place des variables dans la$_SESSION
tableau au lieu de simplement écraser le tout avec$_SESSION = mysql_fetch_array($result);
.4.3.9 est ancienne.
Je suppose que c'est parce que faire $_SESSION = array( ... ) vous ne pas modifier le $_SESSION objet, au lieu de jeter la référence et de la remplacer par quelque chose d'autre. Et oui, 4.3.9 est très ancienne aussi 🙂
OriginalL'auteur Rob Booth
Essayer de faire un
avant la
Aussi. La meilleure façon de l'OMI à faire un script de connexion est: est-ce
Laisser la connexion logique être traitée dans la page d'accueil de l'utilisateur tente d'accéder.
Alors vous n'aurez pas la peine de session n'est pas de sauver juste avant une redirection
Merci : )
La logique de mon script de connexion est basée sur stackoverflow.com/questions/1270005/...
OriginalL'auteur Ólafur Waage
...peut-je ajouter d'autres réponses, que session_start() échoue parfois ou bizarre se produit si pas placé au début du script. Dans votre en-tête de script, essayez:
Au lieu de
Mettre
OriginalL'auteur Aram Alvarez
J'ai eu un problème similaire quand j'ai découvert ceci:
http://www.w3schools.com/php/php_sessions.asp
Vous devez mettre le session_start(); avant TOUT code html des balises
OriginalL'auteur Dante Jones