» »

[php] preverjanje online uporabnikov

[php] preverjanje online uporabnikov

cobrica ::

Torej delam na zadevi imenovani "chat" za neko podjetje. Delavci naj bi med sabo izmenjevali sporocila, ker je zadeva lazja, kot če nekoga klicariš in mu naročaš ti naredi to pa to, oni to pa to.. itd.. Vglavnem zadeva je sledeča, vse skupaj deluje v popolnosti, vendar problem se pojavi v primeru če uporabnik1 zapre okno je ta uporabnik še vedno prijavljen, v primeru da se pa odjavi preko odjava.php skripte pa ga pač normalno odjavi. V bazi imam pod uporabnik atribut aktiven, ki mu nastavi spremenjlivko 1 pri prijavi kar povzroči da je online in spremenljivko aktiven 0, ko ga odjavim, vendar v primeru da samo okno zaprem, ta pač ne opravi skripte odjavi.php, kar povzroči, da je še vedno prijavljen. Ima kdo idejo kako bi lahko rešil zadevo? Koda online skripte je pa sledeča:

$baza_uporabnik = mysql_query("SELECT * FROM uporabnik ORDER by aktiven ASC");
function dosegliv($uporabnik){
$izpis = mysql_fetch_array(mysql_query("SELECT * FROM uporabnik WHERE uporabnisko_ime='$uporabnik'"));
	if($izpis['aktiven'] == '0'){
	echo '<img src="slike/offline.png">';
	} else { 
	echo '<img src="slike/online.png">';
	}
}
while($izpis = mysql_fetch_array($baza_uporabnik)){
echo dosegliv($izpis['uporabnisko_ime']) . $izpis['uporabnisko_ime'];
echo "<br />";
}

Vse skupaj pa drugače poganja jquery kateri povzroča za 100milisekundni refresh, kar pač povzroči, da takoj vidim kateri se je prijavil,odjavil postal sporočilo, ipd.. Sicer sem razmišljal da bi vstavil neko JS skripto, katera bi ob kliku na X oz na izhod iz okna povzročila zagon odjava.php, kateri v bazi nastavi na aktiven 0, vendar dvomim da bi bi bila ta varianta možna? Torej kaj priporočate?

kunigunda ::

onUnload() -> jquery ?

al pa

script...
window.onbeforeunload = function(){ zapiram(); }

function zapiram() {
odlogiraj..
}

Zgodovina sprememb…

  • spremenilo: kunigunda ()

cobrica ::

Kako pa potem lahko JS zažene php skripto?

DeeJay ::

preko ajaxa

cobrica ::

V IE on unload deluje v chrome pa ne.

DeeJay ::

kaj pa
http://api.jquery.com/unload/

$(window).unload(function() {
 $.ajax({
  url: "odjava.php",
.....
});

Zgodovina sprememb…

  • spremenil: DeeJay ()

Looooooka ::

S tem, da poleg omenjenega zapises kdaj je bil clovek nazadnje gor(ajax timer magar ce nic ne pise)...in ce nisi nic slisal recimo n minut...ping timeout :)

cobrica ::

Kot sem omenil deluje z jquery v IE medtem ko v drugih nažalost ne..

DeeJay ::

če testiraš z alertom pol itak ne bo nič javlo v Chromu, ker je tam alert na ta način blokiran. Morš dejansko testirat z skripto.
ta način bi moral delat v vseh browserjih

$(window).unload(function() {
        $.ajax({
            url: 'odjava.php',
            async : false
.....
        });
});

cobrica ::

Sem uspel rešit zadevo. Sedaj me pa zanima kako bi lahko updejtal userje, katere potem izberem, če želim samo izrecno njim poslat sporočilo? Torej user bi se dodal, zraven pa checkbox, če uporabim funkcijo od jquery refresh mi bo po intervalu refreshalo in če izberem tisti moment user ga bo ponovno potrebno.

Zaenkrat imam zadevo glede userjev takšno:
Vsi<input type="checkbox" name="vidno[]" value="vsi"  onClick="showHide('test');" checked>
<div id="test" style="visibility: hidden;">
<?php
$baza = mysql_query("SELECT * FROM uporabnik WHERE aktiven='1'");
while ($izpis = (mysql_fetch_array($baza))){
if($izpis['uporabnisko_ime'] !== $_SESSION['up_ime']){
echo''.$izpis['uporabnisko_ime'].'<input type="checkbox" name="vidno[]" value="'.$izpis['uporabnisko_ime'].'">';
}

}
?>
</div>

vendar ko se prijavi ali odjavi uporabnik, ga bom lahko izbral šele ko se ponovno skripta nalozi..

Zgodovina sprememb…

  • spremenil: cobrica ()

DeeJay ::

kot prvo bi blo fino, da za prvi problem napišeš rešitev, morda pride še kdaj komu prav.
za drugo vprašanje pa ne razumem kaj sploh hočeš :) verjetno je za to kriva pozna ura :P

