Jump to content
Raddu

Intrebare PHP/HTML

Recommended Posts

Salut RST ! Sunt incepator in php si voiam sa va intreb ceva . Am creat o baza de date si am facut un sistem de login cu ajutorul php.Cand ma loghez utilizatorul verifica username-ul si parola sa vada daca sunt in baza de date si daca sunt corecte modifica campul "online" din 0 in 1 si atunci and se delogheaza din "1" in "0". Voiam sa fac o rubrica in care poti vedea utilizatorii activi . Problema e ca eu vreau sa vad utilizatorii care vizualizeaza site-ul la un anumit moment (cand intru in rubrica) , dar daca ii contorizez doar pe cei care au la campul "online" 1 ei nu sunt neaparat online pe site ci poate nu s-au delogat folosind butonul "log out". Am observat ca si la acest forum problema e aceeasi. E vreo metoda sa arati chiar "utilizatorii activi" in acel moment ? . M-am gandit ca as putea afisa "utilizatorii activi in ultimele x minute" si dupa x minute de inactivitate sa ii sterg automat , dar vreau sa va intreb daca exista vreo metoda "completa" , folosind poate chiar si java , ajax etc.

Link to comment
Share on other sites

Algoritmul pentru „utilizatori online” se bazeaza pe ultima accesare a site-ului, deci inevitabil dupa acele x minute de inactivitate, o pierdere de timp consider eu. Nu ai ce face cu javascript pentru a afla utilizatorii online, poate doar sa-l tii online pe vizitator cand timp e „idle” dar nu a inchis tabul.

Link to comment
Share on other sites

deci, cand se logheaza, initializezi sesiunea 'logged', sa zicem, cu 1 si o faci sa expire in 30 de secunde sau cat vrei tu. Si de fiecare data cand va accesa o noua pagina, o vei initializa din nou, iar daca nu va intra pe nici-o pagina, va expira, asa ca vei sti din 30 in 30 de secunde cine e online si cine nu.

Link to comment
Share on other sites

Algoritmul pentru „utilizatori online” se bazeaza pe ultima accesare a site-ului, deci inevitabil dupa acele x minute de inactivitate, o pierdere de timp consider eu. Nu ai ce face cu javascript pentru a afla utilizatorii online, poate doar sa-l tii online pe vizitator cand timp e „idle” dar nu a inchis tabul.

?in s? te contrazic, tocmai cu js faci toat? treaba...

Link to comment
Share on other sites

  • Active Members

Pui in tabel un camp last_refresh ce v-a retine time() de ultima data utilizatorul o pagina.De fiecare data cand utilizatorul acceseaza o pagina ii updatezi ora.Iar ca sa vezi cei care sunt online faci aproape tot din sql

$Sql="SELECT * FROM useri WHERE online=1 AND last_refresh<".time()-600;

Iar cand acceseaza o pagina folosesti

$Sql="UPDATE useri SET last_refresh=".time()-600." where user_id=".$id;

Link to comment
Share on other sites

Dezvolta.

Dup? cum ?tim to?i JS e client side, atunci când utilizatorul este online un schedule ar putea trimite anumite informa?ii c?tre server side (de exemplu ora exact?) ?i o coloan? "last_activity" apoi urmeaz? o verificare

"... WHERE `last_activity` < '".(time() - 30)."'"

PS: Atunci când el, utilizatorul nu mai este online, JS nu mai trimite nimic c?tre server.

De aici po?i dezvolta cum vrei... ideea în sine conteaz?.

EDIT: Dac? nu vrei în real-time, e mult mai bine ce zice dannyweb

Iar cand acceseaza o pagina folosesti

$Sql="UPDATE useri SET last_refresh=".time()-600." where user_id=".$id;

Ce este cu ro?u nu ar trebui s? mai existe în query

Edited by EAdrian
Link to comment
Share on other sites

@EAdrian: ideea ta este interesanta, dar dupa cum consider ca nu ai observat deja precizasem ca javascript e bun doar la a tine utilizatorul online cat timp ramane pe o singura pagina, dar javascript mai are o problema, mananca multe resurse daca tot faci request-uri la intervale scurte.

Link to comment
Share on other sites

@EAdrian: ideea ta este interesanta, dar dupa cum consider ca nu ai observat deja precizasem ca javascript e bun doar la a tine utilizatorul online cat timp ramane pe o singura pagina, dar javascript mai are o problema, mananca multe resurse daca tot faci request-uri la intervale scurte.

