Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
Register FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 09-06-2004, 03:40 PM
Davey Davey is offline
 
Join Date: Nov 2002
Location: England
Posts: 383
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default I know why, but can't figure out a workaround..

I know why this query returns 'Array', but I can't figure out how to get around it.

PHP Code:
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:
PHP Code:
$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() ).
PHP Code:
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.
Reply With Quote
  #2  
Old 09-06-2004, 07:50 PM
rake's Avatar
rake rake is offline
 
Join Date: Nov 2002
Posts: 311
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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.
Reply With Quote
  #3  
Old 09-07-2004, 07:57 AM
Davey Davey is offline
 
Join Date: Nov 2002
Location: England
Posts: 383
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

OMG it worked! Thank you!
Reply With Quote
  #4  
Old 09-07-2004, 10:42 AM
Davey Davey is offline
 
Join Date: Nov 2002
Location: England
Posts: 383
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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.
Reply With Quote
  #5  
Old 09-07-2004, 10:47 AM
rake's Avatar
rake rake is offline
 
Join Date: Nov 2002
Posts: 311
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

$minutes = floor($x / 60) ;
$hours = floor($x / (60 * 60));
$seconds = $x - (hours * 60 * 60);

math.
Reply With Quote
  #6  
Old 09-07-2004, 11:33 AM
Davey Davey is offline
 
Join Date: Nov 2002
Location: England
Posts: 383
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Ah, but I suck at math.
Thx very much.
edit.-
For some reason, this:
PHP Code:
$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:
Code:
0d, 3h, 210m.
Reply With Quote
  #7  
Old 09-07-2004, 12:23 PM
CarCdr CarCdr is offline
 
Join Date: Apr 2004
Posts: 242
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

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.)
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";
}
Reply With Quote
  #8  
Old 09-07-2004, 12:47 PM
Davey Davey is offline
 
Join Date: Nov 2002
Location: England
Posts: 383
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Wonderful. You guys are amazing. Thanks!
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 06:43 PM.


Powered by vBulletin® Version 3.9.0
Copyright ©2000 - 2017, vBulletin Solutions Inc.