ugrás a tartalomhoz

Adatátvitel több fél között (chat)

kriszrap · 2011. Feb. 17. (Cs), 23.08
Sziasztok azt hogy tudom meg csinálni hogy ha irnak chatbe (phpés) akkor a másikfélnek frissitsen?:)
 
1

Több módszer

Poetro · 2011. Feb. 17. (Cs), 23.28
De mindegyik JavaScript tudást igényel:
  • WebSocket
  • Adobe® Flash® Socket (Flash + JavaScipt kapcsolat)
  • AJAX long polling
  • AJAX multipart streaming
  • Forever Iframe
  • JSONP Polling

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.
2

JavaScript-tel

solkprog · 2011. Feb. 17. (Cs), 23.34
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.
3

Én is AJAX-al oldottam meg.

pinguka · 2011. Feb. 17. (Cs), 23.46
É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.

Egyébként itt megtudod nézni ha érdekel.:

GhettoRadio
4

pinguka én is igy csinálnám

kriszrap · 2011. Feb. 18. (P), 14.47
pinguka én is igy csinálnám de ez rejtemezöt azt hogy érted??
sessionra gondolsz??
mi a hiba??
<html>
<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">
5

Egy rejtett input mezőre

pinguka · 2011. Feb. 18. (P), 17.41
Egy rejtett input mezőre gondoltam, nem session-re!
<input type="hidden" name="valami" value="" />
Amit te csináltál attól ne várj sokat. Az így nem ajax. Sehol nem adod át a PHP-nak azt hogy pl. mit írt az illető.

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.

<div id="chatPanel">
	<div id="messages">
	</div>
	<div id="inputPanel">
	<label>
	Név:
	<input type="text" id="cName" value="" size="15" />
	</label>
	<label>
	Üzenet:
	<input type="text" id="cText" value="" size="50" />
	</label>
	<input type="hidden" value="" id="last" />
	<button id="send">Beküld</button>
	</div>
</div>
6

Sikerül a frissités csak

kriszrap · 2011. Feb. 20. (V), 21.42
Na sikerült megoldanom:D
már csak azt kell hogy csináljam meg hogy ha változás van frissitsen:D
7

