Persze a Socket.IO-val lehet kapcsolatot kiépíteni PHP-val is, de akkor a szerver oldali kezelése a dolgoknak teljesen rád marad, és elárulom, nem egy egyszerű feladat. Na meg persze a kliens oldalon is kell egy pár (10-50) sor JavaScript-et írni.
Chat-et nem biztos hogy legcélszerűbb HTML alapokon megírni, de nem lehetetlen. Szerintem legkézenfekvőbb (legegyszerűbb) megoldás hogy JavaScript-tel x időközönként json/ajax kérést küldesz a szervernek ami megmondja hogy van-e új üzenet.
Én is AJAX-al oldottam meg. Én úgy csináltam, hogy amikor kiolvassa az összes chat beírást akkor egy rejtett mezőbe beírom az utolsó id-ját és frissítéskor ellenőrzöm, hogy létezik-e annál nagyobb id-jú hsz, és ha igen akkor kiírja és frissíti az utolsó id-t a rejtett mezőben.
hát gondolkodtam csinálnék egy olyat hogy felépek chatre akkor van ez a hidden és a az adatbázis sorokat elmendtem benne. Aztán olyat csinálnék hogy limittel ki küszöböljem hogy ne az egész adatbázist szomlja hanem a hidden lévö számtól. És ha változik akkor frissit egyet. Ez nem terheli??:(
Most még-egyszer:
Folyamatosan megy a szerver felé egy kérés (mondjuk 1 másodpercenként) ami lekéri hogy volt-e új üzenet. Ha volt akkor elküldi az üzenetet, ha nem akkor mondjuk false-t dob.
Ennél jobbat PHP+JS alakon "minden" böngészőt lefedve legjobb tudomásom szerint ma nem tudsz. Arra figyelj hogy ne küldözgesd minden másodpercben újra és újra a régi üzeneteket is ki. De a régi üzeneteket meg teljesen fölösleges hidden-ben (is) letárolni, épp elég a megjelenített <div>, <span>, akármiben.
megjegyzés: igen terheli a hálózatot "fölöslegesen", de ez van. Még a facebook is így csinálja. (ha jól emlékszek)
Az üzenet táblád mondjuk így nézhet ki. (Heap tipusú tábla, tehát a memóriában fog helyet foglalni, nem íródik lemezre).
CREATE TABLE message (
sender VARCHAR(20) NOT NULL,
message VARCHAR(160) NOT NULL,
time INT(11) NOT NULL,
PRIMARY KEY (time)
) ENGINE=Heap;
Ez a PHP fájl kiolvassa a getben kapott time változónál újabb üzeneteket. Ebbe mindig az utolsó megkapott üzenet idejét küld vissza neki. Első alkalommal még nincsneek üzeletek, ilyenkor az utolsó 5 másodperc üzeneteit kapod meg (utána csak az újakat, ha a jó timestampet küldöd vissza). Pl: /receive.php?time=1302686497
<?php
mysql_pconnect ("localhost", "user", "pass");
mysql_use_db ("chat");
$time = $_GET["time"] ? $_GET["time"] : time () - 5;
$result = mysql_query (sprintf ("SELECT * FROM message WHERE time > '%d'", mysql_real_escape_string ($time)));
$packet = array ();
while ($message = mysql_fetch_assoc ($result))
$packet[] = $message;
header ("Content-type: application/json");
echo (json_encode ($packet));
Küldéskor csak a tábla végére kell szúrni az üzenetet. (Feltételeztem, hogy a user azonosítója a sessionben tárolva van). Pl: /send.php?message=hello+haver
Fontos még, hogy egy CRON munkában (percenként), vagy akár új üzenet érkezésekor törlöd a régi üzenetket, enélkül csak megtöltik a memóriát. Pl (30 secnél régebbieket törli):
DELETE FROM message WHERE time < UNIX_TIMESTAMP(NOW()) - 30
Igazából egyik sem volt a szándékom, csak szemléltetni szerettem volna a módszert. Olvasd végig, gondolj át minden sort, mi miért van ott és úgy ahogy van és akkor tudsz írni magandak egy olyat ami 100%ban a te igényeidhez ileszkedik.
Copy-paste-eleheted is persze ha nem megtanulni, csak összeollózni akarod, de például kliensoldali (JS) kód nincs benne, azt mindneképpen neked kell megírnod.
Meg tudod oldani természetesen. A legegyszerűbb ha az SQL lekérdezésben unix_timestamp-é konvertálod a külön mezők adatait. De amúgy gondolom a táblád nincs kőbe vésve.
Nem megoldani szeretém helyetted a feladatot, leírtam egy lehetséges megoldást, amit prsze az igényeidhez tuningolhatsz. Szerintem kellő információ van benne hogy jó helyre tedd a dolgoka a feladattal kapcsolatban, innen már a mysql dokumentáció mindne érdésedre választ ad.
Mellesleg nemjó ötlet külön mezőkben tárolni a dátumot (hacsak nem valami spécispeciális feladatról van szó). Így sokkal bonyolultabb (és erőforrás-pazarló) az összeasonlítás például.
Már hogy a viharba futtatná le. Nézd meg az oldalad forrását. Az a funkció fog lefutni másodpercenként, nem a PHP amia szerveroldalon az oldal kiszolgálásakor egyszer legyártotta.
Ne kérj ki minden rekordot az adatbázisból, csak az utolsó frissítés óta érkezetteket.
Olvass el egy AJAX tutoriált. Számtalan remek cikk van itt a Weblaboron is meg máshol is. Mondjuk kezdheted itt:
A WHERE time > rész gondoskodik arról ,hogy csak az adott idő utáni üzenetek jöjjenek ki az adatbázisból.
Ha van egy while cikusod amit egyből (feltétel nélkül) break-elsz, akkor az nem ciklus, egyzserűen csak egyszer végrehajtódik. Ha ellenőriznia akrod hogy van-e üzenet azt így célszerű megtenni:
$record = mysql_fetch_assoc ($result);
if ($record) {
// van rekord
} else {
// nincs rekord
}
... de erről gondosokdik a példakód amit küldetm, azokat egy-az-egyben használhatod. Csak javascriptben kell megoldanod egy AJAX kérést (amit tiemoutba teszel).
köszönöm de annyi a hibám ha frissitek ajaxal akkor nem tok setTimeout-os parancsot inditani.
A kód:
Html és ajax rész:
<html>
<head>
<script type="text/javascript">
function ha_uj_uzenet()
{
xhr = new XMLHttpRequest();
xhr.onreadystatechange=function()
{
// Rendelkezésre áll az adat
if (xhr.readyState == 4 && xhr.status == 200)
{
document.getElementById('ujuzi').innerHTML = xhr.responseText;
setTimeout('ha_uj_uzenet()', 1000);
}
// Hibakód: 404
else if (xhr.status == 404)
{
document.getElementById('ujuzi').innerHTML = '--Uzenet vege--'
}
}
xhr.open("GET", "chat_frisites.php", true);
xhr.send(null);
}
// Request
window.onload = ha_uj_uzenet;
</script>
</head>
<body>
<div id="ujuzi">
</div>
</body>
</htlm>
chat_frisites.php:
<?php
$conn = include "config.php";
$time = $_GET["time"] ? $_GET["time"] : time()- 10;
$result = mysql_query(sprintf ("SELECT * FROM chat WHERE time > '%d'", mysql_real_escape_string ($time)));
$record = mysql_fetch_assoc ($result);
if ($record)
{
print '<script type="text/javascript">
setTimeout("frissit()", 1000);
</script>
';
}
?>
frissit() részt nem irom belle mert sztem az most nem lényeg.
Csak annyi a baj hogy ajax nem akarja frissiteni settimeouttal a frissit() részt.:(
nem tom megoldani.
amit vbence leirt abba nincs olyan ha változás van akkor frissitsen.
Alapjában véve a te kódodat copy-paste-eltem, úgyhogy az xhr.valami sorokat nem fogom külön kommentálni.
Ami fontos az az eval és a lastTime mondaköre. Ha megnézted a PHP kódot amit korábban küldtem ott az adatbázisból kijövő rekordokat egy PHP tömbbe tettük, majd json_encode kódolás után elküldüka kliensnek. (Ezen aponton feltételezném, hogy elolvastad a PHP dokumentációban mit is csinál pontosan). Most annyit mondanék róla, hogy egy PHP tömböt a JS által olvasható (és értelmezhető) formátumra konvertál.
Amikor az eval()-t futtatod ezen a JSON struktúrán, annak az eredménye ugyanaz a tömb lesz, amit a PHP oldalon feléptettünk.
Ezen ennek a tömbek minden eleme egy rekord az adatbázisból. for i ciklussal egyszerűen végigmegyünk rajta és az egyes rekordok mezőit el tudjuk érni, mint például record["sender"].
A documentdocument.innerHTML = document.innerHTML + ... rész pedig (vigyázz rosszul jelenik meg a colorer-ben, kétszer látszik a "document") a dokumentum vévre fűz egy HTML részt, amiben az éppen feldolgozott rekordot rjuk ki.
Hiba:
[i]document.body.innerHTML kéne legyen a [del]document.innerHTML[/del] helyett, ezt csak most vettem észre.
A lastTime változó moindig az eddig kapott legnagyobb timestamp-et tartalmazza, vagyis a legutolsó üzenet idejét. Ezt minden alkalommla leküldjüka szervernek, hogy csak az ennél újabbakat kapjuk meg.
Nem jön össze ez az ajax rész!!
Vagy is már megirtam ajax rész csak a GEt es részt nem tom hogy csináljam meg:(
<?php
$conn = include "config.php";
$time = $_GET["time"] ? $_GET["time"] : time()- 5;
$result = mysql_query(sprintf ("SELECT * FROM chat WHERE time > '%d'", mysql_real_escape_string($time)));
$record = mysql_fetch_assoc ($result);
if ($record) {
// ide nem tom mit irjak hogy chatbox divben frissitsen:(
// már mindent probáltam de nem volt jó:(
}
?>
(elnézést a dupla postért :( nem vedtem észre hogy már irtam:( )
Mindnekelőtt lég tisztába, a technológiákkal amiket használsz, nézz utána, mi a szokásos mód a probléma megoldására. Valószínűleg az lesz a legegyszerűbb és legkevesebb szívással járó módszer.
Ha bármi, egyetlen parancs, egyetlen funkciónév, egyetlen operátor nem egyértelmű, hogy mit csinál, miért van ott, miért ez és nem más van használva, nyisd meg az adott dokumentációt (hivatalos PHP, JS és HTTP dokumentáció), és olvasd el pontosab mit is csinál az adott részlet.
Két külön álló elemed van. Kliens oldal ahol JavaScript fut és szerver oldal ahol PHP fut. Teszeld őket egyenként. A kliensoldali JS-edet úgy, hogy nem egy PHP szkriptre irányítod a GET kérésedet, hanem készítesz egy text fájlt (amibe JSON-kódolt rekordokat írsz például, ahogy már ötször javasoltam :), és ezt a kliensoldalon DOM vagy innerHTML segítségével HZML tartalommá alakítod.
Esetleg írhatsz a fájlba kész html részletet is, amit egyszerűen csak egy div innerHTML-ének végére csapsz.
Ha ez működik, tesztelheted a szerveroldali (PHP szkriptedet). A tesztelés során nem az AJAX-os JS-eddel fogod lekérni a szkripted eredményét, egyszerűen csak beírod a böngészőben a szkript nevét, és ellenőrzöd, hogy a várt eredmény jön-e ki.
Ha mindkettő tökéletesen működik, összekapcsolhatod őket, és folytathatod így a tesztelést.
Én ilyet nem írtam. De a PHP szkripted kimenete ne JS legyen. Amúgy meg nincs értelme leírnom ugyanazt újra meg újra. Több posztban leírtam minden aspektusát a megoldásnak, példakódokkal stb. Ennél többet nem tudok segíteni.
<?php
$conn = include "config.php";
$time = $_GET["time"] ? $_GET["time"] : time()- 5;
$result = mysql_query(sprintf ("SELECT * FROM chat WHERE time > '%d'", mysql_real_escape_string($time)));
$record = mysql_fetch_assoc ($result);
if ($record) {
// ide nem tom mit irjak hogy chatbox divben frissitsen:(
// már mindent probáltam de nem volt jó:(
}
?>
hát ez a php oldalam de vbence mondta hogy ne php san csináljam hanem ajs leygen az alap és ugy a php :) ha mindent jól értelmezem:)
<html>
<head>
</head>
<script type="text/javascript">
function ha_uj_uzenet()
{
xhr = new XMLHttpRequest();
xhr.onreadystatechange=function()
{
// Rendelkezésre áll az adat
if (xhr.readyState == 4 && xhr.status == 200)
{
document.getElementById('ujuzi').innerHTML = xhr.responseText;
setTimeout('ha_uj_uzenet()', 1000);
}
// Hibakód: 404
else if (xhr.status == 404)
{
document.getElementById('ujuzi').innerHTML = '--Uzenet vege--'
}
}
xhr.open("GET", "chat_frisites.php", true);
xhr.send(null);
}
// Request
window.onload = ha_uj_uzenet;
</script>
<body>
<div id="ujuzi">
</div>
<div id="chatBox">
// itt jelenitem meg a chatet:)
</div>
</body>
</html>
chat_frisites.php
<?php
$conn = include "config.php";
$time = $_GET["time"] ? $_GET["time"] : time()- 10;
$result = mysql_query(sprintf ("SELECT * FROM chat WHERE time > '%d'", mysql_real_escape_string ($time)));
$record = mysql_fetch_assoc ($result);
if ($record)
{
// na ide nem tom mit irjak hogy a ChatBox be irja a változásokat:D
}
?>
Azt, hogy ebbe hogyan akarod beleintegrálni az adatbázist, az a te dolgod, bár nem ártana írni is abba az adatbázisba, nem csak olvasni belőle, mert lehet nincs mit olvasni belőle.
És megjön az adat? Figyelted a böngésződ fejleszőti eszközének Network / Hálózat fülét? Megjelent rajta a kérés? És mi volt a válasz tartalma? Nem lehet hogy nem jó választ adsz vissza?
Hát amikor irok a kliens oldalba
akkor ez a kód lejátszodik. Na de chatbox ba nem ir semmitse :(
(de amugy nem az ajaxos chatboxba hanem a kliensoldaliba kell)
itt a kód ami lejátszodik:
Én már 3 hónapja folyamatosan nézem ezt a témát, hogy lássam, végre sikerül-e ez a nem túl bonyolultnak mondható feladat.
Én annak idején, amikor egy olyan scriptet kellett írnom, ami folyamatosan ellenőrizte, ki van belépve, és ki nincs, az volt az első ajax scriptem, előtte ajax-szal egyáltalán nem foglalkoztam. A tanulással együtt néhány óra alatt kész volt.
Komolyan, sorry az offért, és hogy nem teszek hozzá semmi konstruktívat a témához, de ez szörnyű, ami itt zajlik. Én is segítettem már kriszrap-nak, nem ez ellen van kifogásom, hanem az ellen, hogy itt egyszerűen hiányzik az igyekezet, hogy amit tanácsoltok, azt a kérdező fél tisztelettudóan és belátóan fogadja. Egyszerűen nem hajlandó utánanézni egyszerű dolgoknak, ami alapvető ahhoz, hogy egyáltalán segíteni tudjatok neki. Tudom, ez a ti dolgotok, a ti időtök, a ti energiátok, de ez a hozzáállás, amit egyes kérdezőktől kaptok, lejáratja ezt a minőségi oldalt. Ha lenne olyan szavazás, amit már többször javasoltak, hogy csak egy bizonyos komolysági szint felett kerülhessen egy téma a fontos témák közé, biztos arra szavaznék.
Ennyi voltam, most már befejezem. :)
Hát én igyekezem van olyan nap hogy 6 órát ülök vagy többet gépnél hogy ezt megtudjam oldani de nagyon nem akarja az igazságot:(
megközbe ha tudok másik programozási nyelvet is űzök tanulok. na mind1
és Totti tényleg igazad van !!Már ellég segítséget kaptam:)
ááá meg van siker már csak anynit akarok hogy ugye
document.getElementById("chatBox").innerHTML +=xmlhttp.responseText; van ez a parancs
és ez a lap aljára rakja a dolgokat én a tetejére akarom hogyan??:)
csak aza baj hogy nem ezt akrtam ki hozni de sztem én irtam hülyén elnézést:)
annyit akarok hogy az új üzeneteket ne az aljára rakja hanem a tetejére:)
de ebben az esetben már nagyon örülnék ha /koveto -n nem ez a téma lenne az oldal tetején már.
(bár kicsit vicces volt olvasni a szenvedésed:) de a hozzáállásod nagy elkeserítő (minden vackot rögtön kérdezel), viszont a kitartásod becsülendő..)
Na de írd csak ide okulás véget.
szerkesztve: mit értesz az alatt hogy "nem müxik". Ha azt írod hogy nem működik akkor megkereslek és felpofozlak:)
Hibaüzenetet ad? nem csinál semmit? vagy?
(rég kódoltam nativan JS-t de szerintem az jó)
semmi baj este van már:)
Az elsöt teszteltem sikerült:)
köszönöm szépen mindenkinek:) hogy ki tartoan probáltak észt tunkolni a fejembe :) mégegyszer köszönöm:)
szerk.:
Ó még annyi nem akarok erre uj topikot nyitni és ezután zárok:D
azt hogy lehet mindt majd nem minden chatnél amikor uj üzi érkezik akkor jobbrol barra beszurj. ha értitek mire gondolok??:)
Nem hinném, hogy ebben a sorban lenne a hiba, de használj már végre egy debuggert. Opera alatt Dragonfly, Firefox alatt Firebug, Safari / Chrome alatt Fejlesztői eszközök, IE alatt F12 Fejlesztői eszközök / Developer Toolbar verziótól függően.
Több módszer
Például Node.js alatt megoldható nagyon egyszerűen a Socket.IO modul használatával, amiről a legutóbbi budapest.js-en tartottam is előadást.
Persze a Socket.IO-val lehet kapcsolatot kiépíteni PHP-val is, de akkor a szerver oldali kezelése a dolgoknak teljesen rád marad, és elárulom, nem egy egyszerű feladat. Na meg persze a kliens oldalon is kell egy pár (10-50) sor JavaScript-et írni.
JavaScript-tel
Én is AJAX-al oldottam meg.
Egyébként itt megtudod nézni ha érdekel.:
GhettoRadio
pinguka én is igy csinálnám
sessionra gondolsz??
mi a hiba??
<head>
<script language="JavaScript" type="text/javascript">
function ajax()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","index.php",true);
xmlhttp.send();
}
</script>
</head>
<body>
<form name="beir" method="POST" onSubmit="ajax();">
<input type="submit" onClick="ajax();" name="kuldes" class="button" value="Küldés">
</form>
</body>
</html>
igy pedig jo ha buttonnal csinálom:(
<input type="button" onClick="ajax();" name="kuldes" class="button" value="Küldés">
Egy rejtett input mezőre
Nézd át amit írtam: Chat.js
Nem állítom, hogy ez a legjobb megoldás, de működik hibátlanul.
Ez a html kódom a chat-hez.
Sikerül a frissités csak
már csak azt kell hogy csináljam meg hogy ha változás van frissitsen:D
setInterval('refresh()',
Bár nemtudom, hogy oldottad meg, de a setInterval-al tudod frissíteni.
de ez nem terheli a
de
Van egy cikk ebben a Valós idejű web Javascript alapokon – áttekintés címmel egyéb módszerekről.
ezt nem nagyon tom
"ha változik akkor frissit egyet."
Folyamatosan megy a szerver felé egy kérés (mondjuk 1 másodpercenként) ami lekéri hogy volt-e új üzenet. Ha volt akkor elküldi az üzenetet, ha nem akkor mondjuk false-t dob.
Ennél jobbat PHP+JS alakon "minden" böngészőt lefedve legjobb tudomásom szerint ma nem tudsz. Arra figyelj hogy ne küldözgesd minden másodpercben újra és újra a régi üzeneteket is ki. De a régi üzeneteket meg teljesen fölösleges hidden-ben (is) letárolni, épp elég a megjelenített <div>, <span>, akármiben.
megjegyzés: igen terheli a hálózatot "fölöslegesen", de ez van. Még a facebook is így csinálja. (ha jól emlékszek)
mi a hiba??
meg irtam csak az a baj hogy nem müködik:(
itt a kód:
Na ezt csak egyszer kérdezük le!!
mi a hiba??:(
Message polling
/receive.php?time=1302686497/send.php?message=hello+haverezt a kódót most kombináljam
Igazából egyik sem
Copy-paste-eleheted is persze ha nem megtanulni, csak összeollózni akarod, de például kliensoldali (JS) kód nincs benne, azt mindneképpen neked kell megírnod.
de az adatbázisba
De
Nem megoldani szeretém helyetted a feladatot, leírtam egy lehetséges megoldást, amit prsze az igényeidhez tuningolhatsz. Szerintem kellő információ van benne hogy jó helyre tedd a dolgoka a feladattal kapcsolatban, innen már a mysql dokumentáció mindne érdésedre választ ad.
Mellesleg nemjó ötlet külön mezőkben tárolni a dátumot (hacsak nem valami spécispeciális feladatról van szó). Így sokkal bonyolultabb (és erőforrás-pazarló) az összeasonlítás például.
áááá nem megy probálozom de
{
<?php
$conn = include "config.php";
$time = $_GET["time"] ? $_GET["time"] : time()- 5;
$result = mysql_query(sprintf ("SELECT * FROM chat WHERE time > '%d'", mysql_real_escape_string ($time)));
while($sorok = mysql_fetch_assoc ($result))
{
$bejovok++;
break;
}
if($bejovok == 1)
{
print "setInterval('chat_kuldes()', 1000);";
}
?>
}
setInterval('frissitese()', 1000);
szerk.:
rájöttem hogy
setInterval('frissitese()', 1000);
valamiért nem akarja lefuttatni a php-t:(
Már hogy a viharba futtatná
Ne kérj ki minden rekordot az adatbázisból, csak az utolsó frissítés óta érkezetteket.
Olvass el egy AJAX tutoriált. Számtalan remek cikk van itt a Weblaboron is meg máshol is. Mondjuk kezdheted itt:
http://weblabor.hu/cikkek/valos-ideju-web-javascript-alapokon
sikerült már csak annyi ajax
ez a ajax
ide ilyen irtam:
Így nem tudok segíteni
megnézi hogy van e új üzi Nem
A WHERE time > rész
WHERE time >rész gondoskodik arról ,hogy csak az adott idő utáni üzenetek jöjjenek ki az adatbázisból.Ha van egy
whilecikusod amit egyből (feltétel nélkül) break-elsz, akkor az nem ciklus, egyzserűen csak egyszer végrehajtódik. Ha ellenőriznia akrod hogy van-e üzenet azt így célszerű megtenni:köszönöm de annyi a hibám ha
A kód:
Html és ajax rész:
Csak annyi a baj hogy ajax nem akarja frissiteni settimeouttal a frissit() részt.:(
nem tom megoldani.
amit vbence leirt abba nincs olyan ha változás van akkor frissitsen.
JSON rekordok olvasása
el magyaráznád hogy mi mit
Alapjában véve a te kódodat
Ami fontos az az eval és a lastTime mondaköre. Ha megnézted a PHP kódot amit korábban küldtem ott az adatbázisból kijövő rekordokat egy PHP tömbbe tettük, majd json_encode kódolás után elküldüka kliensnek. (Ezen aponton feltételezném, hogy elolvastad a PHP dokumentációban mit is csinál pontosan). Most annyit mondanék róla, hogy egy PHP tömböt a JS által olvasható (és értelmezhető) formátumra konvertál.
Amikor az eval()-t futtatod ezen a JSON struktúrán, annak az eredménye ugyanaz a tömb lesz, amit a PHP oldalon feléptettünk.
Ezen ennek a tömbek minden eleme egy rekord az adatbázisból. for i ciklussal egyszerűen végigmegyünk rajta és az egyes rekordok mezőit el tudjuk érni, mint például record["sender"].
A documentdocument.innerHTML = document.innerHTML + ... rész pedig (vigyázz rosszul jelenik meg a colorer-ben, kétszer látszik a "document") a dokumentum vévre fűz egy HTML részt, amiben az éppen feldolgozott rekordot rjuk ki.
Hiba:
[i]document.body.innerHTML kéne legyen a [del]document.innerHTML[/del] helyett, ezt csak most vettem észre.
A lastTime változó moindig az eddig kapott legnagyobb timestamp-et tartalmazza, vagyis a legutolsó üzenet idejét. Ezt minden alkalommla leküldjüka szervernek, hogy csak az ennél újabbakat kapjuk meg.
én ezt szerintem hagyom sajna
van egy uj divem amibe fut az ajax és van a chatbox amit frissiteni kéne ajaxal? hogy??
ha értitek??
AJAX
document.getElementById('uj_u
akkor ez mire való ? az hogy hol jelenitse meg a dolgokatT?:)
Igen
innerHTMLsegítségével helyezed el a kiválasztott elemben a tartalmat.Vagy is ez nem kell ha futt
Nem értem
annyi ha egy cilus megy le
Nem jön össze ez az ajax
Vagy is már megirtam ajax rész csak a GEt es részt nem tom hogy csináljam meg:(
Ajax
Ha bármi, egyetlen parancs, egyetlen funkciónév, egyetlen operátor nem egyértelmű, hogy mit csinál, miért van ott, miért ez és nem más van használva, nyisd meg az adott dokumentációt (hivatalos PHP, JS és HTTP dokumentáció), és olvasd el pontosab mit is csinál az adott részlet.
Két külön álló elemed van. Kliens oldal ahol JavaScript fut és szerver oldal ahol PHP fut. Teszeld őket egyenként. A kliensoldali JS-edet úgy, hogy nem egy PHP szkriptre irányítod a GET kérésedet, hanem készítesz egy text fájlt (amibe JSON-kódolt rekordokat írsz például, ahogy már ötször javasoltam :), és ezt a kliensoldalon DOM vagy innerHTML segítségével HZML tartalommá alakítod.
Esetleg írhatsz a fájlba kész html részletet is, amit egyszerűen csak egy div innerHTML-ének végére csapsz.
Ha ez működik, tesztelheted a szerveroldali (PHP szkriptedet). A tesztelés során nem az AJAX-os JS-eddel fogod lekérni a szkripted eredményét, egyszerűen csak beírod a böngészőben a szkript nevét, és ellenőrzöd, hogy a várt eredmény jön-e ki.
Ha mindkettő tökéletesen működik, összekapcsolhatod őket, és folytathatod így a tesztelést.
ez a kliens oldal<script
$conn = include "config.php";
$time = $_GET["time"] ? $_GET["time"] : time()- 5;
$result = mysql_query(sprintf ("SELECT * FROM chat WHERE time > '%d'", mysql_real_escape_string($time)));
$record = mysql_fetch_assoc ($result);
if ($record) {
print'<script type="text/javascript">
';
print "document.getElementById('ChatBox').innerHTML = 'csá';";
print'<script>';
}
?>
meg azt mondod ne php alapon csináljam??:)
PHP
Én ilyet nem írtam. De a PHP szkripted kimenete ne JS legyen. Amúgy meg nincs értelme leírnom ugyanazt újra meg újra. Több posztban leírtam minden aspektusát a megoldásnak, példakódokkal stb. Ennél többet nem tudok segíteni.
hát de sztem csak JS lehet
meg ajax de az js alapu.
JavaScript
chat.phppéldául a következőket tartalmazza:function ha_uj_uzenet() {
PHP
<?php $conn = include
<?php $conn = include
amugy eddig én is el jutodtam
Töltsd fel valahova
na akkor kliens
kliens oldal:
Egyben
chat.php -ba mit irjak??:)
chat.php
Sajna megint nem jó ha van uj
igy csináltam
ajax frissites
Megjön?
Hát amikor irok a kliens
akkor ez a kód lejátszodik. Na de chatbox ba nem ir semmitse :(
(de amugy nem az ajaxos chatboxba hanem a kliensoldaliba kell)
itt a kód ami lejátszodik:
3 hónap
Én annak idején, amikor egy olyan scriptet kellett írnom, ami folyamatosan ellenőrizte, ki van belépve, és ki nincs, az volt az első ajax scriptem, előtte ajax-szal egyáltalán nem foglalkoztam. A tanulással együtt néhány óra alatt kész volt.
Komolyan, sorry az offért, és hogy nem teszek hozzá semmi konstruktívat a témához, de ez szörnyű, ami itt zajlik. Én is segítettem már kriszrap-nak, nem ez ellen van kifogásom, hanem az ellen, hogy itt egyszerűen hiányzik az igyekezet, hogy amit tanácsoltok, azt a kérdező fél tisztelettudóan és belátóan fogadja. Egyszerűen nem hajlandó utánanézni egyszerű dolgoknak, ami alapvető ahhoz, hogy egyáltalán segíteni tudjatok neki. Tudom, ez a ti dolgotok, a ti időtök, a ti energiátok, de ez a hozzáállás, amit egyes kérdezőktől kaptok, lejáratja ezt a minőségi oldalt. Ha lenne olyan szavazás, amit már többször javasoltak, hogy csak egy bizonyos komolysági szint felett kerülhessen egy téma a fontos témák közé, biztos arra szavaznék.
Ennyi voltam, most már befejezem. :)
Hát én igyekezem van olyan
megközbe ha tudok másik programozási nyelvet is űzök tanulok. na mind1
és Totti tényleg igazad van !!Már ellég segítséget kaptam:)
na mind1 térjünk vissza a
document.getElementById("chatBox").innerHTML +=xmlhttp.responseText; van ez a parancs
és ez a lap aljára rakja a dolgokat én a tetejére akarom hogyan??:)
String
Ez már csak HTML
csak aza baj hogy nem ezt
annyit akarok hogy az új üzeneteket ne az aljára rakja hanem a tetejére:)
te hülyülsz?
de mingyárt vége:) a jó kódót
személy szerint preferálom
(bár kicsit vicces volt olvasni a szenvedésed:) de a hozzáállásod nagy elkeserítő (minden vackot rögtön kérdezel), viszont a kitartásod becsülendő..)
Na de írd csak ide okulás véget.
szerkesztve: mit értesz az alatt hogy "nem müxik". Ha azt írod hogy nem működik akkor megkereslek és felpofozlak:)
Hibaüzenetet ad? nem csinál semmit? vagy?
(rég kódoltam nativan JS-t de szerintem az jó)
rendben :)
<head>
</head>
<script type="text/javascript">
function chat_ellenorzes()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("chatBox").innerHTML=document.getElementById("chatBox").innerHTML+xmlhttp.responseText;
}
}
xmlhttp.open("GET","chat_frisites.php",true);
xmlhttp.send();
}
setInterval('chat_ellenorzes()', 5000);
</script>
div id="chatBox">
</div>
</html>
chat_frisites.php:
<?php
session_start();
$nick= "".$_SESSION['nick'];
header('Content-Type: text/html; charset=ISO-8859-2');
include "config.php";
$time = $_GET["time"] ? $_GET["time"] : time() - 5;
$result = mysql_query(sprintf ("SELECT * FROM chat WHERE name !='$nick' AND time > '%d'", mysql_real_escape_string($time)));
$record = mysql_fetch_assoc ($result);
if ($record)
{
$query = mysql_query(sprintf ("SELECT * FROM chat WHERE name !='$nick' AND time > '%d'", mysql_real_escape_string($time)));
while($a=mysql_fetch_assoc($query)){
$message=$a['message'];
echo'
#'.$a['id'].' Név: <a class="b" href="profil.php?id='.htmlspecialchars(urlencode($a['idje'])).'">'.$a['name'].'</a> ||Mikor: '.$datum.'<br>||Üzenet: '.iconv("UTF-8", "ISO-8859-2", urldecode($message)).'||<br><br>';
}
}
?>
Kód színezöt most nem használtam:)
szerk.:
annyi hogy ugyan ugy az aljára rakja a szöveget.
igazad van
semmi baj este van már:)Az
Az elsöt teszteltem sikerült:)
köszönöm szépen mindenkinek:) hogy ki tartoan probáltak észt tunkolni a fejembe :) mégegyszer köszönöm:)
szerk.:
Ó még annyi nem akarok erre uj topikot nyitni és ezután zárok:D
azt hogy lehet mindt majd nem minden chatnél amikor uj üzi érkezik akkor jobbrol barra beszurj. ha értitek mire gondolok??:)
nem értelek....
- nem! legalábbis én nem, de meglepődnék ha valaki igen! :)
Fuss neki még egyszer:)
és szerintem nyugodtan nyithatsz új témát.
hát amikor új üzi érkezik
jQuery
Na ezt a jQuery sok ajax-nal
Annyi bajom hogy apach szerveren müködik hogy a div tetejére irassa ki az ajax a szöveget .
de suli szeróján nem jó:(
másik megoldást is proszáltam de asse jó:(
Használd a debuggert
okés ez is sikerült:)