Avatar billede nicocarlos Nybegynder
21. juli 2005 - 23:42 Der er 27 kommentarer og
1 løsning

Online tid regner forkert

Jeg har følgende script, men jeg har nolge problemer med det da nogle brugere ryger op på helt ånsvage antal minutter online som 199090192. Håber virkelig at der er en som kan hjælpe med at forbedre det.

På forhånd tak

<?php 
// database information
include("config.php");
$player=$user_currently_loged;
// disconnected timeout
$timeout = 1800;
$yourstats="SELECT * from v_users where BINARY username like '$player'";
$yourstats2=mysql_query($yourstats) or die("Could not get your stats");
$yourstats3=mysql_fetch_array($yourstats2);
$test=$yourstats3[username];
// this will tell apart the people on your site
$ip=$_SERVER['REMOTE_ADDR'];
$times=time();
$testsomething=$_SESSION['id'];
// remove old connections so that the number doesn't continue to rise like a counter
$onlinestats="SELECT * from joined WHERE hl < $times";
$onlinestats2=mysql_query($onlinestats) or die("Could not get your stats");
while ($onlinestats3 = mysql_fetch_array($onlinestats2)) {
$timeon=time();
$timerprot=$timeon-$onlinestats3[timeonline];
$tidminutter = (int) ($timerprot/60);
$updateyourstats="update v_users set minonline=minonline+'$tidminutter' where BINARY username like '$onlinestats3[username]'";
mysql_query($updateyourstats) or die("Could not update your Caravel stats");
}

$strq = "DELETE FROM joined WHERE hl < $times";
$qry = mysql_db_query($dbname,$strq);
$strq = "SELECT count(*) FROM joined WHERE IP='$ip'";
$qry = mysql_db_query($$dbname,$strq);

while ( $r = @mysql_fetch_array($qry) ) {
    $ppl = $r["count(*)"];
}

if ($cpt) {
// checks for reloads, etc..
    $strq = "UPDATE joined SET hl=hl + $timeout WHERE ip='$ip'";
    $qry = mysql_db_query($dbname,$strq);
    $strq = "UPDATE joined SET username='$player' WHERE ip='$ip'";
    $qry = mysql_db_query($dbname,$strq);
} else {
// confirmed user updated into database
    $times=time()+1800;
    $normaltime=time();
    $strq = "INSERT INTO joined (ip, hl, username, timeonline) VALUES ('$ip','$times','$player','$normaltime')";
    $qry = mysql_db_query($dbname,$strq);
}

// display the number of connected people
$strq = "SELECT count(*) FROM joined";
$qry = mysql_db_query($dbname, $strq);

while ( $result = @mysql_fetch_array($qry) ) {
    $ppl = $result["count(*)"];
}
$yourstats="SELECT * from v_users where BINARY username like '$player'";
$yourstats2=mysql_query($yourstats) or die("Could not get your stats");
$yourstats3=mysql_fetch_array($yourstats2);
$tidloggetind = time() - $yourstats3[lastlogin];
$tidtimer = (int) ($tidloggetind/3600);
if ($tidtimer < 3){
}else{
echo('<script type=\'text/javascript\'>parent.location.href=\'login.php\';</script>');
}
?>
Avatar billede nielle Nybegynder
22. juli 2005 - 08:36 #1
Hvis du gerne vil bruge sådan noget som:

$onlinestats3[username]

- så dutter det ikke at hente data fra databasen via mysql_fetch_array - så skal du i stedet bruge mysql_fetch_assoc. Så vidt jeg kan bedømme så har dine værdier i $onlinestats3[username] været totalt udefinerede og det er derfor ikke så underligt at dine resultater har været derefter.

Prøv dette:

// remove old connections so that the number doesn't continue to rise like a counter
$onlinestats = "SELECT * FROM joined WHERE hl < $times";
$onlinestats2 = mysql_query($onlinestats) or die("Could not get your stats");
while ($onlinestats3 = mysql_fetch_assoc($onlinestats2))
{
    $timeon = time();
    $timerprot = $timeon - $onlinestats3["timeonline"];
    $tidminutter = (int) ($timerprot/60);
    $updateyourstats = "UPDATE v_users SET minonline=minonline+" . $tidminutter . " WHERE username = '" . $onlinestats3["username"] . "'";
    mysql_query($updateyourstats) or die("Could not update your Caravel stats");
}

Bemærk at jeg også har rettet din:

... where BINARY username like '$onlinestats3[username]'";

- til dette:

... WHERE username = '" . $onlinestats3["username"] . "'";

- som performer *meget* bedre.
Avatar billede Slettet bruger
22. juli 2005 - 10:05 #2
nielle: mysql_fetch_array giver en "sammenlægning" af mysql_fetch_row, og mysql_fetch_assoc. Med mysql_fetch_array kan man derfor _både_ tilgå sine værdier med $row[1] og med $row['timeonline'].
Avatar billede nielle Nybegynder
22. juli 2005 - 10:29 #3
wicez> Det har du da ret i:

