Sampower
Mitglied
Neuling
Dabei seit: 26.06.2010
Herkunft: keine Angabe
Posts: 2
Ein Chat in PHP realisiert. Zur Echtzeitkommunikation wird Ajax verwendet.
Zuerst kommt der PHP Teil.
Wir legen einen Ordner an und nennen wir "inc".
In diesem Ordner befindet sich eine "config.php" mit diesem Inhalt:
PHP
1:
2:
3:
4:
5:
6:
7:
8:
9:
<?php
$server = 'localhost' ;
$user = 'root' ;
$pass = '' ;
$db = 'chat' ;
$table = 'chattext' ;
mysql_connect ( $server , $user , $pass );
mysql_select_db ( $db );
?>
Natürlich muss man die Daten noch richtig anpassen.
Bei phpMyAdmin erstellst du eine Datenbank mit dem Namen "chat".
Dannach erstellen wir eine index.php mit diesem Inhalt:
PHP
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
<style type="text/css">
#textbox{
width:219px;
border:1px solid orange;
}
#textbox:focus{
border:1px solid #3399FF;
}
#button{
border:1px solid #FF1493;
cursor:pointer;
}
#button:hover{
border:1px solid #3399FF;
}
</style>
Diese Zeilen erkläre ich nicht da dies hier keine Seite ist um CSS zu lernen. Es dient nur dazu, die Buttons und Textboxen schöner zu gestalten!
Jetzt der Javascript/Ajax Teil:
PHP
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
<script type="text/javascript">
function loadXMLDoc()
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("ajax_chat").innerHTML=xmlhttp.responseText;
}
}
string = document.getElementById("ajax_chat").innerHTML;
xmlhttp.open("GET","ajax_loader.php?id="+string+"&blabla="+Math.random(),true);
xmlhttp.send();
}
</script>
Dieser Teil ist der wichtigste:
PHP
1:
2:
3:
xmlhttp.open("GET","ajax_loader.php?id="+string+"&blabla="+Math.random(),true);
xmlhttp.send();
}
Damit senden per GET die Variable "string" mit diesem Inhalt:
PHP
1:
document.getElementById("ajax_chat").innerHTML;
Jetzt kommt der PHP Teil (Datenbank schreiben, lesen usw..)
PHP
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
<?php
//Config auslesen
require_once( 'inc/config.php' );
echo '
<form action="index.php" method="post">
<table border="0">
<tr>
<th><span style="font-weight:normal;">Nickname:</span></th><td><input type="text" name="nick" value="' . htmlspecialchars ( $_POST [ 'nick' ]). '" id="textbox"></td>
</tr>
<tr>
<th><span style="font-weight:normal;">Nachricht:</span></th><td><input type="text" name="eintrag" value="' . htmlspecialchars ( $_POST [ 'eintrag' ]). '" id="textbox"> <input type="submit" name="eintragen" value="Senden!" id="button"> <input type="button" id="button" onClick="loadXMLDoc();" value="Reload"></td>
</tr>
</table>
<div id="ajax_chat" style="border:1px dotted black; width:402px; height:190px; padding:5px; overflow: auto;">' ;
$abfrage = mysql_query ( "SELECT chattextFROM $table " );
while( $row = mysql_fetch_array ( $abfrage ))
{
echo $row [ 'chattext' ]. '<br />' ;
} '
</div>' ;
if(isset( $_POST [ 'eintrag' ])){
if(empty( $_POST [ 'nick' ]) || empty( $_POST [ 'eintrag' ])){
echo '<script>alert("Bitte Nick oder Nachricht eingeben -.-")</script>' ;
}else{
//Variablen definieren und mit "POST" Daten füllen (Mit htmlspecialchars filtern..)
$nick = htmlspecialchars ( $_POST [ 'nick' ]);
$eintrag = htmlspecialchars ( $_POST [ 'eintrag' ]);
//Die 2 oben definierten Variablen zusammensetzen
$alles = '<span style="color:#FF1493">' . $nick . '</span>: <span style="color:#3399FF">' . $eintrag . '</span>' ;
//Nick + Eintrag in die Datenbank schreiben
mysql_query ( "INSERT INTO $table
(chattext) VALUES
(' $alles ')" );
}
}
?>
Dieser Code ist bereits kommentiert.
Nun erstellen wir eine "ajax_loader.php" mit diesem Inhalt:
PHP
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
<?php
$abfrage = $_GET [ 'id' ];
$neu = '' ;
//Config auslesen
require_once( 'inc/config.php' );
$ergebnis = mysql_query ( "SELECT chattext FROM $table " );
while( $row = mysql_fetch_array ( $ergebnis ))
{
$neu .= $row [ chattext ]. '<br /></div>' ;
}
if ( $abfrage !== $neu ){
echo $neu ;
}
Ja ist eigentlich logisch dieser Code..
$abfrage ist der alte Code und $neu der neue.
Ist der alte gleich wie der neue Code aktualisert es den Chat nicht, ansonsten schon.
Viel Spass ;-)
Post wurde schon 2x editiert, das letzte mal am 09.10.2015 um 22:00 von Andavos
26.06.2010, 12:11
Profil |
PM |
E-Mail
ubuntu
Mitglied
Aktiver User
Dabei seit: 19.04.2010
Herkunft: keine Angabe
Posts: 189
juhu, nach so was such ich schon länger
brauchte einfach nur nen chat für den body
26.06.2010, 14:11
Profil |
PM |
E-Mail
Gast
frage an erfahrene user: ist dass ding sicher? ich meine da gibt es keine sql injektion oder so oder??
28.06.2010, 00:41
B.C.
Mitglied
Sehr guter User
Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
Hi,
gebe in das Eingabefeld einfach mal ein ' ein und schicke es dann ab. Wenn dann ein MySQL-Fehler kommt,
war das eben eine erfogreiche SQL-Injektion. Ich befürchte, dass das bei dir der Fall sein wird.
Benutze dagegen die Funnktion mysql_real_escape_string() gegen solche Zeichen.
28.06.2010, 09:28
Profil |
PM |
E-Mail
BOBmoraine
Mitglied
Anfänger
Dabei seit: 16.10.2009
Herkunft: Aurich
Posts: 88
In Zeile 18 hat sich ein kleiner Fehler eingeschlichen:
PHP
1:
$abfrage = mysql_query("SELECT chattextFROM $table");
In Zeile 22-23 hat sich auch der Fehlerteufel eingeschlichen:
Gibt es als Erweiterung noch ne Funktion von Ajax die den Cursor ins "Nachricht"-Feld setzt, aber den Text daraus löscht? So das man dann antworten kann ohne seinen Namen noch mal eingeben zu müssen, aber einen neuen Text eingeben muss?
Bisher kann ich den Chat spammen in dem ich einfach ganz oft auf "Senden!" klicke...
php.net - Hier werden sie geholfen
Scriptly - Mein bevorzugter Editor
Post wurde schon 1x editiert, das letzte mal am 28.06.2010 um 14:34 von BOBmoraine
28.06.2010, 14:25
Profil |
PM |
E-Mail
B.C.
Mitglied
Sehr guter User
Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
Einfaches JavaSkript ...
document.formular.textfeld.value = ''; //leeren
und den Zeiger:
document.formular.textfeld.focus;
28.06.2010, 16:39
Profil |
PM |
E-Mail
Piri
Mitglied
Aktiver User
Dabei seit: 14.03.2010
Herkunft: keine Angabe
Posts: 167
Kann man den für die eigene Seite nutzen oder willst du das nicht das man den für seine eigene Seite nutz ?
Vielen Dank ! Für eure Hilfe
Mit freundlichen Grüßen
Piri
02.07.2010, 13:40
Profil |
PM |
E-Mail
Sampower
Mitglied
Neuling
Dabei seit: 26.06.2010
Herkunft: keine Angabe
Posts: 2
Hallo,
du darfst den Code auch für deine Seite brauchen.
Tatsächlich habe ich eine "Spam-Sperre" vergessen.
Ich werde es sobald ich Zeit habe umsetzen.
Mit freundlichen Grüssen
02.07.2010, 15:05
Profil |
PM |
E-Mail
Boxer1008
Mitglied
Aktiver User
Dabei seit: 26.07.2010
Herkunft: Deutsches Land
Posts: 216
kann man den reload der textbox irgendwie automatisieren?
ohen das man immer auf reload klciken muss?
und kann man, wenn die seite ein login system hat, das formular der user eingabe ausbauen und stattdessen irgendwie den usernamen mit dem der user eingeloggt ist reinschreiben?
Wir sind hier im:
Post wurde schon 1x editiert, das letzte mal am 15.08.2010 um 18:22 von Boxer1008
15.08.2010, 18:19
Profil |
PM |
E-Mail
Gast
Benutz setInterval()
Also: setInterval("loadXMLDoc()",5000);
15.08.2010, 18:24
Mogria
Mitglied
Sehr guter User
Dabei seit: 30.04.2010
Herkunft: Schweiz
Posts: 614
einfach die funktion die bei onclick ausgeführt wird jede sekunde durch rekursion wiederholen lassen.
PHP
1:
2:
3:
4:
5:
6:
7:
<script>
function auto_reload() {
loadXMLDoc();
window.setTimeout("autoreload();", 1000/* Zeit in Milli sekunden */);
}
document.addEventListener("load", auto_reload, true);
</script>
Ich hoff es funktioniert ^^
Post wurde schon 1x editiert, das letzte mal am 15.08.2010 um 18:28 von Mogria
15.08.2010, 18:25
Profil |
PM |
E-Mail
Boxer1008
Mitglied
Aktiver User
Dabei seit: 26.07.2010
Herkunft: Deutsches Land
Posts: 216
du kannst doch selbst löschen
bearbeiten, dann häkchen setzen löschen
erzeugt dieser script dann nicht einen ungeher hohen traffic?
Wir sind hier im:
Post wurde schon 1x editiert, das letzte mal am 15.08.2010 um 18:30 von Boxer1008
15.08.2010, 18:30
Profil |
PM |
E-Mail
Gast
Eher nicht, dazu ist ja Ajax gedacht
15.08.2010, 18:35
Boxer1008
Mitglied
Aktiver User
Dabei seit: 26.07.2010
Herkunft: Deutsches Land
Posts: 216
wie muss ich das denn dann in den script einbauen, damit es den reload button ersetzt?
Wir sind hier im:
15.08.2010, 18:41
Profil |
PM |
E-Mail
Gast
Im Javascript Code am ENDE die Funktion (setInterval("loadXMLDoc()",3000) einfügen.
PHP
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
<script type="text/javascript">
function loadXMLDoc()
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("ajax_chat").innerHTML=xmlhttp.responseText;
}
}
string = document.getElementById("ajax_chat").innerHTML;
xmlhttp.open("GET","ajax_loader.php?id="+string+"&blabla="+Math.random(),true);
xmlhttp.send();
}
setInterval("loadXMLDoc()",3000);
</script>
15.08.2010, 18:53
Boxer1008
Mitglied
Aktiver User
Dabei seit: 26.07.2010
Herkunft: Deutsches Land
Posts: 216
okay, das geht gut.
alerdings scrollt der leider nicht automatisch runter -> man muss immer erst zum neuen beitrag hinscrollen.
kann man den automatisch nach unten springen lassen?
Wir sind hier im:
15.08.2010, 19:11
Profil |
PM |
E-Mail
Gast
<form action="index.php#textbox"
15.08.2010, 19:13
Boxer1008
Mitglied
Aktiver User
Dabei seit: 26.07.2010
Herkunft: Deutsches Land
Posts: 216
?
Wir sind hier im:
15.08.2010, 19:15
Profil |
PM |
E-Mail
Gast
-.-'
änder action="index.php" zu action="index.php?textbox"
was daran so schwer?!
15.08.2010, 19:24
Boxer1008
Mitglied
Aktiver User
Dabei seit: 26.07.2010
Herkunft: Deutsches Land
Posts: 216
okay, jetzt trägt er es oben ein, auch gut, danke
Wir sind hier im:
15.08.2010, 19:29
Profil |
PM |
E-Mail
Boxer1008
Mitglied
Aktiver User
Dabei seit: 26.07.2010
Herkunft: Deutsches Land
Posts: 216
kann man den Chatverlauf eigentlich irgendwie löschen?
z.B. das da ein neuer button ist: verlauf löschen ?
und der löscht dann den inhalt der tabelle?
Wir sind hier im:
15.08.2010, 19:31
Profil |
PM |
E-Mail
Gast
Mach das doch manuell in PHPmyAdmin
Ein User sollte nicht so ein Recht haben.
15.08.2010, 19:32
Boxer1008
Mitglied
Aktiver User
Dabei seit: 26.07.2010
Herkunft: Deutsches Land
Posts: 216
Zitat:
Wie sich aus § 55 I Rundfunkstaatsvertrag (RStV) ergibt, trifft einen Anbieter somit nur dann keine Impressumspflicht und er kann seine Webseite völlig anonym ins Internet stellen, wenn sein Angebot ausschließlich persönlichen oder familiären Zwecken dient.
Darunter zählt meine Seite.
Und ich vertraue meiner Familie
Wir sind hier im:
15.08.2010, 19:34
Profil |
PM |
E-Mail
Gast
Zitat:
Orginal von Boxer1008
Zitat:
Wie sich aus § 55 I Rundfunkstaatsvertrag (RStV) ergibt, trifft einen Anbieter somit nur dann keine Impressumspflicht und er kann seine Webseite völlig anonym ins Internet stellen, wenn sein Angebot ausschließlich persönlichen oder familiären Zwecken dient.
Darunter zählt meine Seite.
Und ich vertraue meiner Familie
Was hat das damit zutun?!
15.08.2010, 19:35
Boxer1008
Mitglied
Aktiver User
Dabei seit: 26.07.2010
Herkunft: Deutsches Land
Posts: 216
könnte man es nicht eigentlich auch über eine if anweisung machen? also if user=Boxer108 (Beispiel, zum besseren verständniss) und nur dann kommt dieser button?
Wir sind hier im:
15.08.2010, 19:39
Profil |
PM |
E-Mail