2012-04-13 1 views
0

OK ... Ich habe etwas, was keinen logischen Sinn macht und ich hoffe, jemand kann auf den dummen Fehler, den ich mache, hinweisen. Ich habe eine Seite, auf der ich möchte, dass die Menüs ändern, ob ein Benutzer angemeldet ist oder nicht. Ich verwende eine Session-Variable $ _SESSION ['is_logged_in] um den eingeloggten Status zu speichern. Wenn Sie also beispielsweise ausgeloggt sind, sollte das Menü "Anmelden" heißen. Wenn Sie eingeloggt sind, sollte das gleiche Menü ausgeloggt sein. Hier ist der Code in logischen Stücken. Ich entschuldige mich im Voraus für alle Code-Schnipsel, aber ich möchte so klar wie möglich sein. Bitte helfen Sie!

Zuerst habe ich die Haupt-Seite namens index.php, die einige leere Divs hat:

<div id="wrapper"> 
    <div id="header"> 
     <h1>My Page</h1> 
     <div id="navigation"> 
     </div> <!-- end of navigation div --> 
    </div> <!-- end if header div --> 
    <p>&nbsp;</p> 
    <div id="mainContent"> 
    </div><!-- end mainContent div --> 
</div> <!-- end wrapper div --> 

Auf dieser Seite (index.php), habe ich eine jquery Last des Navigations div auf Dokument bereit:

<script type="text/javascript"> 
    $(document).ready(function(e) { 
     //load the default menu 
     $('#navigation').load("menu.php"); 
    }); 
</script> 

OK ... jetzt menu.php hat die folgende html/php:

<?php 
    session_start(); 
    include 'php/functions.php'; 

    //following is for debugging, you will see later where this is useful 
    if (is_logged_in()) 
    {  
    echo "logged in value: " . is_logged_in() . "<br />"; 
    print_r($_SESSION); 
    } 
    else 
echo "not sure what is going on</br >"; 
    echo "<br />"; 
?> 
    <ul id="menu" class="DropdownMenu"> 
    <li class="sub"><a href="#">Account</a> 
     <ul> 
      <?php 
       //this is where it should show one link or the other based on the value in $_SESSION 
       if (is_logged_in()) { 
       echo "<li><a href=\"#\" class=\"ClickLogout\">Log Out</a></li>\n"; 
       } else { 
       echo "<li><a href=\"#\" class=\"ClickLogin\">Log In</a></li>\n"; 
       } 
      ?> 
     </ul> 
    </li> 
    </ul> 

Ok ... an dieser Stelle, wenn die pag e lädt, oben auf dem Menü sehe ich die Debug-Nachricht "nicht sicher, was hier abläuft" wie erwartet, weil ich noch nicht eingeloggt bin. Dann klicke ich auf den Login-Link und über Ajax, füllt es die maincontent div in der index.php:

Dies ist in menu.php:

$(document).ready(function(e) { 
    var options = { 
     target:  '#mainContent', // target element(s) to be updated with server response 
     success:  reloadMenu, // post-submit callback 
     delegation: true 
    }; 

    // post-submit callback 
    function reloadMenu(responseText, statusText, xhr, $form) { 
     $('#navigation').load("menu.php"); 
    }; 

    //set the jquery form plugin for the login form 
    $('.ContentForm').ajaxForm(options); 

    //load the login form in the mainContent div 
    $('#wrapper').on("click", ".ClickLogin", function(e) { 
     $('#mainContent').load("login.php"); 
    }); 

}); 

Der obige Code zeigt, dass, wenn das Formular abgeschickt wird Bei Erfolg sollte der Post-Submit-Callback das Menü erneut laden, genau wie das anfängliche Laden des index.php-Dokuments. Beim Debugging sehe ich, dass es neu geladen wird, aber es sieht nie etwas in den Sitzungsvariablen. Obwohl ich eingeloggt bin, zeigt es immer noch den Login-Link an, anstatt mich auszuloggen.

Nun, sie alle zusammen nur bringen zu zeigen, ich bin nicht verrückt, hier ist das, was in der login.php ist:

<?php 
    // start the session 
    session_start(); 
    include 'php/functions.php'; 

    //this sections handles the post of the form 
    $show_form = true; 
    if($_SERVER['REQUEST_METHOD'] == "POST") 
    { 
     $email = $_POST['email']; 
     $password = $_POST['password']; 

     if (authenticate_user($email, $password)) //this will set $_SESSION variables 
     { 
     $show_form = false; 
     echo "Congratulations " . get_user_name() . ", you are logged in <br />"; 

     //following is for debugging, you will see later where this is useful 
     if (is_logged_in()) 
     { 
      echo "logged in value: " . is_logged_in() . "<br />"; 
      print_r($_SESSION); 
     } 
     else 
      echo "not sure what is going on</br >"; 
     } 
     else 
     { 
     echo "Invalid email or password. Try again <br />"; 
     } 
    } 
?> 

<?php if ($show_form) { ?> 
<div id="formContent"> 
    <h2 class="ContentHeader">Log In</h2> 
    <form id="contentForm" name="registration" class="ContentForm" method="post" action=<?php echo $_SERVER['PHP_SELF']?>> 
     <p> 
     <label for="email">Email:</label> 
     <input type="email" name="email" id="email" required="required"> 
    </p> 
    <p> 
     <label for="password">Password:</label> 
     <input type="password" name="password" id="password" required="required"> 
    </p> 
    <p> 
     <input type="submit" name="insert" id="insertLink" value="Submit It" /> 
     <input type="reset" name="cancel" id="cancel" value="Reset" /> 
    </p> 
    <p>Forgot Password? Click <a href="#">here</a></p> 
    <p>Need to Register? Click <a class="ClickRegister" href="#">here</a></p> 
    </form> 

Ich weiß, dass es eine Menge Code ist so Ich möchte auf etwas hinweisen. Zu diesem Zeitpunkt, wenn das Formular abgeschickt wird, wird im Menü #navigation die Datei menu.php neu geladen und im Divider #mainContent wird die login.php neu geladen. Beide sind die Ausführung diesen exakt gleichen Code:

 //following is for debugging, you will see later where this is useful 
if (is_logged_in()) 
{ 
    echo "logged in value: " . is_logged_in() . "<br />"; 
    print_r($_SESSION); 
} 
else 
    echo "not sure what is going on</br >"; 

Wenn die Seite angezeigt, nachdem das Login-Formular einreichen, über dem Menü heißt es „nicht sicher, was los ist“, gefolgt von „Array()“, aber in den maincontent Es zeigt "eingeloggten Wert: 1" an und gibt alle Sitzungswerte aus.

Nur der Vollständigkeit halber, die is_logged_in() Funktion sieht wie folgt aus:

//return true if the current session is logged in 
function is_logged_in() 
{ 
    if (array_key_exists('is_logged_in', $_SESSION)) 
     return $_SESSION['is_logged_in']; 
} 

Ich habe session_start() in beiden menu.php und login.php, wenn ich es nicht täte es gibt mir alle möglichen andere Fehler beim Versuch, auf das Array $ _SESSION zuzugreifen.

Ich hoffe wirklich, dass jemand meinen Fehler erkennen kann. Bitte helfen Sie!

Vielen Dank im Voraus.

+0

Chck, dass der Wert des Sitzungscookies bei all diesen Anfragen gleich bleibt. Wenn es sich ändert, erhalten Sie jedes Mal eine neue/leere Sitzung, was erklärt, warum Ihre Werte "verschwinden" - sie sind immer noch da, aber in einer ANDEREN Sitzung. –

+0

Wie überprüfe ich das? – Kamran

+0

[session_id()] (http://php.net/manual/en/function.session-id.php) – sennett

Antwort

0

Beantworten der Frage offiziell für den Abschluss.Wie in den obigen Kommentaren erwähnt, habe ich die Sitzung zerstört, bevor ich sie als Teil der Anmeldung eingerichtet habe. Ich bin mir immer noch nicht sicher, warum das den Effekt hatte, da beide Divs nach dem Destroy/Re-Create geladen wurden, aber vielleicht gibt es eine Ajax Race Condition.

Ich bin nur froh, dass es gelöst ist und ich kann weitermachen. Danke an alle für Ihre Eingabe.

Verwandte Themen