Avatar billede CoreFreddie Nybegynder
28. juli 2013 - 13:34 Der 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.


På forhånd mange tak for hjælpen,
Mvh. Frederik.
Avatar billede CoreFreddie Nybegynder
28. juli 2013 - 13:40 #1
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?
Avatar billede repox Seniormester
28. juli 2013 - 17:33 #2
Du kan bruge din akkumulerede tid som en virtuel point-container som lægges til de point man optjener på anden vis.
Avatar billede CoreFreddie Nybegynder
28. juli 2013 - 17:48 #3
Problemet er så bare, at man kan også spendere sine point i en virtuel butik, så jeg tror ikke helt det vil være muligt...
Avatar billede repox Seniormester
28. juli 2013 - 18:02 #4
Selvfølgelig vil det være muligt. Den totalentreprise pointsum og køb ud fra den samlede pointsum er to uafhængige ting?
Avatar billede CoreFreddie Nybegynder
28. juli 2013 - 18:25 #5
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?

Ellers tak for hjælpen ;)
Avatar billede repox Seniormester
28. juli 2013 - 20:35 #6
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?
Avatar billede CoreFreddie Nybegynder
28. juli 2013 - 20:49 #7
Ah, okay. Så må jeg have misforstået dig ;)

Som jeg skrev i #1:

"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? "
Avatar billede repox Seniormester
28. juli 2013 - 21:02 #8
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.
Avatar billede CoreFreddie Nybegynder
28. juli 2013 - 21:29 #9
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?
Avatar billede repox Seniormester
28. juli 2013 - 21:47 #10
Man kan ikke se hvor gammel du er, jo ;) Du kunne måske opdatere din profil eller lægge et billede af dig selv på?

Akkumulering er et begreb man bruger når et antal af noget lægges sammen over tid.

Så f.eks. vil du i et fuldtidsjob akkumulere 37 timers arbejde.

En sum er således den samlede mængde af ting du allerede har/er bekendt med (bare så du kan se forskellen på akkumuleret beløb og samlet beløb).

I praksis vil jeg have en session variabel der har et tidsstempel (f.eks bare med time()):

<?php
  if(isset($_SESSION['last_activity']))
  {
    if(!isset($_SESSION['seconds_accumulated']))
    {
      $_SESSION['seconds_accumulated'] = 0;
    }
    $_SESSION['seconds_accumulated'] += time() - $_SESSION['last_activity'];
  }

  $_SESSION['last_activity'] = time();
?>


Og den samme funktion kan bruges i din garbage collector i sessionhandleren.

Du skal jo ikke, med sessions, bekymre dig om hvordan du overfører variablerne fra den ene side til den anden.
Avatar billede CoreFreddie Nybegynder
28. juli 2013 - 22:16 #11
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 ;)
Avatar billede CoreFreddie Nybegynder
28. juli 2013 - 22:19 #12
Nok rimelig off-topic, men alligevel: Jeg kan ikke opdatere eller uploade et billede, for når man prøver giver det bare MySQL error :/
Avatar billede repox Seniormester
28. juli 2013 - 22:41 #13
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å. :)
Avatar billede CoreFreddie Nybegynder
28. juli 2013 - 22:55 #14
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.

Hav en god aften ;)
Avatar billede repox Seniormester
29. juli 2013 - 23:35 #15
Åh, på den måde - du kan slå gravatar til i stedet og uploade et billede på gravatar.com
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester