21. juli 2005 - 23:42Der 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);
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>'); } ?>
- 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.
Synes godt om
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'].
"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! :^(
Synes godt om
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.
Synes godt om
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 ;))
<?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);
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>'); } ?>
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).
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:
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.
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. :^|
Synes godt om
Slettet bruger
23. juli 2005 - 12:40#19
Kan man kalde dét en monolog? ;-) 6 indlæg i træk. :o)
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.
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.