fonction pour définir un rank de forum

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : fonction pour définir un rank de forum

par VaN » 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.

par Ryle » 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 ;)

par Cyrano » 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";

par VaN » 14 févr. 2006, 12:40

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

fonction pour définir un rank de forum

par VaN » 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 ?