PHP/SQL - Classement numéroté avec table users pour jeu

WRInaute occasionnel
Bonjour, je fais apel aux connaisseurs du php car j'ai un pti souci qui m'ennui.

En effet je suis en plein develloppement d'un gros site (elevage virtuel) mais j'ai un souci, c'est le classement.

Voila j'ai une table "users" dans laquelle sont stocké bien évidemment toutes les infos du client mais aussi sont nombre de points qu'il gagne en faisant diverse truc sur le site. Le champs "exp_eleveur" est en INT et donc peut aller de 0 à 9999...+ .

Concernant le classement je n'ai aucun probleme pour afficher les noms des 30 premiers... une simple récupération d'information et une répétition limitée a 30. parcontre je séche au niveau de la numérotation.

Quant le client entre dans son espace perso, il voit "classement général : xxx eme" , enfaite c'est ce "xxx" que je n'arrive pas à mettre en oeuvre . quelqu'un aurait t-il une idée ? merci à vous
 
WRInaute discret
À la fin de chaque journée, tu parcoures toute ta table en triant par le nombres de points.
Ensuite, tu mets à jour le champ position de chaque joueur, en créant préalablement une variable compteur qui sera incrémentée à chaque fois que tu lis une ligne.
 
WRInaute occasionnel
On va donc devoir utilisé un WHILE non ? j'y comprend plus rien 8O php me dépasse parfois lol mais souvent :p

Est ce que tu aurai un portion de code qui pourrait m'éclairer? merci
 
WRInaute discret
ok, donc pour commencer, rajoute un champ classement dans ta table users.

