Adatátvitel több fél között (chat)
Sziasztok azt hogy tudom meg csinálni hogy ha irnak chatbe (phpés) akkor a másikfélnek frissitsen?:)
■ H | K | Sze | Cs | P | Szo | V |
---|---|---|---|---|---|---|
28 | 29 | 30 | 31 | 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 | 1 |
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+haver
ezt 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
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: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
innerHTML
segí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.php
pé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:)