Ich verwende PHP 4.3.9, Apache/2.0.52PHP Session-Variablen tragen zu meiner nicht in Seite angemeldet, aber Sitzungs-ID ist
Ich versuche, ein Login-System zum Laufen zu bringen, dass DB-Werte werden in einer Sitzung registriert, in der sie nach der Anmeldung verfügbar sind. Ich verliere die Sitzungsvariablen, nachdem ich umgeleitet wurde.
ich den folgenden Code bin mit den Sitzungs-ID/Werten auf der Anmeldungsformularseite und die umgeleitete Seite drucken:
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>';
Dies ist, was in meinem Browser aus meiner Login-Seite gedruckt ist (ich gerade Kommentar out the header redirect auf die eingeloggte Seite). Dies ist die korrekte Information, die auch von meiner DB kommt, also ist alles in Ordnung.
session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name: elvis
session user id: 2
session user level: 1
Dies ist, was auf meiner umgeleiteten/eingeloggten Seite gedruckt wird (wenn ich die Überschrift/redirect auskommentiere). Sitzungs-ID ist das gleiche, aber ich bekomme keine Werte für die einzelnen Sitzungsvariablen.
session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name:
session user id:
session user level:
ich folgende Fehler:
Undefined index: first_name
Undefined index: user_id
Undefined index: user_level
Ich habe eine globale header.php Datei, die meine loggedIN.php ruft nicht auf, obwohl loggedOUT.php - um die Sitzung zu rösten -:
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
Mein loggedIN.php tut nichts, aber starten Sie die Sitzung
<?php
session_start();
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Die Logik meines Anmeldeskript, der Schlüsselteil ich holen sein der DB ergibt sich direkt in $ _SESSION (ungefähr zur Hälfte):
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'])
Wenn ich die Header-Umleitung auf der Anmeldeseite auskommentiere, kann ich die $ _SESSION-Variablen mit den richtigen Informationen aus der DB aussprechen. Sobald sie auf die Anmeldeseite umgeleitet wurden, sind sie jedoch nicht mehr verfügbar.
Wer hat irgendwelche Ideen? Ich habe fast den ganzen Tag damit verbracht und kann nicht sagen, dass ich näher dran bin, es herauszufinden.
BTW, ich habe vor kurzem zwei einfache Testseiten, begann man eine Sitzung, setzen einige Variablen auf sie, hatte ein Formular, das auf einer zweiten Seite umgeleitet, die nichts tat, aber lesen/Ausgabe der Sitzung Vars. Es scheint alles gut zu funktionieren, ich habe nur Probleme mit etwas, was ich in meiner Haupt-App mache.
Hey Wenn Sie die DB-Werte manuell in das $ _SESSION-Array setzen, sieht das so aus, als wäre es der Trick. Vielen Dank! Liegt es daran, dass ich PHP 4.3.9 verwende? –
4.3.9 ist alt. – jmucchiello
@magenta Ich denke, das liegt daran, dass man $ _SESSION = array (...) * das * _SESSION-Objekt nicht modifiziert, sondern stattdessen die Referenz wegwirft und durch etwas anderes ersetzt. Und ja, 4.3.9 ist auch ziemlich alt :) – redShadow