Vous n'êtes pas identifié(e).
Je crois, mais je suis en train de tester en vrai
mais d'apres le code, je dirai que oui
Je confirme.
Dans ma table course, j'ai 2 courses au statut 2
si je lance la requete pour insérer ce qui va bien dans m_course2, ca me remplis la table comme ca (ici avec 2 courses donc):
INSERT INTO `m_course2` (`id`, `id_course`, `id_pet`, `dist_parcourue`, `nbparticipants`) VALUES
(1, 7, 1, 359.83, 5),
(2, 7, 23, 319.90, 5),
(3, 7, 21, 139.50, 5),
(4, 7, 4, 119.83, 5),
(5, 10, 17, 99.88, 4),
(6, 10, 34, 99.72, 4),
(7, 7, 32, 99.50, 5),
(8, 10, 35, 99.17, 4),
(9, 10, 36, 99.17, 4);
Dernière modification par ebouilleur (29-01-2012 17:49:17)
Hors ligne
c'est bien ca, donc teste ta procédure en conditions réelles et normalement tes gains devraient bien être distribués correctement.
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Mais n'oublie pas avant de faire ce que je t'ai dit : de mettre ta requete de mise à jour des distances parcourues avant ta procédure, sinon ton classement sera faux, et tes gains seront distribués aux mauvais joueurs.
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bon, c'est en cour de test, départ de la course a 18h10
Mais dans la table m_course2, il peut y avoir plusieurs courses (des courses qui ont lieux à la meme heures). Sinon oui on supprime la table a la fin du cron
Hors ligne
.. Il y a un truc qui me chiffone.
Cf la page 5. Normalement, quand tu clotures une course tu as bien 2 courses en cours, une qui n'est pas terminée et l'autre oui. Tu dois monter dans m_course2 celle qui est terminée grâce à
à cette clause sur la table course, qui te permet d'identifier la bonne course (celle qui est terminée pour pouvoir y appliquer les mises à jour de distance et tes gains). Donc normalement dans m_course2 tu ne dois bien avoir qu'une seule course...
Dernière modification par Jc (29-01-2012 18:05:14)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
ET si j'ai 2 courses, de meme durée qui commence au meme moment?
Hors ligne
Bien vu. Mais avant d'intégrer les courses multiples, fait fonctionner ton système correctement avec une course par intervalle de temps. Il te servira de modèle de base pour la gestion des courses multiples.
EDIT: D'ailleurs à ce propos, je me dépecherais à ta place de mettre à jour mon modèle et mon code avant de passer à cette étape, car sinon après tu risques de ne plus pouvoir la débogger sans dafalgan 1g.
Dernière modification par Jc (29-01-2012 18:15:46)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
OK, tu as pas tord, ne compliquons pas tout dès le début ^^
La course vient de démarrer (statut 2), résultat dans 20 minutes
Hors ligne
Bon, y a/avait plusieurs bug dans la procédure,
j'en ai résolu plusieurs, mais y en a encore
Et il n'y avait aucun appel a la table course, donc impossible de savoir les ressources mis en jeu
Donc en mieux ca donne :
Mais il me dit qu'il y a un soucis avec FETCH : #1328 - Incorrect number of FETCH variables
je vois avec google ce qu'il en pense...
Dernière modification par ebouilleur (29-01-2012 19:54:40)
Hors ligne
Oui c'est normal il faut qu'il y ait une variable par champ pour le fetch et dans le même ordre que les champs du select.
Les procédures c'est super sensible^^.
Dernière modification par Jc (29-01-2012 19:12:37)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Oui je vois que c'est sensible... plus j'avance, mieux ca devrait etre, mais non, j'ai tjs de nouvelles erreurs lol
La je pense que je suis tout proche de la vérité... mais pour mysql, non : #1054 - Unknown column 'nom_ress' in 'field list'
Pourtant j'ai déclarée cette variable. fetch a bien 7 champ comme select
bref tout roule ^^
Dernière modification par ebouilleur (29-01-2012 20:08:43)
Hors ligne
tu n'aurais pas un autre champ qui se nomme nom dans une des tables sélectionnées ?
a++
Hors ligne
Arf, non, mais j'ai trouvé
le pb doit etre la : UPDATE perso_ressource SET nom_ress=(nom_ress+gains) WHERE id_pseudo=idpseudo;
et je suppose qu'il veut croire que nom_ress est le nom de mon champ au lieu de prendre en comte le contenu de la variable... tu ne crois pas?
Quoi que...
je viens de modifier la ligne indiqué ci-dessus par :
IF type_ress=6 THEN
UPDATE perso_ressource SET angreal=(nom_ress+gains) WHERE id_pseudo=idpseudo; END IF;
Mais il m'affiche tjs la meme erreur mysql
OK bon si je met
ca passe bcp mieux
Dernière modification par ebouilleur (29-01-2012 20:21:54)
Hors ligne
set nom_du_champ = valeur
tu as trouvé
a++
Hors ligne
Bon, donc apres changement de ce qui ne sert a rien, ca donne :
Hors ligne
et je ne suis pas certain que ta combine pour le type de ressource soit accepté dans ta procédure, même si normalement ca devrait
Cela rejoint ce que j'avais dit. Donc normalement elle devrait fonctionner maintenant non?
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour,
Une chose aussi, dans un contexte transactionnel, j'ai fait une erreur, faut mettre le start transaction avant d'ouvrir le curseur, et le commit après le close. En effet dans un contexte multicourses, il faut préserver le contexte de mise à jour dans la transaction.
Dernière modification par Jc (30-01-2012 08:06:54)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bon je crois que tout est bon maintenant.
Mais ca bloque a cause d'un soucis, identifié, mais que je ne sais pas résoudre.
Dans mon cron, si ma tabme m_course2 est vide, la procédure est quand meme exécuté, mais comme il n'y a rien a faire, ca génère une erreur (#1329 - No data - zero rows fetched, selected, or processed)
Y a t il un truc a faire de spécial? ou je faut faire une vérification pour voir si il y a des enregistrement dans m_crouse2 ?
Voila la procédure terminée :
START TRANSACTION;
OPEN cur1;
REPEAT
FETCH cur1 INTO idcourse,idpet,idpseudo,nbpart,qte_ress,type_ress;
SET pos=pos+1;
IF pos=2 THEN SET basevalue=20; END IF;
IF pos=3 THEN SET basevalue=10; END IF;
SET gains=(basevalue*qte_ress*nbpart)/100;
IF type_ress=1 THEN UPDATE perso_ressource SET bois=(bois+gains) WHERE id_pseudo=idpseudo; END IF;
IF type_ress=2 THEN UPDATE perso_ressource SET herbe=(herbe+gains) WHERE id_pseudo=idpseudo; END IF;
IF type_ress=3 THEN UPDATE perso_ressource SET viande=(viande+gains) WHERE id_pseudo=idpseudo; END IF;
IF type_ress=4 THEN UPDATE perso_ressource SET plante=(plante+gains) WHERE id_pseudo=idpseudo; END IF;
IF type_ress=5 THEN UPDATE perso_ressource SET fer=(fer+gains) WHERE id_pseudo=idpseudo; END IF;
IF type_ress=6 THEN UPDATE perso_ressource SET angreal=(angreal+gains) WHERE id_pseudo=idpseudo; END IF;
UNTIL pos=3 END REPEAT;
CLOSE cur1;
COMMIT;
END##
Merci Jc
Dernière modification par ebouilleur (30-01-2012 23:04:54)
Hors ligne
Bonjour,
Si m_course2 est vide au début de ton cron qui traite cette partie, c'est qu'il n'y a aucune course à clôturer. Par conséquent si c'est le cas, tu peux arrêter le traitement et sortir du cron après la requête qui est censé remplir la table. En gros si 0 éléments ont été insérés dans m_course2, alors fin du traitement. Tu peux faire cela avec mysql_affected_rows() juste après ton insert.
Rien que par rapport à cette instruction (de manière à la rendre pertinente) il te faudrait passer tous tes traitements en transactionnel. Car si au même moment un insert concurentiel à lieu dans la base de donnée (insertion de données pour un pet, un combat, ou autre) cela peut te faire planter ton cron.
PS: N'oublie pas de mettre à jour ton modèle de données, car cela va te pénaliser à un moment ou un autre. Déjà cela t'oblige à faire 6 lignes de code dans ta procédure qu'il faudra mettre à jour si le nombre de ressources augmente ou change, au lieu d'une simple requête unique de mise à jour universelle.
++
Dernière modification par Jc (31-01-2012 08:11:40)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
J'ai du mettre
plutôt que ce que tu as dis, ca semblait ne pas fonctionner
Sinon, j'ai essayer de trouver un méthode pour traité plusieurs courses quand c'était nécessaire, mais toutes mes idées ont besoin de plus de requête... donc je supposes que j'ai pas trouvé LA bonne idée ^^
L'idée le moins pourri que j'ai trouvé, mais pas réussi a mettre en place, serai de faire un LIMIT 3 tout en groupant par id_course...
et apres faire un FETCH par id_course...
Hors ligne
Je pense que la meilleure façon pour le multicourses pour le traitement des gains, c'est de modifier la requête qui utilise m_course2 dans ta procédure, de façon à faire un GROUP BY id_course avec un ORDER BY dessus, ainsi tu ne modifies en rien ton code de traitement, sauf que tu auras désormais un changement de course qui se fait modulo 3 (trois lignes/course). Tu auras donc un double tri: sur l'id course puis sur la distance parcourue en DESC. Il est en effet important sur tes résultats pour ton traitement que les lignes des 3 premiers pets se suivent pour chaque course.
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonsoir,
Au fait pour ton if (mysql_affected_rows()!=0){ tu fais le contraire de ce que j'exprimais, c'est à dire que si mysql_affected_rows==0 alors tu quittes le traitement. Alors qu'ici ce que tu fais c'est de tester si des insertions ont bien eu lieues (auquel cas il ne faut pas quitter mais faire les traitements).
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bah ca marche pourtant comme ca... et faut bien faire qqchose si il y a eu des insertions, donc si différent...
Edit : non ca ne fonctionne pas... tu avais raison, je me suis trompé, sorry
Dernière modification par ebouilleur (06-02-2012 20:12:20)
Hors ligne
Bonsoir,
Au fait pour ton if (mysql_affected_rows()!=0){ tu fais le contraire de ce que j'exprimais, c'est à dire que si mysql_affected_rows==0 alors tu quittes le traitement. Alors qu'ici ce que tu fais c'est de tester si des insertions ont bien eu lieues (auquel cas il ne faut pas quitter mais faire les traitements).
++
En fait j'ai fait un if (mysql_affected_rows()>0){ et la ca fonctionne correctement.
Je pense que la meilleure façon pour le multicourses pour le traitement des gains, c'est de modifier la requête qui utilise m_course2 dans ta procédure, de façon à faire un GROUP BY id_course avec un ORDER BY dessus, ainsi tu ne modifies en rien ton code de traitement, sauf que tu auras désormais un changement de course qui se fait modulo 3 (trois lignes/course). Tu auras donc un double tri: sur l'id course puis sur la distance parcourue en DESC. Il est en effet important sur tes résultats pour ton traitement que les lignes des 3 premiers pets se suivent pour chaque course.
J'arrive pas à faire ce que je veux :(
Je vois pas comment faire un LIMIT 3 mais qui ne soit valable que sur un type de champ d'une colonne :( (avec le GROUP BY en fait)...
Sinon, j'ai besoin d'un autre coup de main pour modifier la fonction mysql que tu m'avais proposé pour le calcule de distance.
Pour mémoire la voici :
Et j'aimerais la modifier pour qu'elle donne ceci
:(équivalent en php) :
{
$rand = mt_rand(-999,999);
$rand = $rand/100;
if ($type_circuit == S) $add_competence = $strong;
if ($type_circuit == A) $add_competence = $agilite;
if ($type_circuit == I) $add_competence = $intel;
if ($type_circuit == E) $add_competence = $endurance;
$puissance = $strong + $agilite + $intel;
$distance_parcouru = ( $puissance - (($puissance_min+$add_competence)/$endurance) * ($temps)/($duree * 20 * 60) ) * $temps + $rand ;
return $distance_parcouru;
}
Mais je ne sais trop comment m'y prendre.
Merci
Hors ligne
Bonjour,
Désolé pour le temps mis à te répondre, mais je n'ai pas beaucoup de temps de libre ces derniers temps et cela risque d'être encore difficile pour moi une bonne partie du mois.
1) Pour ton mysql_affected_rows >0 cela marche en effet pareil, pas de soucis
2) Pour arriver à tes fins avec l'ordre des courses, tu ne peux l'avoir en relationnel qu'en effectuant un tri sur plusieurs critères consécutifs en même temps et un regroupement par course_id. Le regroupement va te permettre d'avoir tous les enregistrements d'une même course consécutifs ce qui est essentiel. Il te faut dessus faire un order by dist_parcourue DESC pour avoir un arrangement des lignes par ordre d'arrivée avec un limit 3 pour n'avoir que les 3 premiers. (c'est ce que tu as déjà de mémoire). A partir de la, la 4e ligne correspondra au premier de la course suivante, la 7e ligne au premier de la 3e course etc...
La seule chose à laquelle il te faut rester vigilant c'est que tes ORDER BY ne viennent pas modifier la consécutivité des enregistrements d'une même course. Il te faut donc protéger cela via la structure même de ta requête.
3) Tu as déjà les infos pour résoudre ton problème.
Voici un exemple de fonction issu du manuel de mysql
ayant déjà développé une procédure dans ce post, avec cette info là, tu as tout ce qu'il te faut pour mettre à jour ta fonction, l'algo étant déjà fait également.
++
Dernière modification par Jc (01-03-2012 23:14:23)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne