2009-01-06 7 views
5

मैं पीएचपी 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 सरल परीक्षण पृष्ठों को बनाया है, एक सत्र शुरू किया है, उस पर कुछ चर सेट किए हैं, एक फॉर्म सबमिट किया गया था जो दूसरे पृष्ठ पर रीडायरेक्ट किया गया था, जिसमें सत्र वर्रों को पढ़ने/आउटपुट करने के अलावा कुछ भी नहीं था। यह सब ठीक काम करने लगता है, मुझे बस अपने मुख्य ऐप में कुछ ऐसा करने में समस्याएं आ रही हैं।

उत्तर

7

पहले सत्र की बचत नहीं की परेशानी है मैं अपना लॉगिन स्क्रिप्ट में एक session_start() नहीं दिख रहा। यदि आप सत्र शुरू नहीं कर रहे हैं तो मुझे नहीं लगता कि PHP आपके द्वारा $_SESSION सरणी में रखे गए किसी भी डेटा को सहेज लेगा। सुरक्षित होने के लिए मैं पूरी तरह से $_SESSION = mysql_fetch_array($result); के साथ पूरी चीज़ को ओवरराइट करने के बजाय $_SESSION सरणी में चर को स्पष्ट रूप से रखूंगा।

+0

हे पर आधारित है , $ _SESSION सरणी में मैन्युअल रूप से डीबी मान डालने जैसा लगता है कि यह चाल है। बहुत बहुत धन्यवाद! क्या ऐसा इसलिए है क्योंकि मैं PHP 4.3.9 का उपयोग कर अटक गया हूं? –

+2

4.3.9 प्राचीन है। – jmucchiello

+1

@magenta मुझे लगता है कि ऐसा इसलिए है क्योंकि $ _SESSION = array (...) कर रहा है * आप $ _SESSION ऑब्जेक्ट को संशोधित नहीं करते हैं, इसके बजाय आप संदर्भ को फेंक देते हैं और किसी और चीज़ के साथ प्रतिस्थापित करते हैं। और हाँ, 4.3.9 भी काफी प्राचीन है :) – redShadow

3

करने का प्रयास करें एक

session_regenerate_id(true); 

session_write_close(); 

भी पहले। लॉगिन स्क्रिप्ट करने के लिए आईएमओ का सबसे अच्छा तरीका यह है:

लॉगिन तर्क को उस मुख्य पृष्ठ के भीतर संभाला जाना चाहिए जिसे उपयोगकर्ता एक्सेस करने का प्रयास कर रहा है।

  1. उपयोगकर्ता प्रमाणीकृत नहीं है, तो वह प्रवेश पृष्ठ
  2. को फेंक दिया जाता है उपयोगकर्ता को प्रमाणीकृत किया जाता है, तो वह एक $ _SESSION [ "प्रमाणन"] या कुछ
  3. तो उपयोगकर्ता है, जब हो जाता है मुख्य पृष्ठ या अन्य पृष्ठों को ब्राउज़ करना जिन्हें ऑथ की आवश्यकता है, वे केवल जांचें कि $ _SESSION ["auth"] सेट है या नहीं।

तो फिर तुम अभ्यस्त सिर्फ एक रीडायरेक्ट

+0

यह एक अच्छा जवाब है! –

+0

धन्यवाद:) –

+0

मेरी लॉगिन स्क्रिप्ट का तर्क http://stackoverflow.com/questions/1270005/to-set-up-a-login-system-by- सत्र-in-php –

0

... क्या मैं अन्य उत्तरों में जोड़ सकता हूं, कि session_start() कभी-कभी विफल हो जाता है या अजीब चीजें तब होती हैं जब स्क्रिप्ट की पहली शुरुआत में नहीं रखा जाता है। आपके शीर्षक स्क्रिप्ट में, कोशिश:

<?php 
ob_start(); 
session_start(); 

के बजाय रखो

<?php 
session_start(); 
ob_start(); 
0

जब मैं इस खोज की मैं एक ऐसी ही समस्या हो रही थी:

http://www.w3schools.com/php/php_sessions.asp

आपके पास Session_start() डालने के लिए; किसी भी एचटीएमएल टैग से पहले

संबंधित मुद्दे