fonction pour définir un rank de forum

VaN
Mammouth du PHP | 1107 Messages

14 févr. 2006, 12:20

Bonjour à tous,

Je viens de finir ma fonction me permettant d'attribuer à chaque utilisateur un rank, lors de l'affichage d'un topic :
function define_rank($user_id)
{
	// on selectionne la date d'inscription, et on calcule le nombre de jours inscrits : $nbj
	$sql = 	"SELECT user_date
			FROM frm_users
			WHERE frm_users.user_id = '".$user_id."'";
	$query = mysql_query($sql) OR die("Erreur : ".mysql_error());
	$result = mysql_fetch_array($query);
	$date_cut = explode(' ', $result['user_date']);
	$date_cut = explode('-', $date_cut[0]);
	$current_date = time();
	$date_in_sec = mktime(0, 0, 0, $date_cut['2'], $date_cut['1'], $date_cut['0']);
	$ecart = $current_date - $date_in_sec;
	$nbj = floor($ecart / 3600 / 24);
	
	// on fait une moyenne du nombre de posts par jour : $mpj
	$sql_2 = 	"SELECT COUNT(post_id) AS posts_nb
				FROM frm_posts
				WHERE frm_posts.post_user_id = '".$user_id."'";
	$query_2 = mysql_query($sql_2) OR die("Erreur : ".mysql_error());
	$result_2 = mysql_fetch_array($query_2);
	$mpj = round(($result_2['posts_nb'] / $nbj),2);

	if($mpj > 3)
		$mpj = 3;
	$rank = $mpj * $nbj;
	
	$sql = 	"SELECT rank_title
			FROM frm_ranks
			WHERE rank_score < '".$rank."'";
	$query = mysql_query($sql);
	$result = mysql_fetch_array($query);
	$rank = $result['rank_title'];
	
	return $rank;
}
Le petit probleme que je rencontre se trouve dans la dernière requete, je ne sais pas comment la formuler pour aller chercher le rank maximum, mais qui soit inférieur au nombre de points requis pour l'avoir.

en gros j'ai :
Rank 01 -> 10 points
Rank 02 -> 20 points
Rank 03 -> 40 points

Un utilisateur qui possède 25 points devrait etre Rank 2, or avec ma syntaxe, il se retrouve avec le rank 01. Comment dois-je formuler ma requete ?

VaN
Mammouth du PHP | 1107 Messages

14 févr. 2006, 12:40

on dirait qu'un simple $sql = "SELECT MAX(rank_title) AS rank_title fait l'affaire.

Mammouth du PHP | 19672 Messages

14 févr. 2006, 12:44

Je ne suis pas certain d'avoir bien saisi, mais selon ce que j'ai compris, il faudrait faire quelque chose comme ceci:
$sql = "SELECT MAX(rank_score), rank_title
FROM frm_ranks
WHERE rank_score < '".$rank."'
GROUP BY rank_score";
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

14 févr. 2006, 12:46

Le problème vient du fait que ta requête retourne tous les rang dont le niveau est inférieur au score donné. Du coup, comme tu ne traites que le premier résultat, tu te retrouves avec le rang 1, alors que ton $query n'est pas vide :)

Tu peux, au plus simple, ajouter une clause "ORDER BY rank_score DESC" dans ton select afin de classer le résultat du plus grand au plus petit. Ainsi le premier que tu récupères, sera toujours le plus grand score inférieur à $rank.

L'autre possibilité pour ne récupérer qu'un seul enregistrement, est d'ajouter un MAX(rank_score) dans les champs que te ramène ton SELECT. Tu auras ainsi de même le plus haut rang répondant à la condition du WHERE.

Nota : évite de mettre des quotes autour des nombres en SQL : "WHERE rank_score < $rank". MySQL les convertis pour toi, mais c'est un traitement supplémentaire inutile, et beaucoup de base ne le feront pas ;)

VaN
Mammouth du PHP | 1107 Messages

14 févr. 2006, 13:50

Ok, requete modifiée en ajoutant le ORDER BY rantk_title DESC.

merci pour l'info concernant les ' dans la requete, je pensais que c'etait important, car une fois j'ai fais un UPDATE ... WHERE id = $valeur, et il m'a changé toutes les lignes de la tables, alors qu'avec un WHERE id = '".$valeur."', il ne me changeait que la ligne en question.