PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: flush() & db->query



Tomarus
01.02.2005, 16:51
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:


function stream ($chatuser, $chatroom)
{
global $host,$database,$user,$password,$stoolonginactive,$maxaway,$maxnoaway,$awayschut z,$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 ...

Rolus
01.02.2005, 17:11
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:

$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

Tomarus
01.02.2005, 18:21
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 ...


$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.