setInterval('refresh()',

pinguka · 2011. Feb. 20. (V), 23.42
setInterval('refresh()', 5000);
a refresh helyére természetesen az ajax függvény neve kell.
Bár nemtudom, hogy oldottad meg, de a setInterval-al tudod frissíteni.
8

de ez nem terheli a

kriszrap · 2011. Feb. 21. (H), 21.12
de ez nem terheli a adatbázist?? hogy 5 másodpercenként lekérdez???
9

de

solkprog · 2011. Feb. 21. (H), 21.56
de terheli... sőt ez a módszer terhel mindent. hálózatot, szervert...

Van egy cikk ebben a Valós idejű web Javascript alapokon – áttekintés címmel egyéb módszerekről.
10

ezt nem nagyon tom

kriszrap · 2011. Ápr. 6. (Sze), 21.16
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??:(
11

"ha változik akkor frissit egyet."

solkprog · 2011. Ápr. 7. (Cs), 08.07
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)
12

mi a hiba??

kriszrap · 2011. Ápr. 12. (K), 22.20
Sziasztok!!
meg irtam csak az a baj hogy nem müködik:(
itt a kód:

Na ezt csak egyszer kérdezük le!!

<?php
$tabla_csatlakozas = mysql_query("SELECT * FROM chat");
$sorok_szama = mysql_num_rows($tabla_csatlakozas);
setcookie("chat_sorok_szama", "$sorok_szama");
?>

function sorok_frissitese()
{
<?php
  $sorok_szama2 = mysql_num_rows($tabla_csatlakozas);

 if($_COOKIE["chat_sorok_szama"] < $sorok_szama2)
   {
   print"setInterval('chat_kuldes_es_frissites()', 1000);";
   }
?>
}
setInterval('sorok_frissitese()', 1000);
chat_kuldes_es_frissites() <-- ezzel pedig frissitema chatet!!
mi a hiba??:(
13

Message polling

vbence · 2011. Ápr. 13. (Sze), 11.40
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
<?php
    mysql_pconnect ("localhost", "user", "pass");
    mysql_use_db ("chat");

    mysql_query (sprintf ("INSERT INTO message VALUES ('%s', '%s', UNIX_TIMESTAMP(NOW()))", mysql_real_escape_string ($_SESSION["userid"]), mysql_real_escape_string ($_GET["message"])));
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
14

ezt a kódót most kombináljam

kriszrap · 2011. Ápr. 13. (Sze), 22.23
ezt a kódót most kombináljam az ennyémmel vagy felejtsem el az enyémet??
15

Igazából egyik sem

vbence · 2011. Ápr. 15. (P), 14.12
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.
16

de az adatbázisba

kriszrap · 2011. Ápr. 18. (H), 22.19
de az adatbázisba különtömbökbe van az ev honap nap perc masodperc:( és akkor igy nem tom megoldani:(
17

De

vbence · 2011. Ápr. 19. (K), 10.53
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.
18

áááá nem megy probálozom de

kriszrap · 2011. Ápr. 20. (Sze), 18.15
áááá nem megy probálozom de hiába:(
function frissites()
 {
 <?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:(
19

Már hogy a viharba futtatná

vbence · 2011. Ápr. 20. (Sze), 18.30
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:

http://weblabor.hu/cikkek/valos-ideju-web-javascript-alapokon
20

sikerült már csak annyi ajax

kriszrap · 2011. Ápr. 21. (Cs), 14.11
sikerült már csak annyi ajax bol kéne inditanom egy js parancsot :(
ez a ajax

<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('hatteri_frissites').innerHTML = xhr.responseText;  
    setTimeout('ha_uj_uzenet()', 1000);  
}  
// Hibakód: 404  
else if (xhr.status == 404)  
{  
    document.getElementById('hatteri_frissites').innerHTML = '--Uzenet vege--'  
}  
    }  
  
    xhr.open("GET", "chat_ujuzenet_frisites.php", true);  
    xhr.send(null);    
}  
  
// Request  
window.onload = ha_uj_uzenet;  
chat_ujuzenet_frisites.php

<?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)
   {
// ide kéne a elinditani ajax frisitést .
   }
 ?>
"ide kéne a elinditani ajax frisitést ."
ide ilyen irtam:

echo '<script type="text/javascript">
setInterval(frissites, 1000);
</script>';
frissites kódót nem irtam belle .
21

Így nem tudok segíteni

vbence · 2011. Ápr. 22. (P), 16.36
Próbáld megérteni a példákat amiket írtam és anélkül nem tovább lépni. Ez pl mit csinál szerinted?
while($sorok = mysql_fetch_assoc ($result))  
     {  
     $bejovok++;  
     break;  
     }  
22

megnézi hogy van e új üzi Nem

kriszrap · 2011. Ápr. 23. (Szo), 20.52
megnézi hogy van e új üzi Nem akarok végig menni az összes üzin ezért break -el kiléptetem.
23

A WHERE time > rész

vbence · 2011. Ápr. 23. (Szo), 21.46
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).
24

köszönöm de annyi a hibám ha

kriszrap · 2011. Ápr. 28. (Cs), 11.53
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.
25

JSON rekordok olvasása

vbence · 2011. Ápr. 29. (P), 15.38
A HTML vevő részt így képzel el:
<html>  
<head></head>
<body>
<script type="text/javascript">
var lastTime = 0;
function get_new_messages() {
    var xhr = new XMLHttpRequest();    
    xhr.onreadystatechange = function() {
        var records = eval(xhr.responseText);
        var i;
        for (i=0; i<messages.length; i++) {
            document.innerHTML = document.innerHTML +
                "<b>" +
                records[i]["sender"] +
                "</b>: " +
                records[i]["message"] +
                <br/>;
            lastTime = Math.max(lastTime, records[i]["time"]);
        }
        setTimeout(get_new_messages, 1000);
    }
    xhr.open("GET", "/receive.php?time=" + lastTime, true);
    xhr.send();
}
</script>  
</body>
</html>
26

el magyaráznád hogy mi mit

kriszrap · 2011. Ápr. 30. (Szo), 10.35
el magyaráznád hogy mi mit csinál köszönöm:)
27

Alapjában véve a te kódodat

vbence · 2011. Ápr. 30. (Szo), 16.53
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.
28

én ezt szerintem hagyom sajna

kriszrap · 2011. Május. 3. (K), 22.51
De azt hogy tudom hogy ajax parancsal egy másik div be frissitsek??:D

van egy uj divem amibe fut az ajax és van a chatbox amit frissiteni kéne ajaxal? hogy??
ha értitek??
29

AJAX

Poetro · 2011. Május. 3. (K), 23.10
Az AJAX nem egy DIV-ben fut. Egyik sem. Teljesen független az egész DOM-tól. És a callback függvényben akármelyik DIV-et frissítheted.
30

document.getElementById('uj_u

kriszrap · 2011. Május. 4. (Sze), 17.43
document.getElementById('uj_uzenet').innerHTML = xhr.responseText;
akkor ez mire való ? az hogy hol jelenitse meg a dolgokatT?:)
31

Igen

Poetro · 2011. Május. 4. (Sze), 19.04
Az innerHTML segítségével helyezed el a kiválasztott elemben a tartalmat.
32

Vagy is ez nem kell ha futt

kriszrap · 2011. Május. 4. (Sze), 23.24
Vagy is ez nem kell ha futt az hogy van e valtozas az adatbazisba . Magyarul nem kell innerhtmlbe rakni a valtozas ellenorzot ?
33

Nem értem

Poetro · 2011. Május. 4. (Sze), 23.37
Bár nem értem igazából, amit írtál, de valószínűleg nem.
34

annyi ha egy cilus megy le

kriszrap · 2011. Május. 5. (Cs), 13.33
annyi ha egy cilus megy le egyfolytába akkor nem kell innerhtml,?:)
35

Nem jön össze ez az ajax

kriszrap · 2011. Május. 8. (V), 17.33
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:( )
36

Ajax

vbence · 2011. Május. 8. (V), 17.34
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.
37

ez a kliens oldal<script

kriszrap · 2011. Május. 9. (H), 17.57
változás utánn a divbe irjon egy olyat hogy "csá" azt igy csináljam??:D
<?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) {  
print'<script type="text/javascript">
';
print "document.getElementById('ChatBox').innerHTML = 'csá';";
print'<script>';
}
?>

meg azt mondod ne php alapon csináljam??:)
38

