• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Aktualisieren ohne aktualisieren

Zemke

New member
Hallo,

ich habe eine Shoutbox mittels PHP und MySQL programmiert. Das Formular wo man die Nachricht eingibt leitet wieder auf die gleiche Seite wenn man Submit drückt, der Submit Button heißt "Smessage". Auf der Seite wird dann wie folgt auf die Eingabe zugegriffen

PHP:
if($_POST['Smessage'])
{
// Hier wird dann die Eingabe in die Datenbank gepackt u.s.w.
}

Bevor man nun den Eintrag in der Shoutbox auch sehen kann muss man nochmal die ganze Seite manuel aktualisieren, damit der Query (Datenbankabfrage mittlels mysql_query) aktualisiert wird und die Nachricht angezeigt wird. Genau das ist das Problem.

Ich möchte das man die Nachricht dann sofort sieht und ich möchte das, wenn jemand an einem anderen Computer was eintiptt, dass ich es auch gleich sehen kann ohne die komplette Seite aktualisieren zu müssen. Ist es z.B. möglich die Datenbanbankabfrage (den Query) jede paar Sekunden zu wiederhohlen oder gibt es andere Möglichkeiten...? Ich denke es ist klar was gemeint ist, eben ein typisches problem beim Chat programmieren welches ich schon oft bei Google gefunden habe, aber noch keine Lösung habe.
 
Ich habe mich mit AJAX befasst udn weiß nun grob worum es geht. Ich stehe aber pratkisch noch auf dem selben Punkt, ich brauche ein bisschen Anschwung wie ich realisieren kann was oben beschrieben ist. Ich poste einfach mal den Code Abschnitt der für das Auflisten der Nachrichten verantwortlich ist.

PHP:
<?php   // The shoutbox messages area listed by a for loop.

    echo '<table border="0" cellpadding="0" cellspacing="0">';

for($id=$rows; $id>=1; $id--)
{
    $requestSB = mysql_query("SELECT * FROM shoutbox WHERE id='$id'");
    $resultSB = mysql_fetch_array($requestSB);

    echo "<tr>
            <td><font color=\"gray\">[$resultSB[date] | $resultSB[time]]</font></td>
            <td width=\"10\"><br /></td>
            <td><b>$resultSB[nickname]</b></td>
            <td width=\"5\"><br /></td>
            <td>$resultSB[message]</td>
          </tr>";
}

    echo '</table>';

?>

Dies ist theoretisch auch der Abschnitt Code, der immer und immer wieder aktualisiert werden muss.
 
AJAX Request an dieses Script starten und dann die Antwort mittels JS in deine Seite einbauen.
Ansonsten Iframe was regelmäßig neugeladen wird.
 
So, bin jetzt schon einen ganzen Schritt weiter und habe erstmal angefangen etwas ganz simples zu amchen mittels AJAX den Text aus einer seperaten HTML Datei ausgeben:

HTML:
<head>
    <script language="javascript" type="text/javascript">

    function loadXMLDoc(url)
    {
        if (window.XMLHttpRequest)
        {
        xmlhttp=new XMLHttpRequest(); // Creates a new XMLHttpRequest object.
        }

        xmlhttp.open("POST", url, false); // Opens the requested object.
        xmlhttp.send(null); // Sends it to the server.
        document.getElementById('shouts').innerHTML=xmlhttp.responseText; // Updates your page with the response from the server.
        }

    </script>
</head>

<body>

<input type="submit" name="submit" value="Submit" onclick="loadXMLDoc('sb_query.html')" />

<div id="shouts"></div>

</body>

Und bin danach dann wieder auf meine Datei übergegangen um dort das gleiche zu tun. Erstmal wieder der head Bereich:

HTML:
<head>
    <script language="javascript" type="text/javascript">

    function loadXMLDoc(url)
    {
        if (window.XMLHttpRequest)
        {
        xmlhttp=new XMLHttpRequest(); // Creates a new XMLHttpRequest object.
        }

        xmlhttp.open("POST", url, false); // Opens the requested object.
        xmlhttp.send(null); // Sends it to the server.
        document.getElementById('shouts').innerHTML=xmlhttp.responseText; // Updates your page with the response from the server.
        }

    </script>
</head>