cobrica ::

Kot prvo sem nastavil async na false, kot si omenil :).
Kot drugo pa je pa tako. Nek uporabnik se prijavi jquery konstanto refresha, tako da preverja online/offline uporabnike z zgornje kode. Ker pa ti sporočilo zeliš poslati izrecno samo enemu je pač najlažje da preko checkbox izbereš uporabnika, vendar tudi pri uporabnikih, katerega želim izbrat mora iz baze konstatno brat ali je aktiven ali ne in če pač ni ga ne prikaže pri izbiri za prejemnika. Če nastavim refresh, kot sem pri preverjanju za online/offline se pa pojavi tezava, če si ze uporabnika izbral ti refresh postavi na unchecked. Razmišljam da bi izbranega prejemnika shranil v session, pa bi potem lahko uporabnik ostal zbran,kljub refreshom, to je ena alternativa, še mogoče kakšna boljša?

DeeJay ::

se pravi ti pri vsakem preverjanju prepisuješ uporabnike? kaj pa če bi brisal in dodajal samo tiste, ki so se odjavili ali prijavili, tako pol nebi smelo checkboxa uncheckat.

cobrica ::

Tako je nanovo prepisujem, kako bi pa lahko to naredil da jih samo briše ali pa dodaja, na to se pa niti spomnil nisem :)

DeeJay ::

preko ajaxa dobi samo podatke tipa JSON in jih potem z javascriptom obdeluj naprej
pol lahko preveriš če nek uporabnik že obstaja in ga pustiš pri miru, drugače ga doda/briše

ti recimo v uporabniki.php v nek array stlačiš podatke o uporabniku in jih z "echo json_encode($uporabniki);" pošlješ naprej
na drugi strani potem z ajaxom prebereš te podatke

recimo v uporabniki.php maš array
$uporabniki[0]['id'] = 1;
$uporabniki[0]['uporabnisko_ime'] = 'Joze';
$uporabniki[0]['aktiven'] = 0;
$uporabniki[1]['id'] = 2;
$uporabniki[1]['uporabnisko_ime'] = 'Janez';
$uporabniki[1]['aktiven_ime'] = 1;
echo json_encode($uporabniki);


pol v glavni skripti pokličeš ajax

$.ajax ({
	url: 'uporabniki.php',
	type: 'GET',
	dataType: 'json',
	error: function (r) {
		alert('Napaka');
	},
	success: function (response) {
		$.each(response, function(i, item){
			if (item.aktiven == 1) {
				$('#uporabniki').append(item.uporabnisko_ime + '<br>');
			}
		});
	}
});


to je na hitro, da ti da idejo... s temi podatki pol lahko delaš kar hočeš... primerjaš z obstoječimi, oblikuješ itd..

Zgodovina sprememb…

  • spremenil: DeeJay ()

cobrica ::

Kako pa napolnim uporabnike v array?

DeeJay ::

$uporabniki = array();
$baza = mysql_query("SELECT * FROM uporabnik");
while ($izpis = mysql_fetch_assoc($baza))
{
$uporabniki[] = $izpis;
}
mysql_free_result($baza);