PHP

vbence · 2011. Május. 9. (H), 20.26
meg azt mondod ne php alapon csináljam??:)


É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.
39

hát de sztem csak JS lehet

kriszrap · 2011. Május. 9. (H), 21.44
hát de sztem csak JS lehet divet frissiteni nem,?
meg ajax de az js alapu.
40

JavaScript

Poetro · 2011. Május. 9. (H), 22.02
// jQuery 1.5-ből kölcsönözve.
var getXHR = window.ActiveXObject ?
  function() {
    if ( window.location.protocol !== "file:" ) {
      try {
        return new window.XMLHttpRequest();
      } catch( xhrError ) {}
    }
    try {
      return new window.ActiveXObject("Microsoft.XMLHTTP");
    } catch( activeError ) {}
  } :
  function() {
    return new window.XMLHttpRequest();
  };

function makeRequest(url, callback, data) {
  var xhr = getXHR();
  xhr.setRequestHeader('x-requested-with', 'XMLHttpRequest');
  xhr.open('GET', url, true);
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status == 200) {
      callback(xhr);
    }
  }

  xhr.send(data || null);
}

makeRequest('chat.php', function (xhr) {
  document.getElementById('ChatBox').innerHTML = xhr.responseText;
});
és ekkor a chat.php például a következőket tartalmazza:
<?php
header('Content-type: text/plain; charset=utf-8');
?>
Csá
41

function ha_uj_uzenet() {

kriszrap · 2011. Május. 9. (H), 22.36

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);      
}    
ez majd nem ugyan az a kód nem ??:D
42

PHP

Poetro · 2011. Május. 9. (H), 22.46
Akkor már csak a PHP oldalon lehet probléma.
43

<?php $conn = include

kriszrap · 2011. Május. 9. (H), 22.49

<?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:)
44

<?php $conn = include

Poetro · 2011. Május. 9. (H), 23.10
<?php
header('Content-type: text/plain; charset=utf-8');
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): ?>
Csá
<?php endif; ?>
45

amugy eddig én is el jutodtam