Den Teil aus meinem vorherigen Post habe ich nun in die sb_query.php gepackt, wie oben nur jetzt eine PHP Datei statt HTML. Das ist sozusagen das was "Requested" werden soll, im obigen Beispiel wurde es per Button Klick aufgerufen. Hier die sb_query.php die immer und immer wieder aufgerufen werden soll und das was aktualisiert werden soll:

PHP:
<?php   // The shoutbox messages area listed by a for loop.

    echo '<table border="0" cellpadding="0" cellspacing="0">';

for($id=$rows; $id>=1; $id--)
{
    $requestSB = mysql_query("SELECT * FROM shoutbox WHERE id='$id'");
    $resultSB = mysql_fetch_array($requestSB);

    echo "<tr>
            <td><font color=\"gray\">[$resultSB[date] | $resultSB[time]]</font></td>
            <td width=\"10\"><br /></td>
            <td><b>$resultSB[nickname]</b></td>
            <td width=\"5\"><br /></td>
            <td>$resultSB[message]</td>
          </tr>";
}

    echo '</table>';

?>

Und das vorherige (sb_query.php) soll dann halt in dieser ID ausgegeben werden:

HTML:
<div id="shouts"></div>

So weit bin ich jetzt. Wie bekomme ich es nun hin das die sb_query.php jede paar Sekunden wieder neu abgefragt wird und dann dort hin kommt wo die ID ist, ich denke es ist durchsichtig was gemeint ist. :icon7:
 
Ich habe das jetzt so gemacht:
HTML:
<body onload="setInterval(loadXMLDoc('sb_query.php'), 1000)">

Aber dann sehe ich im Chatfenster gar nichts mehr... und die ID shouts bleibt leer, da kommt nichts...
Hier nochmal der Script im head Bereich:

HTML:
    <script language="javascript" type="text/javascript">

    function loadXMLDoc(url)
    {
        if (window.XMLHttpRequest)
        {
        xmlhttp=new XMLHttpRequest(); // Creates a new XMLHttpRequest object.
        }

        xmlhttp.open("POST", url, false); // Opens the requested object.
        xmlhttp.send(null); // Sends it to the server.
        document.getElementById('shouts').innerHTML=xmlhttp.responseText; // Updates your page with the response from the server.
    }

    </script>

Naja, in der ID steht halt nichts, da kommt gar nichts mehr deswegen vermute ich der kommt an die sb_query.php nicht ran oder er kommt da ran schreibt sie dort aber nicht hin...
 
Okay, daran lag es nicht ganz. Ich habe nur diesen Bereich mit dem for-Loop in die sb_query.php gepackt und dieser Loop nutzt Variablen aus anderen Bereichen die aber nicht in der sb_query waren, so konnte das natürlich nicht funktionieren, jetzt ist alles super. Vielen, vielen Dank ein weiteres Mal für die Hilfe!

Eine Frage noch, kann man auch ruhig jede Millisekunde (übertrieben) aktualisieren lassen oder würde das, dass System überlasten?

EDIT: Jedesmal wenn er aktualisiert stockt die Eingabe kurz, obwohl das input Feld für die NAchricht gar nicht aktualisiert wird.
 
Zuletzt bearbeitet:
Jede Millisekunde wird deinen Server wohl lahmlegen. Vorallem wenn dann auch mehr als eine Person deinen Chat aufruft.
Macht auch nicht soviel sinn, da ja jede Anfrage deutlich mehr als eine Millisekunde unterwegs ist.

Dein Script ist nicht sehr performant. Die Datenbankabfrage muss aus der Schleife (und entsprechend angepasst werden).
Außerdem würde ich die Daten in XML verpackt senden, dadurch wird der HTML-Overhead etwas geringer. Du müsstest dann mittels Javascript das XML auslesen und die entsprechenden HTML-Knoten erzeugen. Zu dem würde ich mir clientseitig merken, wann der Client die letzte Nachricht erhalten hat. Diesen Zeitpunkt sendest du dann bei jeder Anfrage mit und lieferst nur die neuren Nachrichten zurück.

Nen schlecht programmierter Chat kann sonst nen Server schnell in die Knie zwingen, oder du musst die Abfragezeit sehr hochsetzen.
 
Zuletzt bearbeitet:
Zurück
Oben