Alternativ am observat c? nu are nevoie de real-time

Depinde ?i cum folose?ti JS... dac? folose?ti cu cap n-ai probleme. vezi https://mega.co.nz/

Link to comment
Share on other sites

Pui in tabel un camp last_refresh ce v-a retine time() de ultima data utilizatorul o pagina.De fiecare data cand utilizatorul acceseaza o pagina ii updatezi ora.Iar ca sa vezi cei care sunt online faci aproape tot din sql

$Sql="SELECT * FROM useri WHERE online=1 AND last_refresh<".time()-600;

Iar cand acceseaza o pagina folosesti

$Sql="UPDATE useri SET last_refresh=".time()-600." where user_id=".$id;

Sper ca iti dai seama ca asa "omori" serverul in zadar. E practic varianta mea, doar ca cosuma mai multe resurse.

PS: http://stackoverflow.com/questions/7867517/how-to-show-online-users-with-ajax

Edited by GarryOne
Link to comment
Share on other sites

Mi-ar placea sa fie cat de real-time se poate . Apropo , cum pot sa fac sa se actualizeze tot timpul baza de date in timp ce sunt pe o pagina ? . Am facut de exemplu un while infinit in php si nici macar nu imi incarca pagina.

Trebuie sa citesti despre Ajax

PHP e server side (trebuie s? ?tii care este diferen?a dintre client-side ?i server-side)

Link to comment
Share on other sites

Ar mai fi o posibilitate, dar nu stiu cat de precisa este.

Cand utilizatorul intra pe site il adaugi in baza de date si-i setezi un cookie ca sa stii sa nu-l mai adaugi inca o data. Iar cu javascript cand inchide tabul il deloghezi:

window.onbeforeunload = function(){
// Aici faci cererea ajax
}

Link to comment
Share on other sites

  • Active Members
Nu vreau sa va stric dezbaterea, dar vedeti ca exemplele alea de SQL sunt vulnerabile. Stay safe!

Asta e treaba lui el doar ne-a intrebat de cum poate realiza scriptul.Apropo Radu sa nu uiti sa sintetizezi datele la fiecare query.

//Gary nu am vazut ca ai postat si tu o varianta asemanatoare dar oricum e cam exagerat 30 de secunde la server-side asta ar insemna ca el in 30 de secunde ar trebuie sa fie activ adica un singur utilizator ar trebui sa faca un request in maxim 30 de secunde ,cel mai bine e un timp de raspuns de cel putin 5 minute.

Edited by danyweb09
Link to comment
Share on other sites

  • Active Members

$Sql="UPDATE useri SET last_refresh=".time()-600." where user_id=".$id;

Spre exemplu mai sus user_id nu este sintetizat,un utilizator rau voitor poate crea un timebased sqlijection creea ce nu e ok.

Cel mai bine este sa faci asta inainte de a crea query-ul sql

$id=(int)$id;

apoi comanda sql

Link to comment
Share on other sites

Am incercat cu acest script :

<script>

setInterval(function() {

<?php

//if ($_COOKIE["conn"]!=1) exit();

$user="xxx";

$pass="xxx";

include 'connect.php';

date_default_timezone_set( 'Europe/Bucharest' );

$date = strftime("%d %b %Y %H:%M:%S %P");

$sql = "UPDATE accounts SET last='$date' WHERE username='$user' AND password='$pass'";

$res = mysql_query ($sql) ;

?>

alert("Script Exec");

}, 6000);

</script>

"last" se updateaza doar in momentul cand pornesc pagina , in schimb alert-ul imi vine la fiecare 6 secunde. :(

Link to comment
Share on other sites

Deci :

Am facut pe serverul de pe net un html separat

in care am scris numai asta :

<script type="text/javascript">

setInterval(function() {

$.get('refresh.php');

alert("Executed");

}, 6000);

</script>

Cand intru in html , nu se intampla nimic oricat ai astepta , nici macar alerta.

Dar daca intru in refresh.php din browser "last" se updateaza.

refresh.php e in acelasi folder cu html-ul .

Am incercat si sa ii dau adresa completa a refresh.php (cu tot cu adresa web a serverului)

dar nu e nicio diferenta

Edited by Raddu
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...