kriszrap · 2011. Május. 9. (H), 23.21
amugy eddig én is el jutodtam :( csak az a baj hogy nem div checbox irja csá szöveget:(
46

Töltsd fel valahova

Poetro · 2011. Május. 9. (H), 23.23
Mostmár tényleg töltsd fel valahova az egész kódot, mert enélkül valószínűleg nem lesz továbblépés.
47

na akkor kliens

kriszrap · 2011. Május. 10. (K), 13.24
na akkor
kliens oldal:

<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
  }  
 ?>  
ilyen a kód eddig:D
48

Egyben

Poetro · 2011. Május. 10. (K), 14.38
Itt egy példa, egy fájlba integrálva:
<?php
header('Content-type: text/html; charset-utf-8');
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
    $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
  echo '<div class="message">', '<em>', date('r'), '</em> ', 'Csá', '</div>';
  return;
}
?>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <title>Chat</title>
</head>
<body>
<script type="text/javascript">
// jQuery 1.5-ből kölcsönözve.
var getXHR = window.ActiveXObject ?
  function() {
    if ( window.location.protocol !== "file:" ) {
      try {
        return new window.XMLHttpRequest();
      } catch( xhrError ) {}
    }
    try {
      return new window.ActiveXObject("Microsoft.XMLHTTP");
    } catch( activeError ) {}
  } :
  function() {
    return new window.XMLHttpRequest();
  };

function makeRequest(url, callback, data) {
  var xhr = getXHR();
  xhr.open('GET', url, true);
  xhr.setRequestHeader('x-requested-with', 'XMLHttpRequest');
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4 && xhr.status == 200) {
      callback(xhr);
    }
  }

  xhr.send(data || null);
}

(function getChat() {
  makeRequest('chat.php', function (xhr) {
    document.getElementById('ChatBox').innerHTML += xhr.responseText;
    setTimeout(getChat, 5000);
  });
}());
</script>
<div id="ChatBox"></div>
</body>
</html>
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.
49

chat.php -ba mit irjak??:)

kriszrap · 2011. Május. 10. (K), 15.22
chat.php -ba mit irjak??:)
50

chat.php

Poetro · 2011. Május. 10. (K), 15.29
A fenti fájl maga a chat.php.
51

Sajna megint nem jó ha van uj

kriszrap · 2011. Május. 10. (K), 22.17
Sajna megint nem jó ha van uj dolog akkor frissit le elenöriztem de a kliens oldalon nem jelenik meg :(

igy csináltam
ajax frissites

<!DOCTYPE HTML>  
<html lang="en-US">  
<head>  
  <meta charset="UTF-8">  
  <title>Chat</title>  
</head>  
<body>  
<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('ChatBox').innerHTML += xhr.responseText;      
    setTimeout('ha_uj_uzenet()', 5000);      
}      
// Hibakód: 404      
else if (xhr.status == 404)      
{      
    document.getElementById('ujuzi').innerHTML = '--Uzenet vege--'      
}      
    }      
    xhr.open("GET", "chat.php", true);      
    xhr.send(null);        
}      
      
// Request      
window.onload = ha_uj_uzenet;  
</script> 
<div id="ChatBox"></div>  
</body>  
</html>  
chat.php

<?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) {  

$query = mysql_query("SELECT * FROM chat ORDER by id DESC");//LIMIT 0 , 30
while($a=mysql_fetch_assoc($query)){

$chat_datum = mktime($a['ora'], $a['perc'], $a['masodperc'], $a['honap'], $a['nap'], $a['ev']);
$diff = time() - $chat_datum; // ez a két időpont közötti különbség másodpercekben 
//print $diff/60/60;

$message=$a['message'];
$message= str_replace("<", "&lt;", $message);
$message= str_replace(">", "&gt;", $message);
$message= str_replace(":D","<img src='smiley/sm01.gif' alt='sm01' />", $message);
$message= str_replace(":P","<img src='smiley/sm02.gif' alt='sm02' />", $message);
$message= str_replace(":(2","<img src='smiley/sm03.gif' alt='sm03' />", $message);
$message= str_replace("[sm04]","<img src='smiley/sm04.gif' alt='sm04' />", $message);
$message= str_replace(":(","<img src='smiley/sm05.gif' alt='sm05' />", $message);
$message= str_replace(":)","<img src='smiley/sm06.gif' alt='sm06' />", $message);
$message= str_replace("[smiley_dj]","<img src='smiley/sm07.gif' alt='sm07' />", $message);
$message= str_replace("[smiley_drink]","<img src='smiley/sm08.gif' alt='sm08' />", $message);
$message= str_replace("[smiley_Good_night]","<img src='smiley/sm09.gif' alt='sm09' />", $message);
$message= str_replace("[smiley_Love]","<img src='smiley/sm10.gif' alt='sm10' />", $message);
$message= str_replace("[smiley_Hello]","<img src='smiley/sm11.gif' alt='sm10' />", $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>';
}
}
?>  
52

Megjön?

Poetro · 2011. Május. 10. (K), 22.45
É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?
53

Hát amikor irok a kliens

kriszrap · 2011. Május. 10. (K), 23.59
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:

<!DOCTYPE HTML>    
<html lang="en-US">    
<head>    
  <meta charset="UTF-8">    
  <title>Chat</title>    
</head>    
<body>    
<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('ChatBox').innerHTML += xhr.responseText;        
    setTimeout('ha_uj_uzenet()', 5000);        
}        
// Hibakód: 404        
else if (xhr.status == 404)        
{        
    document.getElementById('ujuzi').innerHTML = '--Uzenet vege--'        
}        
    }        
    xhr.open("GET", "chat.php", true);        
    xhr.send(null);          
}        
        
