PHP Weiterleitung aus Ajax reload

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP Weiterleitung aus Ajax reload

    Hey,

    Ich habe einen Chat der auf Ajax und PHP basiert mit folgender Strucktur:
    index.php -> Chat aufbau, chatverlauf und eingabe feld
    getChat.php -> Verabeitet die Daten, also speichert Daten in die DB und liest dort aus. Wird per JavaScript AJAX aufgerufen.
    Also Submit Button in der index.php löst JS Funktion aus die dann per POST oder GET die getChat.php aufruft.
    Klappt auch alles soweit. Nun soll aber wenn jemand innerhalb von 15 Minuten nichts mehr geschrieben hat aus dem Chat fliegen. Also habe ich eine Abfrage eingebaut wenn der Chat refresht wird. Also wenn im PHP Script Daten aus der DB gelesen werden (alle 2 Sekunden) wird überprüft wann die lezte Nachricht von diesem User geschrieben wurde. Wenn es länger als 15 Minuten her ist wollte ich aus dem Script per
    PHP-Code:
    header("Location: .. "); 
    rausheadern.
    Nun wird allerdings logischerweise nur aus der getChat.php weitergeleitet (Dort wo die Abfrage stattfindet), jedoch nicht von der index.php, welche der User ja nie wirklich verlässt.

    Wie kann ich nun der index.php mitteilen das der User nicht mehr aktiv ist. Habe gedacht es könnte funktionieren wenn ich per PHP eine JS Funktion aufrufe. Allerdings wird diese nur ausgegeben. Habe es so versucht:

    PHP-Code:
    if($SECURITY->checkActiveUser() == "false")
    {
          echo 
    '<script type="text/javascript">test();</script>';

    Wie kann ich nun entweder eine JS Funktion aufrufen welche dann eine Weiterleitung erzwingt , oder der index.php mitteilen dass der User nicht mehr aktiv ist?

    Falls weitere Informationen benötigt werden sagt bescheid^^
    Danke im Vorraus :-)

  • #2
    Lass doch in der index.php einen JavaScript-Ticker mitlaufen. Und wenn die 15 Minuten überschritten sind, leite ihn mit window.location.href weiter.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Würde gehen, aber es wäre äußerst störend, wenn sich die Seite nach 15 Minuten neu lädt, während ich gerade im Chat schreibe oder lese. Deshalb sollte zumindest beim Abschicken eines Textes der Timer neu gestartet werden.

      Es ist aber auch kein Problem, Javascript aus einer AJAX-Antwort auszuführen. Du musst es nur finden und eval'n.
      Zuletzt geändert von onemorenerd; 15.11.2009, 15:24.

      Kommentar


      • #4
        Zitat von onemorenerd Beitrag anzeigen
        Würde gehen, aber es wäre äußerst störend, wenn sich die Seite nach 15 Minuten neu lädt, während ich gerade im Chat schreibe oder lese. Deshalb sollte zumindest beim Abschicken eines Textes der Timer neu gestartet werden.
        Das ist doch selbstverständlich. Darum habe ich es auch nicht erwähnt.

        Peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Hallo,

          du kannst auch in der getChat.php einen speziellen X-Header oder Statuscode zurückgeben. Dann brauchst du nicht den responseText auf JS untersuchen, sondern nur den entsprechenden Header auslesen, ob der User ausgeloggt werden soll. Wenn der Chat sowieso mit Login über HTTP Authentication funktioniert, bietet sich der 401-Statuscode mit WWW-Authenticate-Header an, der den Benutzer (falls er überhaupt noch mitliest) dazu auffordert, erneut Benutzernamen und Passwort anzugeben.

          Gruß,

          Amica
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Hey, also eingeloggt wird man über einen Session Login. Die Sache mit dem Header finde ich interessant, weiß nur nicht genau wie ich die umsetzen kann. Ich poste mal ein bischen quelltext damit man das ganze besser versteht:

            index.php
            PHP-Code:
            <?php

            require_once("../common.php");

            require_once(
            "class.Chat.php");

            $CHAT = new Chat();


            if(!
            $SECURITY->checkLoginStatus())
            {
                
            header("Location: ../index.php");
            }
            else if(!
            $SECURITY->getRights("Friend") && (!$SECURITY->getRights("Admin")))
            {
                
            header("Location: ../index.php");
            }
            else
            {
                
            $CHAT->InsertUserToChat();
            }
            ?>
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
            <title>Ajax Web Chat</title>
            <link rel="stylesheet" href="css/chat.css" type="text/css" />
            <script language="javascript" src="js/chat.js"></script>
            </head>

            <body onLoad="javascript:startChat();">
            <h2>2Bad4You.net / cyber-hate-club.de Webseiten Chat</h2>
                    <p id="p_status">Status: Normal</p>
                    
                    Chat Verlauf:<br />
                    <div id="div_chat" class="chat_div"></div>
                    
                    <div class="headline_user_div">Aktive User im Chat:</div>
                    <div id="user_div" class="user_div"></div>
                     
                    <div class="control_div">
                    <form id="frmmain" name="frmmain" onSubmit="return
             blockSubmit('<?php if(isset($_SESSION['username']) &&
             (
            $_SESSION['username'] != "")){ echo $_SESSION['username']; }?>');">
                        <input type="button" name="btn_get_chat" id="btn_get_chat" value="Refresh Chat" 
            onClick="javascript:getChatText();" />
                        <input type="button" name="btn_reset_chat" id="btn_reset_chat" value="Reset Chat" 
            onClick="javascript:resetChat();" />
            <br />
                        <input type="text" id="txt_message" name="txt_message" style="width: 447px;" />
                        <input type="button" name="btn_send_chat" 
            id="btn_send_chat" value="Send" 
            onClick="javascript:sendChatText('<?php if(isset($_SESSION['username'])
             && (
            $_SESSION['username'] != "")){ echo $_SESSION['username']; }?>');" />
                    </form>
                    </div>         
                </body>
            </html>
            chat.php
            PHP-Code:
            <?php
            // Header Setzen
            header("Expires Mon, 26 Jul 1997 05:00:00 GMT" );
            header("Last Modified: " .gmdate"D, d M Y H:i:s" ) . "GMT" );
            header("Cache-Control: no-cache, must-revalidate" );
            header("Pragma: no-cache" );
            header("Content-Type: text/xml; charset=utf-8");

            require_once(
            "../common.php");
            require_once(
            "class.Chat.php");

            $CHAT = new Chat();

            // Prüfen ob eine Nachricht an den Chat gesendet wurde
            if(isset($_GET['action']) && ($_GET['action'] == "insertMessage"))
            {
                     
            $SECURITY->globalStripSlashes();
                    
                
            $CHAT->InsertChatMessage($_GET['chat'], $_POST['name'], $_POST['message']);
            }

            // Prüfen ob Nachrichten angefordert wurden sind
            if(isset($_GET['action']) && ($_GET['action'] == "getMessages"))
            {
                if(isset(
            $_GET['starttime']) && ($_GET['starttime'] != "") && (isset($_GET['last'])) && ($_GET['last'] != ""))
                {
                    
            $starttime $_GET['starttime'];
                    
            $last $_GET['last']; 
                }
                else
                {
                    
            $starttime date("Y-m-d H.i.s");
                    
            $last 0;
                }
                
                
            $CHAT->getChatMessages($starttime$last);
            }


            if(isset(
            $_GET['action']) && ($_GET['action'] == "getUser"))
            {
                
            $CHAT->getActiveUsers();
                
            }
                
            ?>
            Und aus der Chat Klasse die Funktion welche neue Nachrichten aus der Datenbank ausliest und dabei überprüft ob ein User noch aktiv ist.
            PHP-Code:
            public function getChatMessages($chatStartTime$lastMessageId)
            {
                
            // Prüfen ob Chat User noch Aktiv
                    
                /**
                if(!$SECURITY->checkActiveUser())
                {
                    doSomething();
                }
                **/
                    
                // Nachrichten aus der Datenbank auslesen
                
            $sql "SELECT message_id, user_name, message, 
            post_time FROM message WHERE chat_id = '1' AND post_time >
            '"
            .$this->DB->escapeString($this->SECURITY->stripTags($chatStartTime))."'
             AND message_id > 
            '"
            .$this->DB->escapeString($this->SECURITY->stripTags($lastMessageId))."'";
                    
                
            $result $this->DB->query($sql);
                    
                
            $JSON '{"messages": { ';

                
            // Prüfen ob Messages vorhanden sind
                
            if(count($result) > 0)
                {
                    
            $JSON .= '"message":[';
                        
                    for(
            $i=0$i<count($result); $i++)
                    {
                        
            $JSON .= '{';
                        
            $JSON .= '"id":  "' $result[$i]['message_id'] . '",
                                    "user": "' 
            htmlspecialchars($result[$i]['user_name']) . '",
                                    "text": "' 
            htmlspecialchars($result[$i]['message']) . '",
                                    "time": "' 
            substr($result[$i]['post_time'],11) . '",
                                    },'
            ;
                    }
                
                    
            $JSON .= ']';
                }
                else
                {
                    
            $JSON .= '"message":[]';
                }
                    
                
            $JSON .= '}}';
                    
                echo 
            $JSON;

            An der auskommentierten Stelle doSomething soll dann etwas passieren wenn der user nicht mehr aktiv ist. Welchen Header müsste/könnte ich dort setzen bzw wie könnte ich dort den logout aus dem Chat ausführen.

            Ich sitz da jetzt schon was länger vor und bin über jeden weiteren Denkanstoß dankbar.

            Kommentar


            • #7
              Erstmal was anderes: Dein Expires-Header ist ungültig, dort fehlt der Doppelpunkt.

              Zu doSomething:
              PHP-Code:
              header("X-Logoff: true"); 
              im PHP-Code würde schon reichen. Per JS kannst du dann vom XMLHttpRequest-Objekt die Methode
              Code:
              getResponseHeader("X-Logoff")
              aufrufen, um zu überprüfen, ob der User rausfliegen soll.

              Den Namen kannst du dir selbst ausdenken, er muss nur spezifikationskonform mit "X-" anfangen.
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #8
                Hey,

                Vielen Dank für eure Hilfe. Mit der X-Header Methode klappt das ganze super. Vielen dank dafür.

                Kommentar

                Lädt...
                X