http://dk2.php.net/manual/da/function.mysql-fetch-array.php

"result_type
Typen af array der skal hentes. Det er en konstant, og kan have følgende værdier: MYSQL_ASSOC, MYSQL_NUM, og standard værdien MYSQL_BOTH."

Men det er da et frygteligt spil af resourcer at den gør det på den måde! :^(
Avatar billede Slettet bruger
22. juli 2005 - 11:37 #4
Ja bestemt, og da det kun er det associative navn der benyttes, er der ingen grund til at at bruge fetch_row, i stedet for fetch_assoc.
Avatar billede Slettet bruger
22. juli 2005 - 11:38 #5
* Der er ingen grund til at bruge fetch_array, i stedet for fetch_assoc. (mig der roder rundt i navnene ;))
Avatar billede nicocarlos Nybegynder
22. juli 2005 - 22:43 #6
okay det prøver jeg lige vender lige tilbage når jeg har testet :D
Avatar billede nicocarlos Nybegynder
22. juli 2005 - 22:48 #7
Nu bliver man bare logget af hvis man prøver at logge ind.

"}else{
echo('<script type=\'text/javascript\'>parent.location.href=\'login.php\';</script>');
}"
Avatar billede nielle Nybegynder
22. juli 2005 - 22:55 #8
Undskyld men jeg er ikke helt med - hvad har det med opdateringen af onlinetiden at gøre?
Avatar billede nicocarlos Nybegynder
22. juli 2005 - 22:59 #9
Jeg kører det script når folk logger ind. Hvis folk har været på over 3 timer så bliver de smidt af. Men burde jeg også dræbe sessionen?
Avatar billede nicocarlos Nybegynder
22. juli 2005 - 23:01 #10
Og der er et eller andet med det jeg ændrede som i sagde, fordi nu kan jeg ikke logge ind mere pga jeg har ændret det script :D
Avatar billede nielle Nybegynder
22. juli 2005 - 23:36 #11
Den rettelse jeg angav i 22/07-2005 08:36:42 har ingen indflydelse på om du kan logge på eller ej. Det må være noget andet som du har fået lavet.

Prøv at poste din nuværende kode ... så kigger vi på det.
Avatar billede nicocarlos Nybegynder
22. juli 2005 - 23:40 #12
<?php 
// database information
include("config.php");
$player=$user_currently_loged;
// disconnected timeout
$timeout = 1800;  // in seconds.. you can make it higher or lower.. i suggest keeping it at 1 minute
$yourstats="SELECT * from v_users WHERE username = '" . $player . "'";
$yourstats2=mysql_query($yourstats) or die("Could not get your stats");
$yourstats3=mysql_fetch_array($yourstats2);
$test=$yourstats3[username];
// this will tell apart the people on your site
$ip=$_SERVER['REMOTE_ADDR'];
$times=time();
$testsomething=$_SESSION['id'];
// remove old connections so that the number doesn't continue to rise like a counter
$onlinestats = "SELECT * FROM joined WHERE hl < $times";
$onlinestats2 = mysql_query($onlinestats) or die("Could not get your stats");
while ($onlinestats3 = mysql_fetch_assoc($onlinestats2))
{
    $timeon = time();
    $timerprot = $timeon - $onlinestats3["timeonline"];
    $tidminutter = (int) ($timerprot/60);
    $updateyourstats = "UPDATE v_users SET minonline=minonline+" . $tidminutter . " WHERE username = '" . $onlinestats3["username"] . "'";
    mysql_query($updateyourstats) or die("Could not update your Caravel stats");
}

$strq = "DELETE FROM joined WHERE hl < $times";
$qry = mysql_db_query($dbname,$strq);
$strq = "SELECT count(*) FROM joined WHERE IP='$ip'";
$qry = mysql_db_query($$dbname,$strq);

while ( $r = @mysql_fetch_array($qry) ) {
    $ppl = $r["count(*)"];
}

if ($cpt) {
// checks for reloads, etc..
    $strq = "UPDATE joined SET hl=hl + $timeout WHERE ip='$ip'";
    $qry = mysql_db_query($dbname,$strq);
    $strq = "UPDATE joined SET username='$player' WHERE ip='$ip'";
    $qry = mysql_db_query($dbname,$strq);
} else {
// confirmed user updated into database
    $times=time()+1800;
    $normaltime=time();
    $strq = "INSERT INTO joined (ip, hl, username, timeonline) VALUES ('$ip','$times','$player','$normaltime')";
    $qry = mysql_db_query($dbname,$strq);
}


// display the number of connected people
$strq = "SELECT count(*) FROM joined";
$qry = mysql_db_query($dbname, $strq);