// Request        
window.onload = ha_uj_uzenet;    
</script>   
<div id="ChatBox"></div>    
</body>    
</html>    
amit irt az jó:) csak a klines oldalba irás nem
54

3 hónap

Totti 1986 · 2011. Május. 11. (Sze), 04.21
É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. :)
55

Hát én igyekezem van olyan

kriszrap · 2011. Május. 11. (Sze), 07.10
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:)
56

na mind1 térjünk vissza a

kriszrap · 2011. Május. 11. (Sze), 23.43
ááá 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??:)
57

String

Poetro · 2011. Május. 11. (Sze), 23.52
Akkor a string elejére szúrj be, ne a végéhez add hozzá. Találd ki hogyan kell.
58

Ez már csak HTML

Blintux · 2011. Május. 11. (Sze), 23.53
Ahova a <div id="ChatBox"></div> kódot teszed a weboldaladban, ott fog megjelenni a chat...
59

csak aza baj hogy nem ezt

kriszrap · 2011. Május. 11. (Sze), 23.59
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:)
60

te hülyülsz?

solkprog · 2011. Május. 12. (Cs), 00.04
~20. hozzászólás óta ezen agyalok.

document.getElementById("chatBox").innerHTML=document.getElementById("chatBox").innerHTML+xmlhttp.responseText;
sose nem lesz (már) vége ennek a topicnak? :)
61

de mingyárt vége:) a jó kódót

kriszrap · 2011. Május. 12. (Cs), 00.17
de mingyárt vége:) a jó kódót be irjam majd??:)

document.getElementById("chatBox").innerHTML=document.getElementById("chatBox").innerHTML+xmlhttp.responseText;  
a kód nem jó:( nem müxik
62

személy szerint preferálom

solkprog · 2011. Május. 12. (Cs), 00.23
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ó)
63

rendben :)

kriszrap · 2011. Május. 12. (Cs), 00.27
rendben :)
<html>
<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.
64

igazad van

solkprog · 2011. Május. 12. (Cs), 00.30
igazad van elnéztem.

document.getElementById("chatBox").innerHTML=xmlhttp.responseText+document.getElementById("chatBox").innerHTML;
<!--vagy-->
document.getElementById("chatBox").innerHTML=xmlhttp.responseText+'<br />'+document.getElementById("chatBox").innerHTML;
65

semmi baj este van már:)Az

kriszrap · 2011. Május. 12. (Cs), 23.37
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??:)
66

nem értelek....

solkprog · 2011. Május. 13. (P), 01.35
"ha értitek mire gondolok??:)"
- 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.
67

hát amikor új üzi érkezik

kriszrap · 2011. Május. 15. (V), 00.29
hát amikor új üzi érkezik akkor ne csak megjelenjen ha nem jobbrol elinditjuk a szöveget és a a bal oldaláig menjen :)
68

jQuery

Totti 1986 · 2011. Május. 15. (V), 09.59
Animáld le a mozgást jQuery-vel. Egyszerűbben nem lehet, sztem.
69

Na ezt a jQuery sok ajax-nal

kriszrap · 2011. Május. 25. (Sze), 21.11
Már megint én:(
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ó:(
document.getElementById("chatBox").innerHTML=xmlhttp.responseText+document.getElementById("chatBox").innerHTML;

másik megoldást is proszáltam de asse jó:(
70

Használd a debuggert

Poetro · 2011. Május. 25. (Sze), 21.27
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.
71

okés ez is sikerült:)

kriszrap · 2011. Jún. 8. (Sze), 20.41
okés ez is sikerült:)