AJAX Timeout Exceptions

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hi dOnUt,
    vielen Dank für Deine Antwort. Ich schätze sehr, dass Du mich auf den richtigen Weg bringen willst, dass ich mein Problem eigenständig lösen kann. Das ist was man von einem guten Foren Moderator erwartet. Die Sache wird mir langsam auch echt peinlich :) Der Schalter in meinem Kopf ist einfach noch nicht umgelegt. Vielleicht meinst Du ja irgendwas, von wo ich noch nie gehört habe, dass man das so machen kann.

    Ich habe jetzt mal versucht, nur meine login.php aufzurufen... und habe in der url mit login.php?USER_AKTIV=1 usw. rumgemacht. Aber meine Hacking Skills sind eher jäh gesäht. :)
  • Hier ist meine login.php, die ich in meiner ajax login.js zum Verifizieren des Benutzers aufrufe:

    Quellcode

    1. <?php
    2. /*
    3. Passwortabfrage
    4. */
    5. require ("../inc/inc_config.php");
    6. require ("../inc/inc_db_connect.php");
    7. require ("../inc/inc_functions.php");
    8. if((isset($_POST['benutzer']) && $_POST['benutzer'] != '') &&
    9. (isset($_POST['passwort']) && $_POST['passwort'] != '')) {
    10. // Slashes hinzufuegen, damit keine SQL-Fehler auftreten
    11. $sBenutzer = addslashes($_POST['benutzer']);
    12. $sPasswort = addslashes($_POST['passwort']);
    13. // Datenbank nach Benutzer und Passwort abfragen
    14. $user_query = mysql_query("SELECT ID, username, rolle, aktiv FROM tblbenutzer WHERE username='".$sBenutzer."' AND passwort='".$sPasswort."'");
    15. if ($row = mysql_fetch_array($user_query)) {
    16. // Benutzer ist vorhanden
    17. $USER_ID = $row['ID'];
    18. $USER_AKTIV = $row['aktiv'];
    19. $USER_NAME = $row['username'];
    20. $USER_ROLLE = $row['rolle'];
    21. if($USER_AKTIV == 1) {
    22. // und aktiv
    23. // Timestamp für den aktuellen Login aktualisieren
    24. mysql_query("UPDATE tblbenutzer SET letzter_login_am=NOW() WHERE ID='".$USER_ID."'");
    25. session_start();
    26. $_SESSION['id'] = session_id();
    27. $_SESSION['bLogin'] = true;
    28. $_SESSION['sName'] = $USER_NAME;
    29. $_SESSION['iRolle'] = $USER_ROLLE;
    30. $_SESSION['sRolle'] = getRollenString($USER_ROLLE);
    31. die('true|true');
    32. } else {
    33. // aber nicht mehr aktiv
    34. die('true|false');
    35. }
    36. } else {
    37. // Benutzer und/oder Passwort sind nicht korrekt
    38. die('false|false');
    39. }
    40. }
    41. if(isset($_GET['logout']) && $_GET['logout']==1) {
    42. session_start();
    43. session_destroy();
    44. }
    45. ?>
    Alles anzeigen


    Und hier meine javascript callback Funktion, die mein XMLHttpRequest handelt:

    Quellcode

    1. function loginHandle() {
    2. result = this.req.responseText;
    3. // Response-String aufteilen in Feld login und aktiv
    4. var tmp = result.split('|');
    5. login = tmp[0] == 'true' ? true : false;
    6. aktiv = tmp[1] == 'true' ? true : false;
    7. var msg = document.getElementById('message');
    8. if(login) {
    9. if(aktiv) {
    10. msg.innerHTML = 'login ok';
    11. // Main Inhalt in div mc_inhalt laden
    12. geturl('mc_inhalt', 'http://localhost/projekt/sites/eingeloggt.php');
    13. // Menü in div links laden
    14. setTimeout("geturl('links', 'http://localhost/projekt/inc/inc_menu.php')", 500);
    15. // Menü in div links laden
    16. setTimeout("geturl('zustand', 'http://localhost/projekt/inc/inc_login_state.php')", 700);
    17. } else {
    18. msg.innerHTML = 'Ihr Benutzer-Konto wurde deaktiviert.';
    19. }
    20. } else {
    21. msg.innerHTML = 'Bitte wiederholen Sie Ihre Eingabe noch einmal.';
    22. }
    23. }
    Alles anzeigen
  • hi, dachte schon du wärst inzwischen total abgefuckt weil ich dir nix konkretes gebe (konkret wird es aber sowieso erst, wenn man code hat)

    dann versuche ich es also weiter auf dem weg

    Allgemeine Empfehlung fürs AJAX entwickeln:

    1. ersetze alle $_POST durch $_REQUEST - dann kannst du auch mit GET Variablen experimentieren

    2. gebe dir url und post variablen so aus, dass du drauf klicken kannst und die ajax seite selbst im browser siehst

    Quellcode

    1. var url = 'inc/func_login.php';
    2. var post = 'user=1&passwort=2';
    3. req.open('POST', url, true);
    4. req.send(post);
    5. document.getElementById('devel').innerHTML('<a href="'+url+'?'+post+'">ajax: hier klicken</a>');


    dazu natürlich ein div erzeugen (am besten absolut positionieren)

    Quellcode

    1. <div id="dev" style="position:absolute;left:100px;top:100px"></div>


    ab dem zeitpunkt, zu dem die seite im browser aufrufen kannst, beginnt...

    Das PHP debuggen
    php debuggt man ganz simpel.. mit echos ;)

    Quellcode

    1. if(..) {
    2. echo 'bedingung1 ok';
    3. if ($row = mysql_fetch_array($user_query)) {
    4. echo 'sql ok';
    5. if($USER_AKTIV == 1) {
    6. echo 'user aktiv';
  • Naja abgefuckt wie man's nimmt :lol: ... Ich stocke grad schon ziemlich. Ohne eine globale Session kann ich nicht wirklich weitermachen. Ist ziemlich wichtig fuer mein Rollenkonzept.

    Ich habe jetzt Deine Anweisungen befolgt. Habe $_POST zu $_REQUEST geaendert und die echos in meine func_login.php eingefuegt. Ueber die GETS http://localhost/projekt/func_login.php?benutzer=admin&passwort=123 habe ich das Script auch zum Laufen gebracht. Das ist die gleiche URL, die ich ueber den Link im Javascript auf der Ajax-Seite sehe.

    So... und nun? Wie bringt mich das weiter in meiner div-lade-geschichte (mit geturl()) und meinen 2 Sessions?

    By the way...Wie Du in meiner JS-Datei siehst, lade ich nach dem Login verschiedene div mit Inhalten. Wuerdest Du das auch so mit dem setTimeout machen? (Um die Meinung eines Profis einzuholen)
  • ich führe einfach mal den gegenbeweis an:
    2 sessions funktionieren:

    session-test.php

    Quellcode

    1. <?php
    2. session_start();
    3. ?><html><head>
    4. <title>Sessio Test</title>
    5. <script type="text/javascript">
    6. <!--
    7. function ajax()
    8. {
    9. try {
    10. req = window.XMLHttpRequest?new XMLHttpRequest():
    11. new ActiveXObject("Microsoft.XMLHTTP");
    12. } catch (e) {
    13. //Kein AJAX Support
    14. }
    15. req.onreadystatechange = function() {
    16. if ((req.readyState == 4) && (req.status == 200)) {
    17. document.getElementById('status').innerHTML = req.responseText;
    18. }
    19. }
    20. req.open('GET', 'http://localhost/session-test2.php');
    21. req.send(null);
    22. }
    23. //-->
    24. </script>
    25. </head>
    26. <body onload="ajax()">
    27. <h2>Diese Session:</h2>
    28. <?php
    29. $_SESSION['a'] = 'a';
    30. echo session_id().'<br />';
    31. print_r($_SESSION);
    32. ?>
    33. <h2>Andere Session:</h2>
    34. <div id="status" style="color:#ff0000"></div>
    35. </body>
    36. </html>
    Alles anzeigen


    session-test2.php

    Quellcode

    1. <?php
    2. session_start();
    3. $_SESSION['b'] = 'b';
    4. echo session_id().'<br />';
    5. print_r($_SESSION);
    6. ?>
  • Ich weiss ja, dass 2 Sessions gehen. Und in deinem Beispiel wird auch tatsaechlich nur auf eine Session zugegriffen.
    Aber so mache ich es ja in meiner Anwendung auch. Aber ich kann global nicht auf die Sessionvariablen, die ich mir bei meinem Login (func_login.php) erzeuge zugreifen.
    Das ist mein Problem. Liegt doch an meinem Div-Lade-Mechanismus, oder? get_file_contents?
  • Und statt dem get_file_contents habe ich include eingefuegt. Dann habe ich aber immer noch die 2 Sessions.... bzw. noch komischer -> Pro Seite die ich in ein div lade bekomm ich eine andere Session-Id!
    Es MUSS an meiner Ladefunktion liegen.
    Du hattest doch gemeint, dass ich eine fertig geparste Datei laden soll? Aber wie? Ich höre heute nicht vorher auf, an meinem Ding rumzumachen, bevor ich das gebacken bekommen habe!!!! :twisted: So eine *#$*#&%$§*# hehe

    Meine Struktur ist so aufgebaut:
    Ich habe eine index.php (Hauptfenster) mit meinen DIVS. Dort wird bei onload() das Login Formular aufgerufen. Nachdem ich Benutzer und Passwort eingegeben habe, startet der XMLHttpRequest, greift auf die func_login.php zu, um die Daten zu verifizieren.
    Ist hier alles korrekt, startet func_login.php meine session und gibt "login ok" an mein login.js-Skript zurück, das dann die DIVS in der index.php mit meinen weiteren Inhalten lädt (das Main-Div mit meiner eingeloggten Hauptseite, das Menü-Div mit meinem Menü, und das Status-Div mit den Daten des eingeloggten Benutzers) In allen divs brauche ich die Session-Variablen.
  • Das Problem ist ja, dass meine Ausgabe mit include() erzeugt wird. Das steht fest. Und include() oder require() dürfen eigentlich keine Ausgabe produzieren.
    Aber wie bekomme ich das hin, das bei meindiv.innerHTML = "meine fertig geparsten HTML Elemente stehen" (die seite die in dem div angezeigt werden soll, z.B. verwaltung.php oder menu.php)???
  • Ich frage mich jetzt, ob ich mich von Dir total verunsichern liess oder einfach so mega auf dem Schlauch stand. :lol:

    Ich habe jetzt mal die url (als relativen Pfad), der Datei, die ich aufrufen möchte, in meiner fetch.js DIREKT aufgerufen und nicht als POST übergeben, so wie wir das bei file_get_contents($_POST['url']) gemacht haben.

    Quellcode

    1. var el;
    2. function geturl(elem, url) {
    3. el = elem;
    4. // Alte Variante: var loader = new net.ContentLoader('./siteLoader.php',handleSiteLoader,null,'POST','url='+url,null);
    5. // url ist die php-Seite
    6. var loader = new net.ContentLoader(url,handleSiteLoader,null,'POST',null,null);
    7. }
    8. function handleSiteLoader() {
    9. document.getElementById(el).innerHTML = this.req.responseText;
    10. }
    Alles anzeigen


    Und nach erfolgtem Login rufe ich diese Methode einfach so auf:

    Quellcode

    1. geturl('mc_inhalt', './sites/eingeloggt.php');


    Und siehe da, ich habe überall meine gleichen Session-IDs.... YEEEAY!!!
  • Ich habe jetzt mal meine Dateien auf den Server geladen. Das mit dem Laden lässt noch ein wenig zu wünschen übrig.

    Der erste Parameter ist das betreffende div und der zweite Parameter, der Content der eingefügt werden soll:
    setTimeout("updateSite('login_state_cart', './inc/inc_login_state.php')", 100);
    setTimeout("updateSite('links', './inc/inc_menu.php')", 750);
    setTimeout("updateSite('mc_inhalt', './sites/eingeloggt.php')", 1500);

    Wenn ich das Timeout sehr hoch setze, dann läd ers einigermassen. Aber ansonsten lädt er mein Content in andere divs oder überhaupt nicht. Z.B. lädt er meine inc_menu.php in mein div "mc_inhalt". Das soll da aber gar nicht hin, sondern in das div "links".

    Was kann ich hier noch optimieren, dass das einigermassen perfekt und stabil ist???
  • Jetzt habe ich das mal provosorisch so gelöst.

    updateWindow.js

    Quellcode

    1. var el_1, el_2, el_3;
    2. var loader_1, loader_2, loader_3;
    3. function updateWindow(elem_1, url_1, elem_2, url_2, elem_3, url_3) {
    4. el_1 = elem_1;
    5. el_2 = elem_2;
    6. el_3 = elem_3;
    7. loader_1 = new net.ContentLoader(url_1,handleUpdate_1,null,'POST',null,null);
    8. loader_2 = new net.ContentLoader(url_2,handleUpdate_2,null,'POST',null,null);
    9. loader_3 = new net.ContentLoader(url_3,handleUpdate_3,null,'POST',null,null);
    10. }
    11. function handleUpdate_1() {
    12. document.getElementById(el_1).innerHTML = loader_1.req.responseText;
    13. }
    14. function handleUpdate_2() {
    15. document.getElementById(el_2).innerHTML = loader_2.req.responseText;
    16. }
    17. function handleUpdate_3() {
    18. document.getElementById(el_3).innerHTML = loader_3.req.responseText;
    19. }
    Alles anzeigen


    Und der Aufruf nach Login:

    Quellcode

    1. updateWindow('login_state_cart', './inc/inc_login_state.php', 'links', './inc/inc_menu.php', 'mc_inhalt', './sites/eingeloggt.php');



    Der Code gefällt mir aber so nicht.
    Ich würde das gern mit einer Klasse oder Prototype-Funktion "schöner" lösen.
    Da ich "NOCH" kein Javascript Spezialist bin (wie wahrscheinlich bereits bekannt :) ) kannst Du mir vielleicht unter die Arme greifen? Das was ich mach soll ja am Ende eine schöne Studienarbeit darstellen.
  • Ok...hier meine Lösung.

    Quellcode

    1. if(login) {
    2. $('message').innerHTML = 'login ok';
    3. var sites = new Array();
    4. sites[0] = new Object();
    5. sites[0]["div"] = "login_state_cart";
    6. sites[0]["url"] = "./inc/inc_login_state.php";
    7. sites[1] = new Object();
    8. sites[1]["div"] = "links";
    9. sites[1]["url"] = "./inc/inc_menu.php";
    10. sites[2] = new Object();
    11. sites[2]["div"] = "mc_inhalt";
    12. sites[2]["url"] = "./sites/eingeloggt.php";
    13. updateWindow(sites);
    14. }
    Alles anzeigen


    Quellcode

    1. var element = new Array();
    2. var loader = new Array();
    3. function updateWindow(sites) {
    4. for(i=0; i<sites.length; i++) {
    5. alert("WindowUpdate: "+sites[i]["div"]+" -> "+sites[i]["url"]);
    6. element[i] = sites[i]["div"];
    7. loader[i] = new net.ContentLoader(sites[i]["url"],handleUpdate,null,'POST',null,null);
    8. }
    9. }
    10. function handleUpdate() {
    11. for(i=0; i<loader.length; i++) {
    12. document.getElementById(element[i]).innerHTML = loader[i].req.responseText;
    13. }
    14. }
    Alles anzeigen