while ( $result = @mysql_fetch_array($qry) ) {
    $ppl = $result["count(*)"];
}
$yourstats="SELECT * from v_users WHERE username = '" . $onlinestats3["username"] . "'";
$yourstats2=mysql_query($yourstats) or die("Could not get your stats");
$yourstats3=mysql_fetch_array($yourstats2);
$tidloggetind = time() - $yourstats3[lastlogin];
$tidtimer = (int) ($tidloggetind/3600);
if ($tidtimer < 3){
}else{
echo('<script type=\'text/javascript\'>parent.location.href=\'login.php\';</script>');
}
?>
Avatar billede nielle Nybegynder
23. juli 2005 - 09:02 #13
Bare så du ved det til en anden gang; Man kan ikke gøre dette:

$strq = "SELECT count(*) FROM joined";
$qry = mysql_db_query($dbname, $strq);

while ($result = @mysql_fetch_array($qry))
{
    $ppl = $result["count(*)"];
}

- idet $result["count(*)"] ikke giver noget som helst fornuftigt resultat.

I stedet skal det se sådan her ud:

$strq = "SELECT count(*) FROM joined";
$qry = mysql_db_query($dbname, $strq) or die(mysql_error());
$result = mysql_fetch_array($qry, MYSQL_NUM)
$ppl = $result[0];

- eller:

$strq = "SELECT count(*) AS antal FROM joined";
$qry = mysql_db_query($dbname, $strq) or die(mysql_error());
$result = mysql_fetch_assoc($qry)
$ppl = $result["antal"];

Læg mærke til at while-løkken også ryger idet SQL'en altid vil give præcis en post ud (med mindre der er en fejl).
Avatar billede nielle Nybegynder
23. juli 2005 - 09:18 #14
Med mindre der er mere kode oven over, eller at der sker noget i config.php, så ser det ikke ud til at din $player nogensiden indeholder noget fornuftigt fra starten af:
Avatar billede nielle Nybegynder
23. juli 2005 - 09:21 #15
... du starter jo koden sådan her:

<?php
// database information
include("config.php");
$player=$user_currently_loged;
// disconnected timeout
...

- hvilket vil side at $player sættes lig med $user_currently_loged som i sig selv er total udefineret.

Hvis den er blevet sat til noget på en anden side, så skal du igang med noget session som det mindste:

<?php 
// database information
session_start();
session_register("user_currently_loged");
$player = $user_currently_loged;

include("config.php");
// disconnected timeout
...

- og der skal selvfølgeligt være nohet tilsvarende på den side hvor det sættes.
Avatar billede nielle Nybegynder
23. juli 2005 - 09:31 #16
Så spørger også på $cbt:

if ($cpt) {
...

- før den overhovedet er defineret.
Avatar billede nielle Nybegynder
23. juli 2005 - 09:40 #17
Du har denne løkke

while ($onlinestats3 = mysql_fetch_assoc($onlinestats2))
{
    ...
}

- og til sidst i dit script har du dette:

$yourstats = "SELECT * from v_users WHERE username = '" . $onlinestats3["username"] . "'";

- hvor $onlinestats3 igen indgår. Men dette ligger uden for while-løkken og er derfor heller ikke veldefineret. Da den udregning som følger derfefter er afgørende fo om personen bliver logget ud (sendt til login.php) så der det nok det der fejler.
Avatar billede nielle Nybegynder
23. juli 2005 - 09:41 #18
Desværre må jeg fortælle dig at der er så mange fejl i din eksisterende kode at det nok bedst kan betale sig at smide den ud og skrive det helt forfra på en frisk. :^|
Avatar billede Slettet bruger
23. juli 2005 - 12:40 #19
Kan man kalde dét en monolog? ;-)  6 indlæg i træk. :o)
Avatar billede nicocarlos Nybegynder
23. juli 2005 - 12:41 #20
det var ikke så godt. Den står slet ikke til at rede? :D Jeg prøver lige nogle af de ting du skriver.
Avatar billede nielle Nybegynder
24. juli 2005 - 08:00 #21
nicocarlos> Selvfølgelig kan den reddes, men min vurdering er at det koster mindre tid at skrive det om, i stedet for at forsøge at finde alle fejlene. Som et bonus ender du forhåbentligt med en bedre kvalitet kode til sidst.

Jeg tror dog at de to værste er 23/07-2005 09:18:29 og 23/07-2005 09:40:16.
Avatar billede nielle Nybegynder
12. august 2005 - 11:59 #22
Har du fået løst dit problem?
Avatar billede nielle Nybegynder
19. august 2005 - 19:57 #23
?
Avatar billede Slettet bruger
19. august 2005 - 20:46 #24
Jeg tror ikke han er aktiv på eksperten mere.. :/
Avatar billede nicocarlos Nybegynder
02. november 2005 - 00:08 #25
tak for hjælpen lig svar jeg har helt glemt det spørgsmål sorry
Avatar billede nicocarlos Nybegynder
02. november 2005 - 00:08 #26
fik ikke løst problemet laver helt ny kode
Avatar billede nielle Nybegynder
02. november 2005 - 06:54 #27
Det var vist også det jeg rådede dig til ;^)
Avatar billede nicocarlos Nybegynder
02. november 2005 - 13:53 #28
jep :D
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