मैं पीएचपी 4.3.9 का उपयोग कर रहा सत्र आईडी, है अपाचे/2.0.52पीएचपी सत्र मेरे लिए खत्म नहीं ले चर पेज में लॉग इन किया है, लेकिन
मैं एक लॉगिन कि काम कर प्रणाली पाने के लिए कोशिश कर रहा हूँ एक सत्र में डीबी मान पंजीकृत करता है जहां वे लॉग इन करने के बाद उपलब्ध होते हैं। एक बार जब मैं रीडायरेक्ट कर रहा हूं तो मैं सत्र चर खो रहा हूं।
मैं सत्र आईडी/और अपना लॉगिन प्रपत्र पृष्ठ पर पुनः निर्देशित मूल्यों पृष्ठ को प्रिंट करने के लिए निम्न कोड का उपयोग कर रहा:
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>';
यह वही मेरी लॉगिन पृष्ठ के अपने ब्राउज़र में मुद्रित है (मैं सिर्फ टिप्पणी हेडर को लॉग इन पेज पर रीडायरेक्ट करें)। यह मेरी डीबी से भी सही जानकारी आ रही है, इसलिए इस बिंदु पर सभी ठीक है।
session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name: elvis
session user id: 2
session user level: 1
यह मेरे रीडायरेक्ट/लॉग इन पेज पर मुद्रित है (जब मैं हेडर/रीडायरेक्ट को अनदेखा करता हूं)। सत्र आईडी वही है, लेकिन मुझे व्यक्तिगत सत्र चर के लिए कोई मान नहीं मिलता है।
session id: 1ce7ca8e7102b6fa4cf5b61722aecfbc
session first name:
session user id:
session user level:
मैं निम्नलिखित त्रुटियाँ मिलती है:
अपरिभाषित सूचकांक: first_name
अपरिभाषित सूचकांक: user_id
अपरिभाषित सूचकांक: user_level
मैं एक वैश्विक header.php फ़ाइल है जो मेरा logIN.php कॉल नहीं करता है, हालांकि logOUT.php करता है - सत्र टोस्ट करने के लिए):
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
मेरे loggedIN.php कुछ नहीं करता है, लेकिन सत्र
<?php
session_start();
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
अपना लॉगिन स्क्रिप्ट की तर्क शुरू करते हैं, महत्वपूर्ण हिस्सा होने के नाते मैं प्राप्त करते समय कर रहा हूँ डीबी का परिणाम $ _SESSION (लगभग आधा रास्ता नीचे) में होता है:
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'])
अगर मैं लॉगिन पेज पर हेडर रीडायरेक्ट पर टिप्पणी करता हूं, तो मैं डीबी से सही जानकारी के साथ $ _SESSION वैरिएबल को प्रतिबिंबित कर सकता हूं। एक बार लॉगिन पेज पर रीडायरेक्ट हो जाने पर, वे चले गए/अनसेट हो गए।
किसी के पास कोई विचार है? मैंने इस पर लगभग पूरे दिन बिताया है और यह नहीं कह सकता कि मैं इसे समझने के करीब हूं।
बीटीडब्ल्यू, मैंने हाल ही में 2 सरल परीक्षण पृष्ठों को बनाया है, एक सत्र शुरू किया है, उस पर कुछ चर सेट किए हैं, एक फॉर्म सबमिट किया गया था जो दूसरे पृष्ठ पर रीडायरेक्ट किया गया था, जिसमें सत्र वर्रों को पढ़ने/आउटपुट करने के अलावा कुछ भी नहीं था। यह सब ठीक काम करने लगता है, मुझे बस अपने मुख्य ऐप में कुछ ऐसा करने में समस्याएं आ रही हैं।
हे पर आधारित है , $ _SESSION सरणी में मैन्युअल रूप से डीबी मान डालने जैसा लगता है कि यह चाल है। बहुत बहुत धन्यवाद! क्या ऐसा इसलिए है क्योंकि मैं PHP 4.3.9 का उपयोग कर अटक गया हूं? –
4.3.9 प्राचीन है। – jmucchiello
@magenta मुझे लगता है कि ऐसा इसलिए है क्योंकि $ _SESSION = array (...) कर रहा है * आप $ _SESSION ऑब्जेक्ट को संशोधित नहीं करते हैं, इसके बजाय आप संदर्भ को फेंक देते हैं और किसी और चीज़ के साथ प्रतिस्थापित करते हैं। और हाँ, 4.3.9 भी काफी प्राचीन है :) – redShadow