28. juli 2013 - 13:34Der er
14 kommentarer og 1 løsning
Online tid og point i PHP
Hej eksperter.
Jeg er nu endnu engang kommer i nød, og har derfor brug for hjælp!
Jeg er ved at programmere et community i PHP, og skal der have gjort sådan, at man kan se hvor lang tid en bruger har været online i alt (Ikke tid siden oprettelse). Dertil tænker jeg så, at man måske kunne lave noget javascript, som 1 gang i minuttet lagde 1 minut til ens onlinetid, hvis man var logget ind. Mit problem er bare, at jeg er elendig til javascript, men jeg vil sagtens kunne lave php delen - så hvis nogen har et link til en guide/tutorial ville det være perfekt (Altså ikke til generelt javascript, men specifikt til mit behov).
Derudover vil jeg også gerne have det sådan, at man fx 1 gang hver 60 minutter (Time) får 1 point tildelt til sin bruger. Her kan jeg desværre ikke bare dividere ens onlinetid med 60, for man kan også anskaffe sig point på anden vis...
Al login information, onlinetid, point osv. bliver gemt i en mysql database.
Pokkers! Kom lige til at tænke på, at det ikke kommer til at virke, for så starter den jo forfra med at tælle op til det minut, hver gang man går ind på en anden side! Skal man så i stedet hvert sekund sætte antal sekunder i en $_SESSION, og så samtidig hver sekund tjekke om den session har en værdi på 60 sekunder, opdatere databasen med 1 minut ekstra, og resette den session?
Er det ikke bare at gøre det mere besværligt? Er det ikke nemmere bare at lave et nyt felt i databasen kaldet fx. "tidsidenpoint" og så 1 gang i minuttet tjekke om den er == 60, og hvis den er, så lægge 1 til brugerens point, og sætte minut antallet til 1.
Mit problem er ikke hvordan jeg skal give point, men hvordan jeg kan gentage et php script 1 gang i sekundet uden at refreshe siden! Er der ikke en eller anden simpel Javascript command til at køre en php function hver X sekund, eller skal jeg have fat i noget andet end javascript?
Udover dit forslag basalt set er det samme, så er det yderligere kompliceret og du vil ikke kunne se den samlede tid længere (medmindre du laver et felt mere - unødvendig).
Men at vælge AJAX som base for optælningen virker ikke så gennemtænkt - hvis jeg skifter side hver 40. sekund, tjener jeg jo ingen point?
"Pokkers! Kom lige til at tænke på, at det ikke kommer til at virke, for så starter den jo forfra med at tælle op til det minut, hver gang man går ind på en anden side! Skal man så i stedet hvert sekund sætte antal sekunder i en $_SESSION, og så samtidig hver sekund tjekke om den session har en værdi på 60 sekunder, opdatere databasen med 1 minut ekstra, og resette den session? "
Min umiddelbare tanke er at du skal have et felt til de generelle point samt et felt til den akkumulerede tid eksempelvis gemt i sekunder (nemmest at regne med).
Så er det jo at lave noget ala:
<?php $points = $point_felt + ceil($tids_felt / 3600); // 1 point pr time ?>
Så ville jeg lave min egen session-handler som smider et akkumuleret antal sekunder (i den aktive session) i databasen, når garbage-collectoren rydder op. Så vil jeg bruge et AJAX script til at kalde et PHP script der opdaterer det antal sekunder har været aktiv (f.eks. med 5-minutters intervaller) samt en opdatering ved hvert sideskift.
Ser du, det her er pinligt: For det første, er jeg lost på hvad at "akkumulere" helt præcist betyder (Det hjalp ikke med en ordbog).
Jeg vil såmen også gerne give point, men det ville nu være rart, hvis du tog formuleringen ned på et niveau hvor jeg også kunne være med - mit ordforråds omfang er lidt begrænset. (Jeg er kun 14.)
Men sådan lige umiddelbart tænker jeg, at man da nemt kommer til at overbelaste serveren ved at (Som mit eget forslag lød på) at opdatere hvert sekund. Men hvordan vil du i praksis overføre antal sekunder til en anden side, hvis du kører scriptet med 5-minutters intervaller?
Nej, det er jo logisk nok ;) - men det var heller ikke for at kritisere, troede bare det fremgik af mine stavefejl, utallige kommafejl og rodede opsætning og formulering.
Kopierer lige dit script ind, så er det nemmere at kommentere på, tilføjer også lige en kommentar på hver linie, så jeg er sikker på at jeg forstår det: <?php //Åben for PHP if(isset($_SESSION['last_activity'])) //Hvis der er nogen sidste aktivitet, altså hvis brugeren før har besøgt en side. { if(!isset($_SESSION['seconds_accumulated'])) //Hvis der ikke er sat nogen akkumuleret tid sker kun hvis brugeren loader siden for første gang i denne session { $_SESSION['seconds_accumulated'] = 0; //Så sætter vi den til 0, så vi kan regne med den uden at få php fejl } $_SESSION['seconds_accumulated'] +=//Når du skriver +=, vil det så sige at variablen er = det der står efter, lagt til den værdi variablen i forvejen har? time() - $_SESSION['last_activity']; //Her beregner vi forskellen, eller rettere tiden der er gået siden sidste page visit. }
$_SESSION['last_activity'] = time(); //Her sætter vi tiden på dette page visit. ?> //Luk PHP
Men nu tænker jeg, at det vil være muligt at snyde, ved fx at lade sin computer stå tændt natten over i en 8-9 timer, så klikke på et link og så have fået onlinetid for alt det. Ville det ikke istedet være muligt at tilføje en if, og så lige tjekke om forskellen er større end fx. 10 minutter, og hvis den er, så nulstille samlede points. Hvis forskellen så er mindre end 10 minutter, så hver gang man går en på en ny side, så lægger den forskellen mellem de 2 page-visits til den tid man allerede har opsparet i databasen.
Nej, det er jeg klar over - jeg har opbygget mit site med sessioner ;)
Det ser ud som om du har fået fat i idéen i mit script-eksempel :)
Men ja, uanset hvad du gør, vil der altid være nogen der kan snyde på en eller anden måde. Du kan hente programmer som står en hel nat og klikker på forskellige links på dit site, så det ser ud som om der faktisk sidder en ved computeren.
Så har du jo en lille opgave med at fikse en MySQL fejl også. :)
Godt at jeg alligevel kan forstå noget så ;) (Den var godt nok pinlig, den med akkumulere xD )
Ja, det er jeg klar over. Men hvis man bare kan klikke ind igen efter 6-7 timer og stadig få sin onlinetid, så ville man da nærmest selv bede om, at folk snyder ;)
Mente ikke at jeg ikke kan på min side, men her på siden. Du foreslog jo at jeg uploadede et billede, så det prøvede jeg her på Eksperten. Det virker bare ikke.
Men tusind mange gange tak for hjælpen, den har virkelig været helt suveræn og uvurderlig. Du får selvfølgelig point med det samme - ærgeligt at jeg ikke kan give flere, end de først angivne.
Åh, på den måde - du kan slå gravatar til i stedet og uploade et billede på gravatar.com
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.