PDA

View Full Version : I know why, but can't figure out a workaround..


Davey
09-06-2004, 04:40 PM
I know why this query returns 'Array', but I can't figure out how to get around it.

function getRank($rating)
{
global $dbase;
if ($rating < 0)
{
$rating = 0;
}
$max_rank_query = mysql_query("SELECT * FROM `chronos_ranks` ORDER BY `rating` DESC LIMIT 1",$dbase);
$max_rank = mysql_fetch_array($max_rank_query);
$max_rank = $max_rank['id'];
$rank_query = mysql_query("SELECT * FROM `chronos_ranks` WHERE `rating`<='" . $rating . "' ORDER BY `rating` DESC",$dbase);
$rank = mysql_fetch_array($rank_query);
if ($max_rank == $rank['id'])
{
$max_rating_query = mysql_query("SELECT * FROM `chronos_players` ORDER BY `rating` DESC LIMIT 1",$dbase);
$max_rating = mysql_fetch_array($max_rating_query);
$max_rating = $max_rating['rating'];
if ($max_rating > $rating)
{
$rank = mysql_fetch_array($rank_query);
}
}
return $rank;
}

I'm trying to return the rank which the rating fits into.
I tried:
$getrank = mysql_query("SELECT * FROM `chronos_ranks` WHERE `rating`<='" . $getuser['rating'] . "'",$dbase);
$getrank = mysql_fetch_array($getrank);
Trouble was, it returned "New Recruit ( 0 )" when I wanted it to return "Sergeant Major ( 7 )". When I replaced <= with >=, it returned "Second Lieutenant ( 8 )", which was 1 rank above what I needed.
I looked at the code of Babstats, and eventually found the function which determines the rank from the rating (which I copied the syntax of, see above function getRank() ).
function GetRank($rating) {
global $players_table, $ranks_table;
if($rating < 0) $rating = 0;
$max_rank_query = DBQuery("SELECT * FROM $ranks_table ORDER BY rating DESC LIMIT 1");
$max_rank = DBFetchArray($max_rank_query);
$max_rank = $max_rank["id"];
$rank_query = DBQuery("SELECT * FROM $ranks_table WHERE rating<='$rating' ORDER BY rating DESC");
$rank = DBFetchArray($rank_query);
if($max_rank == $rank["id"]) {
$max_rating_query = DBQuery("SELECT * FROM $players_table ORDER BY rating DESC LIMIT 1");
$max_rating = DBFetchArray($max_rating_query);
$max_rating = $max_rating["rating"];
if($max_rating > $rating) {
$rank = DBFetchArray($rank_query);
}
}
return $rank;
}
/*I don't believe I am breaking copyright laws, since I am
only posting a function not the whole file.*/
I would like to keep the function I copied, but is there any way to fix it, so that it returns the rank it's supposed to rather than 'Array' ?

Thanks for any help.

rake
09-06-2004, 08:50 PM
The array it returns is the database row for that rank. So....

return $rank['id'];

unless you want it to return something other than id, just replace $rank['id'] with whatever field you want.

Davey
09-07-2004, 08:57 AM
OMG it worked! Thank you!

Davey
09-07-2004, 11:42 AM
Possible to get a format like this: 1 day, 7 hours, 35 minutes from a total of seconds?
i.e., how do I change 15427 seconds into 'x days, x hours, x minutes' ?
Thx in advance.

rake
09-07-2004, 11:47 AM
$minutes = floor($x / 60) ;
$hours = floor($x / (60 * 60));
$seconds = $x - (hours * 60 * 60);

math. ;)

Davey
09-07-2004, 12:33 PM
Ah, but I suck at math. :(
Thx very much.
edit.-
For some reason, this:
$minutes = floor($statistics['time'] / 60);
$hours = floor($statistics['time'] / (60 * 60));
$days = floor($statistics['time'] / (60 * 60 * 24));
$statistics['time'] = "" . $days . "d, " . $hours . "h, " . $minutes . "m.";
Produces this:
0d, 3h, 210m.

CarCdr
09-07-2004, 01:23 PM
Yeah, you have to remove the largest period from the time as you move from, say, days down to seconds, otherwise, you end up counting things more than once.

Try this function. It is a little verbose, but the upside is that it is easier to understand/maintain. (I have not tested this code.)
function get_elapsed_time_string($interval_in_seconds) {

$diff = intval($interval_in_seconds);

$days = intval($diff / 86400); // div by sec's in a day
$diff -= $days * 86400; // then remove that amount

$hours = intval($diff / 3600); // div by sec's in an hour
$diff -= $hours * 3600; // remove the amount

$minutes = intval(($diff +15) / 60); // roundup: 45secs = 1 min

return "$days d, $hours h, $minutes m";
}

Davey
09-07-2004, 01:47 PM
Wonderful. You guys are amazing. :D Thanks!