Code:
$rs = mysql_query("SELECT * FROM users ORDER BY nbpoints DESC);
$compteur = 1;
while($data=mysql_fetch_assoc($rs)
{
$pseudo = $data['pseudo']; //si tu as un champ id, prend lui
mysql_query("UPDATE users SET classement='$compteur' WHERE pseudo='$pseudo'")
$compteur ++;
}

Ensuite pour récupérer le classement d'un joueur, tu auras seulement à faire
SELECT classement FROM users WHERE pseudo='ZelkiN'
 
WRInaute occasionnel
ok c'est super cool de ta part, oui c'est vrai j'avais pas penser a ce genre d'incrémentation ^^, malgré qu'a mon avis ce soit un peu lourd avec plus de 100000 membres ... je verrai lol, je vais tester ca mais d'apres ton code tout doit marché nikel crome, thanks a toi :D
 
WRInaute passionné
un count sur du numerique devrait etre instantané même sur 1000 000 de membres

rog
 
WRInaute occasionnel
re bonjour, voila j'ai testé mais pti souci
le code :
Code:
$rs = mysql_query("SELECT * FROM users ORDER BY exp_eleveur DESC"); 
$compteur = 1; 
while($data=mysql_fetch_assoc($rs);)
{ 
$id = $data['id']; //si tu as un champ id, prend lui 
mysql_query("UPDATE users SET position='$compteur' WHERE id='$id'") 
$compteur ++; 
}

apres avoir mis des parentheses oubliées ;) j'ai encore une erreur, mais je ne sais pas trop comment la résoudre, ca vient de compteur = 1;
while($data=mysql_fetch_assoc($rs);)

Parse error: parse error in c:\program files\easyphp1-8\www\...\classement.php on line 6

quelqu'un pourrait m'aidé ? ty
 
WRInaute occasionnel
lol, voila j'ai trouvé, enfaite il y en avais un de trop, jamais de point virgules dans un while lol...

Code:
{ 
$id = $data['id']; //si tu as un champ id, prend lui 
mysql_query("UPDATE users SET position='$compteur' WHERE id='$id'");
$compteur ++; 
}

mais la encore un souci, ca ne me reconnais pas $id ...

NOTION : Undefined index: id
 
WRInaute passionné
rog a dit:
un count sur du numerique devrait etre instantané même sur 1000 000 de membres

rog

Si tu comptes le nombre de résultat que retourne une requete

select champs where nombre_de_point < nombre de point du joueur, tu as le nombre de personne classé avant lui.
Son classement est donc +1.

François
 
WRInaute occasionnel
j'y comprend rien, voila j'ai mis tout ce qu'il fallait, aucune erreur n'a lieu, ca a l'air de marché sauf que ... comme le dis "Suede" ca à l'air de m'updater +1...

enfaite j'ai 2 joueurs pour le moment (test), quand je lance le truc, ca me met que classement joueur 1 = 0 et que classement joueur 2 = 1, alors que joueur 1 est mieux classé que joueur 2... pti souci lol
 
WRInaute passionné
Perso, je n'affiche jamais le classement pour chacun (bon c'est vrai que pour moi, c'est pas primordial).
Mais éxécuter 100 000 fois (ou plus) une requête update en un seul script, ça me fait un peu peur...
La montée en charge ne doit pas être minime.


(je pourrai essayer mais j'ai la flemme lol)
 
WRInaute impliqué
En pleine nuit ce n'est pas bien grave. Tu fermes l'accès au site pendant 15 minutes et tu lances ton script.
 
WRInaute discret
Robinson a dit:
Perso, je n'affiche jamais le classement pour chacun (bon c'est vrai que pour moi, c'est pas primordial).
Mais éxécuter 100 000 fois (ou plus) une requête update en un seul script, ça me fait un peu peur...
La montée en charge ne doit pas être minime.


(je pourrai essayer mais j'ai la flemme lol)

Quand on a 100 000 membres, je pense qu'on a les infrastructures techniques pour faire face à ce genre de montée en charge :)
 
WRInaute passionné
bigjet a dit:
Robinson a dit:
Perso, je n'affiche jamais le classement pour chacun (bon c'est vrai que pour moi, c'est pas primordial).
Mais éxécuter 100 000 fois (ou plus) une requête update en un seul script, ça me fait un peu peur...
La montée en charge ne doit pas être minime.


(je pourrai essayer mais j'ai la flemme lol)

Quand on a 100 000 membres, je pense qu'on a les infrastructures techniques pour faire face à ce genre de montée en charge :)
Perso, j'ai un beau serveur dédié OVH à 333€HT/mois, bah j'ai pas envie de lancer ce genre de truc sur mon site.
Et j'ai encore moins envie de le fermer tous les jours 15 minutes même en pleine nuit car avec ce nombre de visiteurs, il y a toujours du monde sur le site :)

Il faut simplement trouver des alternatives.

Quand tu n'as qu'un seul script comme celui-ci ça passe.
Mais au fur et à mesure que le site grandit, le nombre de scripts augmente... alors autant éviter ce que l'on sait de très lourd.
 
WRInaute discret
Robinson a dit:
bigjet a dit:
Robinson a dit:
Perso, je n'affiche jamais le classement pour chacun (bon c'est vrai que pour moi, c'est pas primordial).
Mais éxécuter 100 000 fois (ou plus) une requête update en un seul script, ça me fait un peu peur...
La montée en charge ne doit pas être minime.


(je pourrai essayer mais j'ai la flemme lol)

Quand on a 100 000 membres, je pense qu'on a les infrastructures techniques pour faire face à ce genre de montée en charge :)
Perso, j'ai un beau serveur dédié OVH à 333€HT/mois, bah j'ai pas envie de lancer ce genre de truc sur mon site.
Et j'ai encore moins envie de le fermer tous les jours 15 minutes même en pleine nuit car avec ce nombre de visiteurs, il y a toujours du monde sur le site :)

Il faut simplement trouver des alternatives.

Quand tu n'as qu'un seul script comme celui-ci ça passe.
Mais au fur et à mesure que le site grandit, le nombre de scripts augmente... alors autant éviter ce que l'on sait de très lourd.

Un update sur 100 000 lignes c'est vraiment rien sur un serveur qui est censé pouvoir accommoder 100 000 membres.

Au pire des cas, tu fais un traitement par lot, avec une pause entre chaque 1000 update.

Sinon, une autre solution est de créer une table classement, contenant l'id et la position du joueur. (solution que j'ai adopté pour un concours de pronostics) Pour plus de performance, tu vides la table à chaque jour et tu fais un dump des classements qui auront préalablement été stockés dans un fichier texte.

De toutes façons, tu n'as pas le choix de stocker la position du joueur quelque part. Tu peux pas te permettre de faire des calculs à longueur de journée pour connaitre le classement d'un joueur. C'est mieux de faire une fois le sale boulot et de permettre au serveur de souffler le reste de la journée.

En passant, j'ai fait des tests de montée de charge pour un spécimen de 15 000 enregistrements. Les 15 000 update prenaient en moyenne 2 secondes pour s'exécuter sur un vieux céléron.
 
WRInaute occasionnel
J'ai toujours besoin d'aide, le while ne fonctionne pas chez moi, j'y comprend rien, cela fait plusieurs semaine que je suis dessus, je suis a bout :evil:

please HELP
 
WRInaute occasionnel
rog a dit:
la solution a suede me parait parfaite

rog

Pareil, c'est la meilleur solution.
Quand l'utilisateur veut se renseigner sur sa position, tu compte le nombre d'enregistrements totaux, ceux "avant" lui, et t'as sa position.
Tu met ça en cache (jusqu'à rafraîchissement du classement, à minuit par exemple), et t'es plus embêté.

Par contre, c'est bien de rêver, faire un jeu php, 100 000 membres, etc... Avant de viser la lune (car je peux t'assurer que c'est pas rien de monter un jeu en ligne php qui tient la route), peut-être devrais tu parfaire tes connaissances sur le sujet ?


Enfin je dis ça moi, on s'en fiche, dans 15 jours le projet aura sûrement était abandonné...
 
WRInaute occasionnel
ManiaGames a dit:
Enfin je dis ça moi, on s'en fiche, dans 15 jours le projet aura sûrement était abandonné...


dsl de te décevoir mais le projet est sur le point de se terminé, il manque plus que ca ...
 
WRInaute occasionnel
ZelkiN a dit:
On va donc devoir utilisé un WHILE non ? j'y comprend plus rien 8O php me dépasse parfois lol mais souvent :p

Est ce que tu aurai un portion de code qui pourrait m'éclairer? merci
ZelkiN a dit:
lol, voila j'ai trouvé, enfaite il y en avais un de trop, jamais de point virgules dans un while lol...

[...]

mais la encore un souci, ca ne me reconnais pas $id ...

NOTION : Undefined index: id
ZelkiN a dit:
j'y comprend rien, voila j'ai mis tout ce qu'il fallait, aucune erreur n'a lieu, ca a l'air de marché sauf que ... comme le dis "Suede" ca à l'air de m'updater +1...

Je suis septique, j'ai du mal à voir comment on peut faire certaines erreurs et ne pas comprendre certaines choses en fin de projet.
Néanmoins, si tu as réussi bravo à toi ;). Un lien accompagné des temps d'execution et du nombre de requêtes, je serrais preneur.
 
WRInaute occasionnel
voila, j'ai réussi, enfaite c'était tout simplement devant mes yeux ... trop du mal a la fin, j'en ai vraiment marre lol

ENFAITE tout simple, le joueur à un nombre x de point

tu selectionne tous les enregistrement "users" ayant moins ou égale à "x" points, voila tu compte le nombre total de ligne ! tout simple mais fallait il encore y penser ...

merci quand meme a vous, mais le while n'était pas la bonne solutions, 1 seul requete suffit a faire ceci et en plus c'est de l'instantannée ...
 
WRInaute occasionnel
Je suis également en train de bosser sur ce type de projet, ça fait un petit moment. Ce n'est vraiment pas une chose aisée bien que je n'ai jamais eu de problème avec l'affichage de stats avec appel à une base de données...

Je suis comme maniagames, j'attends de voir et pas que les benchmarks!
 
Discussions similaires
Haut