2010-11-13 13 views
5

मेरे मुद्दा कुछ हद तक निम्नलिखित पोस्ट के समान है ..चेतावनी: हेडर सूचना को संशोधित नहीं कर सकते - हेडर पहले ही भेजा (PHP)

PHP error: Cannot modify header information – headers already sent

लेकिन मेरे मामले में मैं सत्र शुरू करने एक बार मैं वहाँ निर्धारित चुना लॉगिन फॉर्म से कोई सत्यापन त्रुटियां नहीं हैं और उपयोगकर्ता की लॉगिन जानकारी डेटाबेस से मेल खाती है।

लॉग इन पेज (किसी भी html से पहले)

session_name('username'); 
session_name('ip'); 
session_name('start'); 
session_start();  

login.php स्निपेट (एचटीएमएल के मुख्य भाग में)

  } else { 
      $user = $_POST['username']; 
      $userpass = md5($_POST['password']); 
      $login_results = statement("select username, password from `$admin` where username='$user' and password='$userpass'"); 

      if (mysql_num_rows($login_results)!= 1) { 
       $errmsg = "<span id='error'>Login failed: Username or password not on file</span>"; 
      }else { 

       $_SESSION['username'] = "$user"; 
       $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
       header("Location: index.php"); 
      } 
     } 
    } 

} 

अगर आप की किसी और ब्लॉक को देखो: यहाँ निम्नलिखित कोड है उपर्युक्त कोड मैं लॉगिन की पुष्टि कर रहा हूं और यदि यह अच्छा है तो मैं सत्र चर निर्दिष्ट करना चाहता हूं और अपने इंडेक्स पेज पर जाना चाहता हूं। जो बहुत शुरुआत में इस कोड है:

//Session Timeout Script -- used to determine the amount of time the user has been idle. If it the user has been idle for longer then the session time, log the user out. 
//Secondary to the Timeout Script, the username and ip address is checked for validility and if either fails redirect the user to the login page. 
session_cache_expire(20); 
session_start(); 

$inactive = 1200;  

if(isset($_SESSION['start'])) { 
     $session_life = time() - $_SESSION['start']; 
    if($session_life > $inactive){ 
     header("Location: logout.php"); 
    } 
} 

    $_SESSION['start'] = time(); 

    $newip = $_SERVER['REMOTE_ADDR']; 
    if (!isset($_SESSION['username']) || empty($_SESSION['username']) || $newip!= $_SESSION['ip']) { 
header('Location: login.php'); 
} 

अब जब कि पिछले लेखक की ओर से प्रश्न के माध्यम से पढ़ने, यह है कि शीर्ष लेख (उल्लेख किया गया था) कोड में निष्पादित करने के लिए पहली बात यह है कि रीडायरेक्ट, भेजने thats होना चाहिए, जिसमें मेरा मामला login.php है। और ऐसा करने से मुझे लॉगिन करने की इजाजत मिलती है, लेकिन जब मैं लॉग आउट करता हूं तो मैं अपने सभी सत्रों को नष्ट कर रहा हूं और हेडर() का उपयोग करके मुझे लॉगिन पेज पर वापस भेज सकता हूं। जो बदले में लॉगिन पेज को इंडेक्स पेज पर रीडायरेक्ट कर देगा क्योंकि इसकी कोड की पहली पंक्ति पढ़ी जाती है। इससे बचने का कोई रास्ता है क्या? तो मुझे login.php के शीर्ष पर पहले से मौजूद मेरे कोड तर्क में से कुछ को दोहराने की आवश्यकता नहीं होगी?

आंद्रे

उत्तर

3

मैं हैडर समारोह के साथ इसी तरह की समस्या का एक तरह का था।
सबसे पहले यह सुनिश्चित करें में कोई सफेद स्थान शुरुआत और अपने .php फ़ाइल के अंत पर न हो। ,

<?php 
//Codes... 

आप देख सकते हैं पीएचपी टैग की शुरुआत से पहले एक सफेद जगह नहीं है:
कुछ इस तरह त्रुटियों के इन प्रकार कुछ समय का कारण बनता है। जब आपके PHP कोड HTML के साथ मिश्रित होते हैं तो यह हास्यास्पद त्रुटियों का कारण बनता है।
जहां तक ​​मुझे याद है, session_start() पर कॉल को PHP टैग खोलने के बाद फ़ाइल की शुरुआत में कोड की पहली पंक्ति होना चाहिए।
मुझे पूरा यकीन है कि मुझे थोड़ी देर पहले कुछ समस्या हुई।

+1

ओह और एक और बात।जहां तक ​​मुझे याद है कि आपके पास हेडर() फ़ंक्शन पर कई कॉल नहीं हो सकते हैं। कैस्केडिंग संभव नहीं है। – M2X

+0

ठीक से त्रुटि पर फिर से पढ़ना, यह दावा करता है कि आउटपुट पहले से ही उस फ़ाइल में शामिल किया गया था जो मेरे हेडर() निष्पादन से पहले है। अब मैं उस फाइल में गया और रिक्ति हटा दी और अब यह काम कर रहा है धन्यवाद एमओटीएक्स। – Andre

+0

ज़रूर! ; -] इस प्रश्न को उन लोगों के लिए उत्तर देने के लिए मत भूलना जो इस पर आ सकते हैं। – M2X

4

हां, headerकिसी भी अन्य आउटपुट से पहले बुलाया जाना चाहिए, इसकी आवश्यकता http से ही है, इसके चारों ओर कोई रास्ता नहीं है। हालांकि, आप session_start() के बाद हेडर को कॉल कर सकते हैं।

तो आप सत्र शुरू कर सकते हैं, $_POST से लॉगिन डेटा की जांच करें और एचटीएमएल आउटपुट शुरू करें।

बीटीडब्ल्यू, उत्तराधिकार में तीन session_name का उपयोग क्यों करें?

+0

ठीक है, मैंने किसी भी एचटीएमएल आउटपुट से पहले और अन्य ब्लॉक (अन्यथा पोस्ट में दिखाया गया ब्लॉक) को स्थानांतरित कर दिया है और सत्र_नाम को हटा दिया है, कोड को शुरू करने के साथ Andre

+0

इस पोस्ट को अनदेखा करें, अपराधी अतिरिक्त जगह थी – Andre

1

आप आउटपुट बफरिंग का उपयोग भी करना चाह सकते हैं। OB tasks पर PHP मैनुअल देखें।

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

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