Shoutbox mit PHP und Ajax
Hallo,
nachdem mir heute etwas langweilig war und ich alles machen wollte, nur nicht das was ich sollte, hier ein kleiner Script der eine Shoutbox erzeugt.
Das Besondere ist, er kommt ohne Datenbank aus und benutzt ajax damit neu hinzugefügte Inhalte gleich angezeigt werden. Man kann ihn also auch als simplen Chatscript benutzen. Noch nicht implementiert sind Smilies, sollte sich aber mit str_replace recht einfach umsetzen lassen.
Source Code Downloaden | Demo
Code
<?php
# Shoutbox 1.0
# by Andreas Beder
# codejungle.org
# Licence GNU GPL 2
//config
$filename="content.txt";
// be sure the file have write permissions
$url="http://www.codejungle.org/shoutbox/";
//function
function get_content(){
global $filename;
$lines = file ($filename);
$start = count($lines)-12;
if ($start < 1) $start = 1;
for ($i = $start; $i < count ($lines); $i++){
$somecontent.=stripslashes($lines[$i]);
}
return $somecontent;
}
function add_content(){
global $filename;
if($_POST[submit] and $_POST[nick] and $_POST[content]){
//check content
//add content
$_SESSION["nick"]=$_POST[nick];
$somecontent=strip_tags($_POST[nick]).": ".strip_tags($_POST[content])."<br/>n";
$handle = fopen($filename, 'a+');
fwrite($handle, $somecontent);
}
}
function output_form(){
echo '
<form action="" method="post">
Nick:';
if($_SESSION[nick]){echo $_SESSION[nick].'<input type="hidden" name="nick" value="'.$_SESSION[nick].'"><br>';} else { echo '<br>
<input name="nick" type="text" value="'.$_SESSION[nick].'"><br>'; }
echo'
Text:<br>
<textarea rows="5" cols="100" name="content"></textarea><br>
<input type="submit" name="submit" value="save">
</form>
';
}
if($_GET[content]=="true"){
echo get_content();
die();
}
?>
<html>
<head>
<title>shoutbox demo</title>
<script type="text/javascript" language="javascript">
var http_request = false;
function macheRequest(url) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
// zu dieser Zeile siehe weiter unten
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
return false;
}
http_request.onreadystatechange = alertInhalt;
http_request.open('GET', url, true);
http_request.send(null);
}
function alertInhalt() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
document.getElementById("shoutbox").innerHTML=http_request.responseText;
var objDiv = document.getElementById("shoutbox");
objDiv.scrollTop = objDiv.scrollHeight;
setTimeout('macheRequest("<?php echo $url; ?>?content=true")',2000);
} else {
alert('Bei dem Request ist ein Problem aufgetreten.');
}
}
}
</script>
</head>
<body onload="macheRequest('<?php echo $url; ?>?content=true');">
<? add_content(); ?>
<div style="border:1px solid #ccc; width:500px; height:300px; max-height:300px; overflow:auto;"
name="shoutbox" id="shoutbox">
</div>
<? output_form(); ?>
</body>
</html>
Beachte, dass die content.txt Schreibrechte für den Webserver haben sollte.
Unter *nix geht das folgendermaßen:
chmod 640 content.txt && chown nobody:nogroup content.txt
Ich hoffe euch hat mein Script gefallen, über Verbesserungsvorschläge freue ich mich natürlich auch.
LG
Andreas
2008-10-11 00:46:14
|
hallo peter,
leider konnte ich dich via email nicht erreichen, wenn dein problem noch aktuell ist, kannst du mir gerne dein source code schicken (andreas@codejungle.org) und ich schaus mir dann mal an.
lg
andreas
ich versteh einfach nicht wie ich das script in meine seite einbauen kann... ich benutze einen html editor.. bin noch ziemlicher anfänger und brauche dringend hilfe!
Hi, Interessant wäre auch noch eine Funktion um gewisse Inhalte auch wieder löschen zu können. mfg
Hallo Adreas,
super Skript!
als verbesserung könnte der vorredner gesagt hat, das man nur die letzten zeilen laden tut, vl. noch seiten navigation seite 1 ersten 12 zeile, seite2 zeilen 13-25 aus der datei :-)
ansonsten super skript läst sich gut erweitern.
Grüße
masa
hallo stefan,
natürlich geht das irgendwie :)
ersetz einfach get_content mit folgenen bsp:
function get_content(){
global $filename;
$lines = file ($filename);
$start = count($lines);
if ($start < 1) $start = 1;
$end=$start-12;
while($start>$end){
$start--;
$somecontent.=stripslashes($lines[$start]);
}
return $somecontent;
}
lg
andreas
Schade is nur, dass die neuesten einträge nicht ganz oben sind :) oder geht das irgendwie?
Hallo Alex,
so spontan kann ich dir auch nicht weiterhelfen.
allerdings könntest mir deinen code mal mailen und ich schau mal drüber.
lg
andreas
Dies hat er leider im Post davor nicht übernommen
Mit dem " include ("datei.php");" Funktioniert es auch irgendwie nicht.
Hi,
eine Frage habe ich noch.
Ich würde die Shoutbox gerne in meine HP einbauen. Wie kann ich das realisieren?
Habe den Code versucht in meine bestehende php-Seite einzufügen... allerdings sieht es so aus als würde er die gesamte Website in den Kasten zu Requesten.
Mit dem include ("datei.php"); ?>
Funktioniert es auch irgendwie nicht.
LG
Alex
hi alex,
also wichtig wäre das du die variabel $url
auf http://www.xperts-online.com/1/SHB/Twitter2.php zeigen lässt, dann sollte es kein probleme mehr geben ;)
happy hacking
andreas
Hi, ich bins noch mal :)
Danke für die schnelle Antwort.
ich habe jetzt meine Adresse eingegeben. Leider bekomme ich jetzt die Fehlermeldung "Bei dem Request ist ein Problem aufgetreten". content.txt erstelt, Adresse geändert.
Woran kanns jetzt noch liegen?
Alex
Hallo Alex,
was ich so sehe liegt das an folgener zeile :
$url="http://www.codejungle.org/shoutbox/";
da sollte natürlich deine url stehen ;)
lg
andreas
Hi,
das ist genau das wonach ich gesucht habe... große Klasse!
leider funktioniert das nicht...
Im content.txt steht zwar alles drin nur es wird nicht auf der Seite angezeigt.
Woran könnte das liegen?
Alex
Hallo Oliver,
ich habe die Shoutbox leider noch nicht unter IE8 getestet, habe aber eine
Theorie, wieso es nicht angezeigt bzw aktualisiert wird.
Durch die Sicherheitseinstellungen im Browser werden Anfragen von fremden Servern
nicht interpretiert.
Folgende Variabel gibt an wo der Script liegt:
$url="http://www.codejungle.org/shoutbox/";
Wenn du jetzt aber auf http://codejungle.org/shoutbox/ gehst, wirst du feststellen, dass der Inhalt
nicht geladen wird, da die Domain ohne www als ein anderer Server interpretiert wird und
von den oben genannten Sicherheitseinstellungen blockiert wird...
Folgender Workarround sollte helfen dieses Problem zu lösen:
$url="http://$_SERVER[SERVER_NAME]/";
Ich hoffe ich konnte dir weiterhelfen, und wünsch dir ein schönes Wochenende.
Andreas
Hallo ich teste dein Script gerade.
Es funktioniert unter Mozilla einwandfrei.
Nur unter dem IE 8 aktualisiert er nicht.
Ich kann vom IE aus Nachrichten schreiben.
Die erscheinen aber nicht im IE, im Mozilla aber schon.
Ich sehe im IE durchaus auch Text aber nur den, der da war als ich den Browser initital geöffnet habe. Weitere Updates ignoriert er biss ich ihn ganz zu und wieder auf mache.
Bei deinem Demo funktioniert das aber.
Ich habe deinen Code 1:1 kopiert für diesen Test.
Woran könnte das liegen?
Hallo Tester,
das der Nick nicht mehr änderbar ist war an sich auch so gedacht, lässt sich allerdings leicht modefizieren..
Schau einfach mal inder Zeile mit if($_SESSION[nick])
Ansonsten habe ich das Script auch etwas geändert, dass nur noch die letzten 12 zeilen geladen werden, das erhöht die geschwindickeit und spart etwas bandbreite.
lg
andreas
Danke klappt gut. Nur bei weiteren male, kann man den NICK nicht mehr ändern, außer Browser schließen und nochmals ausführen.















