لا يتم نقل متغيرات جلسة PHP إلى صفحة تسجيل الدخول الخاصة بي، ولكن معرف الجلسة هو كذلك

StackOverflow https://stackoverflow.com/questions/415005

سؤال

أنا استخدم PHP 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:

أحصل على الأخطاء التالية:

فهرس غير محدد:الاسم الأول
فهرس غير محدد:معرف المستخدم
فهرس غير محدد:مستوى المستخدم

عندي عالمية header.php الملف الذي لا يتصل به loggedIN.php الخاص بي، على الرغم من أن loggedOUT.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

لي تسجيل الدخول.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 بالمعلومات الصحيحة من قاعدة البيانات.ومع ذلك، بمجرد إعادة توجيههم إلى صفحة تسجيل الدخول، فقد اختفوا/لم يتم ضبطهم.

هل لدي احد اى افكار؟لقد أمضيت اليوم كله تقريبًا في هذا الأمر ولا أستطيع أن أقول إنني اقتربت من اكتشاف ذلك.

راجع للشغل، قمت مؤخرًا بإنشاء صفحتين اختباريتين بسيطتين، إحداهما بدأت جلسة، وقمت بتعيين بعض المتغيرات عليها، وكان لديها نموذج إرسال تم إعادة توجيهه إلى صفحة ثانية لم تفعل شيئًا سوى قراءة/إخراج متغيرات الجلسة.يبدو أن كل شيء يعمل بشكل جيد، ولكني أواجه مشكلات مع شيء أفعله في تطبيقي الرئيسي.

هل كانت مفيدة؟

المحلول

لا أرى أ session_start() في البرنامج النصي لتسجيل الدخول الخاص بك.إذا لم تكن قد بدأت الجلسة، فلا أعتقد أن لغة php ستحفظ أي بيانات تضعها في ملف $_SESSION مجموعة مصفوفة.ولكي أكون آمنًا أيضًا، سأضع المتغيرات بشكل صريح في ملف $_SESSION المصفوفة بدلاً من مجرد الكتابة فوق كل شيء باستخدام $_SESSION = mysql_fetch_array($result);.

نصائح أخرى

حاول القيام ب

session_regenerate_id(true); 

قبل

session_write_close();

أيضًا.أفضل طريقة للمنظمة البحرية الدولية (IMO) للقيام ببرنامج نصي لتسجيل الدخول هي:

اسمح بمعالجة منطق تسجيل الدخول داخل الصفحة الرئيسية التي يحاول المستخدم الوصول إليها.

  1. إذا لم تتم مصادقة المستخدم، فسيتم إعادته إلى صفحة تسجيل الدخول
  2. إذا تمت مصادقة المستخدم، فسيحصل على $_SESSION["auth"] أو شيء من هذا القبيل
  3. ثم عندما يتصفح المستخدم الصفحة الرئيسية أو الصفحات الأخرى التي تحتاج إلى مصادقة، فما عليه سوى التحقق مما إذا تم تعيين $_SESSION["auth"] أم لا.

إذن لن تواجه مشكلة عدم حفظ الجلسة قبل إعادة التوجيه مباشرة

... هل يمكنني أن أضيف إلى الإجابات الأخرى، أن session_start() تفشل أحيانًا أو تحدث أشياء غريبة إذا لم يتم وضعها في البداية الأولى للبرنامج النصي.في نص الرأس الخاص بك، حاول:

بدلاً من

<?php
ob_start();
session_start();

يضع

<?php
session_start();
ob_start();

كنت أواجه مشكلة مماثلة عندما اكتشفت هذا:

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

عليك أن تضع session_start();قبل أي علامات HTML

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top