Forum » Programiranje » [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:
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?
$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..
}
al pa
script...
window.onbeforeunload = function(){ zapiram(); }
function zapiram() {
odlogiraj..
}
Zgodovina sprememb…
- spremenilo: kunigunda ()
DeeJay ::
kaj pa
http://api.jquery.com/unload/
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 :)
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
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:
vendar ko se prijavi ali odjavi uporabnik, ga bom lahko izbral šele ko se ponovno skripta nalozi..
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
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?
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
pol v glavni skripti pokličeš ajax
to je na hitro, da ti da idejo... s temi podatki pol lahko delaš kar hočeš... primerjaš z obstoječimi, oblikuješ itd..
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 ()
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.
v browserju pa "ping" as na sekundo ali vec . ko pinga ni po 3sek je offline npr.
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?
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?
In potem lahko ensotavno preveriš razliko time()-$cas>10 in veš če je uporabnik online.
Kje je tle problem?
Zgodovina sprememb…
- spremenil: technolog ()
cobrica ::
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 !
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 ::
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [php] encoding nizaOddelek: Izdelava spletišč | 3883 (1798) | BivšiUser2 |
» | jquery ajax problemOddelek: Izdelava spletišč | 1497 (1119) | miko22 |
» | [PHP]Zajem podatkov iz bazeOddelek: Programiranje | 4093 (3730) | cobrica |
» | Php varen loginOddelek: Programiranje | 3944 (3444) | Volk| |
» | [PHP/JavaScript] tic tac toeOddelek: Programiranje | 1714 (1447) | illion |