by:

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



Name:
Was ist das ohne capcha?

Name:
M Price of abilify maintena L
I http://ktpm.hoasen.edu.vn/node/134 Where can i buy benadryl for cats H
E http://info.terrifictales.net V
M Buy ventolin inhaler united states X
M http://antutulabs.com/node/521 Does mobic 15 mg get you high R C Price of xenical in malaysia T
S http://fccan.org/how-long-get-cipro-out-system-cipro-online-order Volo low cost bologna cipro L B Where can i buy nolvadex in canada U
C http://micro.sci-toys.com/node/982 Where can i get propecia online X

Name:
Notice: Use of undefined constant content - assumed 'content' in D:\VSERVER\www\orishout\index.php on line 54

Notice: Undefined index: content in D:\VSERVER\www\orishout\index.php on line 54

Name:
Hi coole shoutbox ...

Name:
Hallo ich,

das Script ist schon etwas in die Jahre gekommen.
Leider fehlt mir die Zeit es neu zu schreiben, es sollte aber trotzdem noch funktionieren.
Der Fehler mit dem Request hat vermutlich damit zu tun das du die $url nicht angepasst hast.
Wie gesagt, leider hab ich keine Zeit das ganze mit jquery neu zuschreiben, lade dich hierzu aber herzlich ein.

LG
Andreas

Name:
Mein php meckert über die Zeilen 53, 27, 42 und 43 und vorher kommt noch diese blöde Alert-Box \\\"Bei dem Request ist ein Problem aufgetreten\\\" ... Nach Fehlerkorrekturen bleibt Restmüll, den ich nicht beseitigen kann. Könnte das bitte mal jemand überarbeiten, damit der Pfad automatisch korrekt ermittelt wird und alles auch mit aktuellen PHP-Versionen ohne ständig nervende Fehlermldungen funktioniert ?

Danke

Name:
leider geht der download bei mir nicht !

Name:
Kleine Erweiterung, wodurch die Kommentare zus. mit dt. Datum und Zeit versehen werden:

Suche:
//config

$filename=\"content.txt\";
// be sure the file have write permissions

Ersetze mit:
//config

$filename=\"content.txt\";
// be sure the file have write permissions
setlocale (LC_TIME, \"de_DE\");
$zeitpunkt = strftime(\"%x - %X\");

----------

Suche:
function add_content(){
global $filename;

Ersetze mit:
function add_content(){
global $filename;
global $zeitpunkt;

-------------

Suche:
//add content
$_SESSION[\"nick\"]=$_POST[nick];
$somecontent=strip_tags($_POST[nick]).\": \".strip_tags($_POST[content]).\"
n\";

Ersetze mit:
//add content
$_SESSION[\"nick\"]=$_POST[nick];
$somecontent=strip_tags($_POST[nick]).\" (\" . $zeitpunkt . \"):
\" . strip_tags($_POST[content]) . \"
\\n\";

Greez Ming

P.S.: Der Vollständigkeit halber - das Font-Element ist deprecated, solltet Ihr also durch CSS-Stylesheet ersetzen.
Z. B.:

...TEXT...


Name:
Hallo Andreas,

der Wunsch hier in den Kommentaren von Stefan (\"...neue Beiträge oben statt unten anzuzeigen\" - DESC statt ASC) und Deine Lösung dazu funktioniert gut, ABER...

...der neueste Beitrag wird so zwar ganz \"oben\" statt \"unten\" angezeigt, jedoch wird der Cursor bei jedem Request weiterhin am Ende der Anzeige, statt ebenfalls am Anfang positioniert! :(

Hast Du dafür auch eine \"schnelle\" Lösung?

LG
Ming

Name:
Das grund Problem ist, das die Sicherheitseinstellungen von Browser besagen, das man nicht von fremden Server via JavaScript im Browser daten nachladen darf. Da man sowas potentiel auch ausnutzen könnte um z.b. eine Verteilte Denial of Service attacke ohne des Wissens vom Nutzer ausführen könnte.

Daher muss die Ajaxanfrage auf den gleichen Server gehen, wo auch das Script liegt. Es macht z.b. ein unterschied wenn das Script auf www.codejungle.org/shoutbox/ liegt die Ajaxanfrage aber auf codejungle.org/shoutbox/ geht...

Da wie gesagt die Sicherheitseinstellungen vom Browser anfragen auf fremde Server verbietet, sogar wenn, wie in diesem Fall es der Selber server nur unter anderen namen ist...

LG

Andreas

Name:
Hallo Andreas,

ganz angetan von Deiner hier funktioniernden Demoversion versuchte ich dies auf meinem Server, leider mit der hier schon mehrfach erwähnten Request-Fehlermeldung! :(
Ich habe:
- die Datei hier gedownloaded
--das (Unter-)verzeichnis angepasst (Deinen URL-Workarround hast Du in der Downlaoddatei ja schon eingebaut!)
- die Rechte sogar auf 777 gesetzt...

...und dennoch :(
I-welche Ideen, woran es liegen könnte?

LG Ming


Eingesetzte Browser = aktuelle IE, FF und Opera

Name:
naja, ich glaube der chat sollte nicht ein neuladen der seite verursachen, tut er jetzt.
habe daran rumgebastelt, aber habe alle codes zusammenbehalten, da fehlt nichts...

und die umlaute kommen bei mir unschön rüber.

Name:
Vielen Dank!
Ich bin dabei mit 2 anderen eine Webseite auf 1&1 zu erstellen. Ich bin noch der einzige Coder im Team, bin in PHP aber sicher.
Ich musste am Code nur den Url ändern, und zack, er passt schon.
Hin und wieder spuckt er einen request fehler aus, habe ihn einfach rauskommentiert :D

Auf meiner Seite haben sich die teilnehmer auf der schnellen chatregistrierung schon ausgetobt.
wenn ich die Content.txt wieder lösche, geht es aber meist die ersten 6 nachrichten nicht.

ich werde das ganze jetzt mal meinen bedürfnissen anpassen, dürfte nicht allzuschwer sein, eine benutzerdatenbank existiert schon.

Name:
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

Name:
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!

Name:
Hi, Interessant wäre auch noch eine Funktion um gewisse Inhalte auch wieder löschen zu können. mfg

Name:
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

Name:
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

Name:
Schade is nur, dass die neuesten einträge nicht ganz oben sind :) oder geht das irgendwie?

Name:
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

Name:
Dies hat er leider im Post davor nicht übernommen


Mit dem " include ("datei.php");" Funktioniert es auch irgendwie nicht.

Name:
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
Funktioniert es auch irgendwie nicht.

LG
Alex

Name:
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

Name:
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

Name:
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

Name:
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

Name:
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

Name:
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?

Name:
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

Name:
Danke klappt gut. Nur bei weiteren male, kann man den NICK nicht mehr ändern, außer Browser schließen und nochmals ausführen.