echo json_encode($uporabniki);

kunigunda ::

php_mod uporab v serverju, da je program skoz gor ne sam ko ga browser klice, tud hitrost requestov bo visja, pa mas resen problem,
v browserju pa "ping" as na sekundo ali vec . ko pinga ni po 3sek je offline npr.

Spura ::

Comet namesto refresh requestov

cobrica ::

DeeJay tudi če se uporabnik prijavi ga pokaže šele po refresh.
Sepravi je ta zadeva, ki kliče MYSQL in preverja če je aktiven dejansko neuporabna?

technolog ::

Hrani si v tabeli za vsakega uporabnika čas zadnjega dostopa (pinga).

In potem lahko ensotavno preveriš razliko time()-$cas>10 in veš če je uporabnik online.

Kje je tle problem?

Zgodovina sprememb…

Spura ::

TBH, zakaj je to narejeno PHP namesto kot Java Applet?

cobrica ::

technolog je izjavil:

Hrani si v tabeli za vsakega uporabnika čas zadnjega dostopa (pinga).

In potem lahko ensotavno preveriš razliko time()-$cas>10 in veš če je uporabnik online.

Kje je tle problem?

Torej če prav razumem v bazo shranim recimo kot atribut časdostopa in tega potem odstevam od trenutnega casa,kaka korist je dejansko od tega? Mislim ne razumem na kak način bi lahko potem preverjal ali je trenutno online ali ne?

LeQuack ::

Saj ne rabiš shranjevati vseh zadev v podatkovni bazi, sploh ne za chat. Uporabnike in sporočila lahko shranjuješ tudi v seznamih v pomnilniku, kar bo precej pohitrilo zadevo.
Quack !

technolog ::

S phpjem kako že?

Spura ::

LeQuack tocno isto sem pomislil. Bazo rabis samo ce hoces belezit zgodovino... drugace imas pac izhodne FIFO queues za uporabnike za njim namenjena sporocila in centralni dispatch.

cobrica ::

DeeJay je izjavil:

preko ajaxa dobi samo podatke tipa JSON in jih potem z javascriptom obdeluj naprej
pol lahko preveriš če nek uporabnik že obstaja in ga pustiš pri miru, drugače ga doda/briše

ti recimo v uporabniki.php v nek array stlačiš podatke o uporabniku in jih z "echo json_encode($uporabniki);" pošlješ naprej
na drugi strani potem z ajaxom prebereš te podatke

recimo v uporabniki.php maš array
$uporabniki[0]['id'] = 1;
$uporabniki[0]['uporabnisko_ime'] = 'Joze';
$uporabniki[0]['aktiven'] = 0;
$uporabniki[1]['id'] = 2;
$uporabniki[1]['uporabnisko_ime'] = 'Janez';
$uporabniki[1]['aktiven_ime'] = 1;
echo json_encode($uporabniki);


pol v glavni skripti pokličeš ajax


$.ajax ({
url: 'uporabniki.php',
type: 'GET',
dataType: 'json',
error: function (r) {
alert('Napaka');
},
success: function (response) {
$.each(response, function(i, item){
if (item.aktiven == 1) {
$('#uporabniki').append(item.uporabnisko_ime + '<br>');
}
});
}
});


to je na hitro, da ti da idejo... s temi podatki pol lahko delaš kar hočeš... primerjaš z obstoječimi, oblikuješ itd..

Meni šele uporabnika doda po refreshu, če ga sam izvedem,ne pa avtomatsko ob prijavi novega uporabnika?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[php] encoding niza

Oddelek: Izdelava spletišč
173645 (1560) BivšiUser2
»

jquery ajax problem

Oddelek: Izdelava spletišč
81386 (1008) miko22
»

[PHP]Zajem podatkov iz baze

Oddelek: Programiranje
353768 (3405) cobrica
»

Php varen login

Oddelek: Programiranje
203558 (3058) Volk|
»

[PHP/JavaScript] tic tac toe

Oddelek: Programiranje
171532 (1265) illion

Več podobnih tem