Ergebnis 1 bis 3 von 3

PHP: flush() & db->query

  1. #1 Zitieren
    Drachentöter
    Registriert seit
    Feb 2004
    Beiträge
    4.053
    Moin
    Ich bin gerade mehr oder weniger dabei, einen Chat zu programmieren, und hatte mir vorher einmal die Scripts eines bestehenden Chats, den ich mir mal runtergeladen habe, angeschaut. Dieser verwendet dafür unter anderem die flush()-Funktion. Die function für den Chatstream sieht bei diesem Chat so aus:

    PHP-Code:
    function stream ($chatuser$chatroom)
    {
        global 
    $host,$database,$user,$password,$stoolonginactive,$maxaway,$maxnoaway,$awayschutz,$chatprefix;
        if(
    $chatuser)
        {
            
    ignore_user_abort(1);
            
    $PingTime 1;
            
    $Ping 0;
            
    $query3 "SELECT lastaction,away,ignorelist2,streamabort FROM ".$chatprefix."chatusers where nick='$chatuser'";
            
    $db = new db_local;
            
    $db2 = new db_local;

            
    // Aktueller Stand wird einmalig ausgelesen
            
    $db->query ("SELECT id from ".$chatprefix."chatmessages_$chatroom order by id desc limit 1");
            
    $lastpos $db->result();

            while(!
    connection_aborted())
            {
                
    $db5 = new db_local;
                
    $db5 -> query ("UPDATE ".$chatprefix."chatusers SET streamabort='0' WHERE nick='$chatuser'"); // stream ist da

                // MSGs anzeigen
                // Aktuelle Position auslesen
                
    $db->query ("SELECT id from ".$chatprefix."chatmessages_$chatroom order by id desc limit 1");
                
    $pos $db->result();

                
    // Mit alter Position vergleichen
                
    if ($lastpos $pos)
                {
                    
    $query2 "SELECT message,user,datum FROM ".$chatprefix."chatmessages_$chatroom WHERE id > $lastpos";
                    
    $db->query ($query2);

                    
    // Alle hinzugekommenen MSGs durchlaufen
                    
    while ($db->next_record())
                    {
                        
    $text stripslashes($db->record[message]);
                        
    $schreiber=$db->record[user];

                        
    // Normale MSGs
                        
    if ($schreiber == "")
                        {
                            
    $schreiber "scheißdrecksverdammel";
                        }
                        else
                        {
                        if (!
    eregi("privatemessagestring"$text))
                        {
                        echo 
    "$text";
                        }
                    }
                }

                
    $lastpos $pos;
            }
            else
            {
                echo 
    " ";
            }

            
    // Neue Zeilen oder Leerzeichen an den Browser schicken
            
    flush();
            
    usleep(500000);
            } 
    // while connection
        
    $db->close();
        } 
    //if user
    // Function 
    Dieses Script will ich irgendwie nicht so ganz durchblicken ... was wohl vor allem daran liegt, dass hier (und auch in anderen Scripts, z.B. Forensoftware) z.B. statt mysql_query der Befehl $db->query verwendet wird ... ich kann aber $db weder in dieser noch in einer der includeten Dateien als festgelegte Variable finden. Daher wüsst ich gerne, wie man diese verwendet, ob man das immer kann, und was damit noch so möglich ist ... so gibt es zum Beispiel Wertzuweisungen à la $variable = $db->result oder $variable = $db->next_result. Hat da mal wer mit gearbeitet oder weiß Bescheid? Oder ist das einfach nur eine andere Schreibweise?

    Und ja, falls jemand mir erklären könnte, wie ich diese flush() bei diesem Chat sonst noch einsetzen könnte, in Kombination mit der regelmäßigen Abfrage ...
    Tomarus ist offline

  2. #2 Zitieren
    Ehrengarde
    Registriert seit
    May 2004
    Ort
    Midgard
    Beiträge
    2.185
    Tja, fremde Codes sind immer etwas schwieriges. Deshalb sollte man seine Quellcodes auch selbst schreiben.
    Naja, die $db's werden ja in deiner Funktion definiert:
    PHP-Code:
    $db = new db_local
    $db ist in diesem Fall ein Objekt der Klasse db_local. Es hat also die Eigenschaften der Klasse db_local. Mit $db->query() greifst du über das Objekt $db auf die Funktion query() zu, die in der Klasse db_local definiert wurde. Für eine genauere Erläuterung wäre es sinnvoll, wenn du die definition der db_local-Klasse posten würdest. Denn dort sind die Funktionen definiert. Über die Okjekte, wie $db, werden sie nur benutzt.
    Das mit dem flush() musst du wohl nochmal erklären. Wieso und wo willst du das anwenden und warum? Oder findest du die Funktion einfach so toll, und willst sie deshalb möglichst häufig in deinem Code haben?

    freundliche Grüße, Rolus
    Rolus ist offline

  3. #3 Zitieren
    Drachentöter
    Registriert seit
    Feb 2004
    Beiträge
    4.053
    Zitat Zitat von Rolus
    Das mit dem flush() musst du wohl nochmal erklären. Wieso und wo willst du das anwenden und warum? Oder findest du die Funktion einfach so toll, und willst sie deshalb möglichst häufig in deinem Code haben?
    Öh ja genau, diese Funktion ist so toll >_>
    Für einen Chat, der halt regelmäßig neue Nachrichten abfragt, wenn neue vorhanden sind puffert er das vorhandene und gibt das zusammen mit dem neuen aus ... hab das inzwischen sogar vorerst hinbekommen, hat sich also für's erste erstmal geklärt >_>
    Und wegem dem $db, danke Hab das jetzt auch irgendwie gefunden, wusst halt nicht was da nun der genaue Unterschied ist ... wie auch immer, hätte sich dann auch geklärt.

    Der Code vom dem, was ich jetzt zusammenbekommen habe, ist dann doch deutlich kürzer als ich's gedacht hätte >_> Und sieht so aus ...
    PHP-Code:
        $select mysql_query ('SELECT `ID` FROM `chat_messages` ORDER BY `ID` DESC LIMIT 1');
        while (
    $row mysql_fetch_array ($select))
        {
            
    $aktuelleposition $row[0];
        }

        if (
    $position $aktuelleposition)
        {
            
    $select mysql_query ('SELECT `msg`, `user`, `zeit` FROM `chat_messages` WHERE `ID` > "'.$position.'"');
            while (
    $row mysql_fetch_array ($select))
            {
                
    $msg $row[0];
                
    $user $row[1];
                if (
    $user == '')
                {
                    
    $user 'Öhm ... niemand v.v';
                }
                
    $zeit date ('H:i'$row[2]);
                echo (
    '['.$zeit.'] '.$user.' &raquo; '.$msg.'<br />');
            }
        }
        
    $position $aktuelleposition;
        
    flush();
        
    usleep(500000); 
    Und das wiederholt sich dann in einer while-Schleife. Das einzige Problem, das jetzt noch auftritt, ist, dass er nach 30 Sekunden eine überschrittene max_execution_time meldet. Aber dafür müsste man dann ja wahrscheinlich nur noch einige Alternativausführung einbauen.
    Tomarus ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •