PHP oturum değişkenleri benim sayfa açmış, ancak oturum kimliği üzerinde taşıyan değil

2 Cevap php

Ben kullanıyorum PHP 4.3.9, Apache/2.0.52

Ben bir kez I'm losing the session variables once I'm redirected oturum mevcut konum bir oturumda DB değerleri kaydeden bir giriş sistemi çalışma almak için çalışıyorum.

Benim giriş formu sayfasında ve yönlendirildi sayfada oturum kimliği / değerleri yazdırmak için aşağıdaki kodu kullanıyorum:

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>';

Bu benim giriş sayfasından benim tarayıcıda basılmış budur (sadece başlık sayfasında açmış yönlendirmek açıklama). This is the correct info coming from my DB as well, so all is fine at this point.

session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name: elvis
session user id: 2
session user level: 1

Bu benim (I başlık / yönlendirme yorumsuz zaman) sayfasında giriş / yönlendiriliyorsunuz üzerine basılmış budur. Session ID is the same, ama ben tek oturum değişkenleri için hiçbir değer olsun.

session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name:
session user id:
session user level:

Ben aşağıdaki hataları alıyorum:

Undefined index: first_name
Undefined index: user_id
Undefined index: user_level

Ben loggedOUT.php yok ama benim loggedIN.php, çağrı DEĞIL bir küresel header.php dosyası var - oturumu tost için):

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

Benim loggedIN.php oturumu başlatmak hiçbir şey yok ama

<?php
session_start();
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

logic of my login script, ben sağ (yaklaşık yarım aşağı) $ _SESSION içine DB sonuçları getiriliyor ediyorum olmanın önemli bir parçası:

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'])

if I comment out the header redirect on the login page, I can echo out the $_SESSION variables with the right info from the DB. Once redirected to the login page, however, they're gone/unset.

Herkes herhangi bir fikir var mı? Bu konuda neredeyse bütün gün geçirdim ve ben herhangi bir yakın onu bulmaktan olduğumu söyleyemem.

BTW, Geçenlerde, 2 basit test sayfaları yapılan tek üzerinde bazı değişkenleri set, bir oturumu başladı, bir form / çıktılarının oturum değişkenler okudum ama hiçbir şey yapmadı ikinci bir sayfaya yönlendiriliyorsunuz hangi göndermek vardı. Tüm ben sadece benim ana uygulama yapıyorum şey ile ilgili sorunlar yaşıyorum, iyi iş gibi görünüyor.

2 Cevap

Ben oturum açma komut dosyası bir session_start() görmüyorum. Eğer oturumu başlıyor değilseniz php size $_SESSION dizide yer herhangi bir veri kaydetmek sanmıyorum. Ayrıca ben açıkça yerine sadece $_SESSION = mysql_fetch_array($result); ile her şey yazılmadan $_SESSION diziye değişkenleri yerleştirmek istiyorum güvenli olması için.

Bir yapıyor deneyin

session_regenerate_id(true);

önce

session_write_close();

Ayrıca. IMO bir oturum açma komut dosyası yapmak için en iyi yolu şudur:

Giriş mantık kullanıcı erişmeye çalışıyor Ana Sayfa Künye içinde ele olalım.

  1. Kullanıcı kimlik doğrulaması değilse, o giriş sayfasına geri atılır
  2. Kullanıcı kimlik doğrulaması ise, o bir $ _SESSION ["auth"] veya bir şey alır
  3. Kullanıcı ana sayfası veya auth gerek diğer sayfaları gezerken $ _SESSION ["auth"] ayarlandığında eğer, onlar sadece kontrol edin.

Sonra alışkanlık sadece bir yönlendirme önce oturumu tasarruf değil sorun var