Vous n'êtes pas identifié(e).
Hello,
Bon j'ai passé ma soirée a tester les courses depuis l'interface joueur et c'est pas mal (enfin ca fonctionne quoi^^)
Par contre, il y a un truc qui me "dérange". Le statut de la course 2 (course en cours) n'est pas changé au bout de la durée de la course (cad 20minutes en principe), mais a 40minutes en fait (durée de la course + 1 passage du cron). Dans le cron ca ne pose pas de soucis, mais du coup ca m'en pose pour ma page de classement qui est visible dans le jeu, car pour le coup je me sert du statut (2 ou 3) pour savoir si je dois calculer la distance_parcouru ou si je dois piocher dans la bdd)
Voila le code actuel :
if ($version == "") {
$version = $_GET['version'];
}
// on regarde quel version du cron lancer
if ($version == "beta"){
$chemin = "/home/ebouilleur/pet-racing/beta/";
} elseif ($version == "officiel") {
$chemin = "/home/ebouilleur/pet-racing/www/";
} else {
echo "<b>Bug, pas de version de sélectionné !!</b>";
exit;
}
$minutes = date("i");
echo "minutes : ".$minutes;
if ($minutes==0 OR $minutes==20 OR $minutes==40){$go_statut1 = TRUE;}
if ($minutes==10 OR $minutes==30 OR $minutes==50){$go_statut2 = TRUE;}
include ($chemin.'bdd/bdd_beta.php');
//include ($chemin.'fonctions/course.php');
//include ($chemin.'fonctions/divers.php');
try{
if ($go_statut1 == TRUE){
/*********************************
* On regarde si il y a des courses à mettre au statut 1 (soit Prêt à partir)
* *********************************/
// on met a jours les pet qui ne pourront pas participer
$select = "UPDATE course_participant,pet,course
SET course_participant.statut_pet=2
WHERE course_participant.id_course=course.id_course AND course_participant.id_pet=pet.id_pet AND course.statut=0 AND pet.oqp!=0 AND (UNIX_TIMESTAMP(course.depart_theorique)-UNIX_TIMESTAMP(NOW()))<=600 ";
$result = mysql_query($select);
if ($result===false){throw new Exception("Erreur de sélection des courses<br>$sqlUp<br>".mysql_error()."",E_USER_NOTICE);}
// création de la table memory course
$requete="CREATE TABLE `m_course` (
`id` int(10) unsigned NOT NULL auto_increment,
`id_course` int(10) unsigned NOT NULL,
`id_pet` int(10) unsigned NOT NULL,
`oqp` tinyint(3) unsigned NOT NULL,
`statut` tinyint(3) unsigned NOT NULL,
`nbparticipants` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_course` (`id_course`),
KEY `idx_pet` (`id_pet`),
KEY `idx_statut` (`statut`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci";
$result = mysql_query($requete);
if ($result===false){throw new Exception("Erreur de création de la table memory course",E_USER_NOTICE);}
// on remplit la table m_course de toutes les infos
$select = "INSERT INTO m_course (id_course, id_pet, oqp, statut, nbparticipants)
SELECT CP.id_course, CP.id_pet, t1.oqp, C.statut, COUNT(P.id_pet) as nbparticipants
FROM course_participant AS CP
LEFT JOIN (SELECT id_course,id_pet FROM course_participant) AS P ON CP.id_course=P.id_course
LEFT JOIN (SELECT id_pet, oqp FROM pet) as t1 ON t1.id_pet=CP.id_pet
LEFT JOIN course AS C ON CP.id_course=C.id_course
WHERE (UNIX_TIMESTAMP(depart_theorique)-UNIX_TIMESTAMP(NOW()))<=600 AND statut=0 GROUP BY CP.id_pet ";
$result = mysql_query($select);
if ($result===false){throw new Exception("Erreur de remplissage de la table memory course",E_USER_NOTICE);}
// on met a jour le statut oqp du pet a 4 et on cloture les inscriptions de la course si il y a plus de 4 pet
$sqlUp = "UPDATE course,pet,m_course
SET course.statut=1, course.nbparticipants=m_course.nbparticipants, pet.oqp=4
WHERE course.id_course=m_course.id_course AND pet.id_pet=m_course.id_pet AND m_course.nbparticipants>4 ";
mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur update course ok",E_USER_NOTICE);}
// on met a jour le statut de la course si il y a moins de 4 pet
$sqlUp = "UPDATE course, pet, m_course
SET course.statut=4, course.nbparticipants=m_course.nbparticipants
WHERE course.id_course=m_course.id_course AND pet.id_pet=m_course.id_pet AND m_course.nbparticipants<=4 ";
$result = mysql_query($sqlUp) ;
if ($result===false){throw new Exception("Erreur update course annulée",E_USER_NOTICE);}
// on efface la table m_course
$sqlDel = "DROP TABLE m_course ";
$result = mysql_query($sqlDel);
if ($result===false){throw new Exception("Erreur de suppression de la table memory course",E_USER_NOTICE);}
echo "<b>Cloture des inscription aux courses réalisés</b>";
}#go_statut1
if ($go_statut2 == TRUE){
// On commence par clôturer les courses en cours qui sont terminées.
$sqlUp = "UPDATE course,pet
SET course.statut=3, pet.oqp=0
WHERE (UNIX_TIMESTAMP(depart_theorique)+duree*120) <= UNIX_TIMESTAMP(NOW()) AND statut='2' ";
mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur de Maj cloture course",E_USER_NOTICE);}
// création de la table memory course
$requete="CREATE TABLE `m_course2` (
`id` int(10) unsigned NOT NULL auto_increment,
`id_course` int(10) unsigned NOT NULL,
`id_pet` int(10) unsigned NOT NULL,
`dist_parcourue` DECIMAL(8,2) unsigned NOT NULL,
`nbparticipants` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_course` (`id_course`),
KEY `idx_pet` (`id_pet`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci";
$result2 = mysql_query($requete);
if ($result2===false){throw new Exception("Erreur de creation de la table m_course2",E_USER_NOTICE);}
$sql7="INSERT INTO m_course2 (id_course, id_pet, dist_parcourue, nbparticipants)
SELECT t1.id_course,t1.id_pet,calc_dist(t2.endurance,t3.duree,t4.puissance_min,t2.puissance,t3.duree) as dist_parcourue, t3.nbparticipants
FROM course_participant AS t1
LEFT JOIN pet AS t2 ON t1.id_pet=t2.id_pet
LEFT JOIN course AS t3 ON t1.id_course=t3.id_course
LEFT JOIN
(SELECT t1.id_course AS courseid, t1.id_pet, MIN(t2.strengh+t2.agilite+t2.intelligence) as puissance_min
FROM course_participant AS t1 left join pet as t2 on t1.id_pet=t2.id_pet GROUP BY t1.id_course) as t4 ON t1.id_course=t4.courseid
WHERE t3.statut=3
ORDER BY dist_parcourue DESC";
$result7 = mysql_query($sql7);
if ($result7===false){throw new Exception("Erreur de remplissage de la table m_course2",E_USER_NOTICE);}
// on met a jour la distance dans la table course_participant
$sqlUp = "UPDATE course_participant, m_course2
SET course_participant.distance=m_course2.dist_parcourue
WHERE course_participant.id_course=m_course2.id_course AND course_participant.id_pet=m_course2.id_pet ";
$result = mysql_query($sqlUp) ;
if ($result===false){throw new Exception("Erreur update course_participant",E_USER_NOTICE);}
// On archive les courses terminées.
$sqlUp = "UPDATE course
SET statut='5'
WHERE statut='3' ";
$result=mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur de maj des course au statut 5",E_USER_NOTICE);}
// On lance le départ des courses en attente.
$sqlUp = "UPDATE course
SET statut=2, depart=NOW()
WHERE UNIX_TIMESTAMP(depart_theorique) <= UNIX_TIMESTAMP(NOW()) AND statut='1' ";
$result=mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur de Maj course au statut 2",E_USER_NOTICE);}
// on efface la table m_course2
$sqlDel = "DROP TABLE m_course2 ";
$result = mysql_query($sqlDel);
if ($result===false){throw new Exception("Erreur de suppression de la table memory course2",E_USER_NOTICE);}
echo "<b>Archives des couses et lancement ok</b>";
}#go_statut2
}catch (Exception $e){print $e->getMessage();exit;}
?>
En tout cas merci
Dernière modification par ebouilleur (07-12-2011 01:00:10)
Hors ligne
Bonjour,
Ton problème est tout à fait normal car tu n'as pas terminé.
C'est la première raison pour laquelle je t'ai demandé de programmer ton cron 10s après chaque 10min, et qu'il te faille tester en PHP l'heure d'exécution en cours pour savoir quelle partie de ton cron utiliser. Ici en l'occurence celle qui est en défaut c'est la deuxième partie et c'est elle qui fait passer le statut de la course en cloturée.
Pour ce décalage de 10s tes conditions de temps en php ne sont pas bonnes.
++
Dernière modification par Jc (07-12-2011 16:15:44)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
ok,
Je viens de me documenter, il n'est pas possible d'indiquer des secondes pour l'exécution d'un cron...
Du coup, au lieu de +10s on peut utiliser +1minutes?
Et ce que tu penses (pour la partie 2 uniquement) , c'est lancer le cron a 10 minutes pour lancer les courses et relancer le cron a 11minutes pour clore les courses?
Si c'est pas ca je ne suis pas ton idée
ET sinon, merci pour l'info sur try{}catch(){}, du coup je vais m'en servir sur mes autres pages pour ma gestion de message/alerte
Hors ligne
Bonsoir,
Oui cela te permet de centraliser ton traitement "d'erreur", première étape insdispensable pour faire quelque chose d'abouti. J'ai mis erreur entre guillemets car il s'agit pour l'instant d'une gestion de tes exceptions. Tu peux y intégrer la gestion des erreurs php par la suite.
Oui tu peux faire cela. Donc sur une heure : 10min partie A du cron ; 21min partie B du cron ; 30min partie A du cron; 41min partie B du cron; 50min partie A du cron ; 1min partie B du CRON, 10min ... etc..
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour,
Bon ca ne fonctionne toujours pas correctement
A priori ca doit venir de cette requete :
Car :
si duree vaut 20
si depart theorique vaut 2011-12-09 15:10:00
et si statut vaut bien 2
Alors a 15h42 ma requete devrait me sortir au moins 1 résultat.. mais non
et pourtant a un moment donnée ca passe bien au statut 3 (mais 1h après)...
je continue d'enqueter ^^
Dernière modification par ebouilleur (09-12-2011 17:51:02)
Hors ligne
Bonsoir,
Alors je suis désolé, je n'avais pas pris assez de recul sur ton problème. Les requêtes ne sont pas en cause ne les touche pas.
En fait il ne faut pas 2 parties à ton cron mais 3.
A) Tu testes les validations au départ
B) Tu Lances ta course
C) Tu enregistres le classement à l'arrivée et attribue les gains.
La répartition se fera ainsi:
10min:B ; 20min:A ; 30min:B ; 31min:C; 40min:A ; 50min:B ; 51min:C ; 00min:A ; 11min: C
J'ai fait ca vite, donc vérifie que je ne me soit pas mélangé les pinceaux^^.
++
EDIT je te l'ai refait pour être certain avec les indices pour les courses
B1 A2 B2 C1 A3 B3 C2 A4 B4 C3
10' 20' 30' 31' 40' 50' 51' 00' 10' 11'
Voilà avec ça tout fonctionnera nickel.
Dernière modification par Jc (09-12-2011 21:41:36)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
OK je test ca demain matin.
Du coup je comprend mieux pourquoi j'avais essayer de diviser la partie 2 en 2 morceau (d'ou mon "c'est lancer le cron a 10 minutes pour lancer les courses et relancer le cron a 11minutes pour clore les courses?" du post précédent meme si c t pas correcte)
Par contre, ca m'explique pas pourquoi ma requete de fait pas son update au bout de 20 minutes, enfin je teste ca demain comme j'ai dis
merci
bye
Hors ligne
Parce qu'elle n'est pas exécutée Lancer ton cron quand il faut c'est bien, qu'il fasse son travail c'est mieux. Revoit donc ton code de gestion de temps PHP dans ton cron.
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bon, je signe et persiste ^^
La requete a forcément un soucis.
D'une car dans mon exemple ci-dessus, je l'executais depuis pma
et que meme en aillant modifier le cron, ca ne passe tjs pas au statut 3 (au moment voulu)
Je te donne les infos :
CREATE TABLE IF NOT EXISTS `course` (
`id_course` int(11) NOT NULL auto_increment,
`id_pseudo` int(11) NOT NULL,
`depart_theorique` datetime NOT NULL,
`depart` datetime default NULL,
`duree` smallint(3) unsigned NOT NULL,
`statut` tinyint(3) unsigned NOT NULL,
`nom_circuit` varchar(20) NOT NULL,
`level_min` tinyint(3) unsigned NOT NULL,
`level_max` tinyint(3) unsigned NOT NULL,
`ressource_type` tinyint(4) NOT NULL,
`ressource_quantite` int(11) NOT NULL,
`nbparticipants` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`id_course`),
KEY `statut` (`statut`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;
--
-- Contenu de la table `course`
--
INSERT INTO `course` (`id_course`, `id_pseudo`, `depart_theorique`, `depart`, `duree`, `statut`, `nom_circuit`, `level_min`, `level_max`, `ressource_type`, `ressource_quantite`, `nbparticipants`) VALUES
(7, 10045, '2011-12-10 12:30:00', '2011-12-10 12:30:01', 20, 2, 'Naspet', 0, 14, 1, 500, 5);
Et ca m'affiche : Nombre d'enregistrements affectés : 0 (Traitement en 0.0007 sec.) (a 13h01 soit 10 minutes apres la fin de la course)
Sinon, mon cron modifié donne :
if ($version == "") {
$version = $_GET['version'];
}
// on regarde quel version du cron lancer
if ($version == "beta"){
$chemin = "/home/ebouilleur/pet-racing/beta/";
} elseif ($version == "officiel") {
$chemin = "/home/ebouilleur/pet-racing/www/";
} else {
echo "<b>Bug, pas de version de sélectionné !!</b>";
exit;
}
$minutes = date("i");
if ($minutes==0 OR $minutes==20 OR $minutes==40){$go_statut1 = TRUE;}
if ($minutes==10 OR $minutes==30 OR $minutes==50){$go_statut2 = TRUE; }
if ($minutes==11 OR $minutes==31 OR $minutes==51){$go_statut3 = TRUE;}
include ($chemin.'bdd/bdd_beta.php');
//include ($chemin.'fonctions/course.php');
//include ($chemin.'fonctions/divers.php');
try{
if ($go_statut1 == TRUE){
/*********************************
* On regarde si il y a des courses à mettre au statut 1 (soit Prêt à partir)
* *********************************/
// on met a jours les pet qui ne pourront pas participer
$select = "UPDATE course_participant,pet,course
SET course_participant.statut_pet=2
WHERE course_participant.id_course=course.id_course AND course_participant.id_pet=pet.id_pet AND course.statut=0 AND pet.oqp!=0 AND (UNIX_TIMESTAMP(course.depart_theorique)-UNIX_TIMESTAMP(NOW()))<=600 ";
$result = mysql_query($select);
if ($result===false){throw new Exception("Erreur de sélection des courses<br>$sqlUp<br>".mysql_error()."",E_USER_NOTICE);}
// création de la table memory course
$requete="CREATE TABLE `m_course` (
`id` int(10) unsigned NOT NULL auto_increment,
`id_course` int(10) unsigned NOT NULL,
`id_pet` int(10) unsigned NOT NULL,
`oqp` tinyint(3) unsigned NOT NULL,
`statut` tinyint(3) unsigned NOT NULL,
`nbparticipants` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_course` (`id_course`),
KEY `idx_pet` (`id_pet`),
KEY `idx_statut` (`statut`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci";
$result = mysql_query($requete);
if ($result===false){throw new Exception("Erreur de création de la table memory course",E_USER_NOTICE);}
// on remplit la table m_course de toutes les infos
$select = "INSERT INTO m_course (id_course, id_pet, oqp, statut, nbparticipants)
SELECT CP.id_course, CP.id_pet, t1.oqp, C.statut, COUNT(P.id_pet) as nbparticipants
FROM course_participant AS CP
LEFT JOIN (SELECT id_course,id_pet FROM course_participant) AS P ON CP.id_course=P.id_course
LEFT JOIN (SELECT id_pet, oqp FROM pet) as t1 ON t1.id_pet=CP.id_pet
LEFT JOIN course AS C ON CP.id_course=C.id_course
WHERE (UNIX_TIMESTAMP(depart_theorique)-UNIX_TIMESTAMP(NOW()))<=600 AND statut=0 GROUP BY CP.id_pet ";
$result = mysql_query($select);
if ($result===false){throw new Exception("Erreur de remplissage de la table memory course",E_USER_NOTICE);}
// on met a jour le statut oqp du pet a 4 et on cloture les inscriptions de la course si il y a plus de 4 pet
$sqlUp = "UPDATE course,pet,m_course
SET course.statut=1, course.nbparticipants=m_course.nbparticipants, pet.oqp=4
WHERE course.id_course=m_course.id_course AND pet.id_pet=m_course.id_pet AND m_course.nbparticipants>4 ";
mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur update course ok",E_USER_NOTICE);}
// on met a jour le statut de la course si il y a moins de 4 pet
$sqlUp = "UPDATE course, pet, m_course
SET course.statut=4, course.nbparticipants=m_course.nbparticipants
WHERE course.id_course=m_course.id_course AND pet.id_pet=m_course.id_pet AND m_course.nbparticipants<=4 ";
$result = mysql_query($sqlUp) ;
if ($result===false){throw new Exception("Erreur update course annulée",E_USER_NOTICE);}
// on efface la table m_course
$sqlDel = "DROP TABLE m_course ";
$result = mysql_query($sqlDel);
if ($result===false){throw new Exception("Erreur de suppression de la table memory course",E_USER_NOTICE);}
echo "<b>Cloture des inscription aux courses réalisés</b>";
}#go_statut1
if ($go_statut2 == TRUE){
/*********************************
* On regarde si il y a des courses à mettre au statut 2 (soit Course lancée)
* *********************************/
$sqlUp = "UPDATE course
SET statut=2, depart=NOW()
WHERE UNIX_TIMESTAMP(depart_theorique) <= UNIX_TIMESTAMP(NOW()) AND statut='1' ";
$result=mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur de Maj course au statut 2",E_USER_NOTICE);}
} #$go_statut2
if ($go_statut3 == TRUE){
// On commence par clôturer les courses en cours qui sont terminées.
$sqlUp = "UPDATE course,pet
SET course.statut=3, pet.oqp=0
WHERE (UNIX_TIMESTAMP(depart_theorique)+duree*120) <= UNIX_TIMESTAMP(NOW()) AND statut='2' ";
mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur de Maj cloture course",E_USER_NOTICE);}
// création de la table memory course
$requete="CREATE TABLE `m_course2` (
`id` int(10) unsigned NOT NULL auto_increment,
`id_course` int(10) unsigned NOT NULL,
`id_pet` int(10) unsigned NOT NULL,
`dist_parcourue` DECIMAL(8,2) unsigned NOT NULL,
`nbparticipants` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_course` (`id_course`),
KEY `idx_pet` (`id_pet`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci";
$result2 = mysql_query($requete);
if ($result2===false){throw new Exception("Erreur de creation de la table m_course2",E_USER_NOTICE);}
$sql7="INSERT INTO m_course2 (id_course, id_pet, dist_parcourue, nbparticipants)
SELECT t1.id_course,t1.id_pet,calc_dist(t2.endurance,t3.duree,t4.puissance_min,t2.puissance,t3.duree) as dist_parcourue, t3.nbparticipants
FROM course_participant AS t1
LEFT JOIN pet AS t2 ON t1.id_pet=t2.id_pet
LEFT JOIN course AS t3 ON t1.id_course=t3.id_course
LEFT JOIN
(SELECT t1.id_course AS courseid, t1.id_pet, MIN(t2.strengh+t2.agilite+t2.intelligence) as puissance_min
FROM course_participant AS t1 left join pet as t2 on t1.id_pet=t2.id_pet GROUP BY t1.id_course) as t4 ON t1.id_course=t4.courseid
WHERE t3.statut=3
ORDER BY dist_parcourue DESC";
$result7 = mysql_query($sql7);
if ($result7===false){throw new Exception("Erreur de remplissage de la table m_course2",E_USER_NOTICE);}
/*
// on reverse les ressources gagnées pour les 3 1er pet (respectivement 60% - 20% - 10% de toutes les ressources "misées")
SELECT ressource_type, ressource_quantite FROM course
$gain1 = (60/(ressource_quantite*nbparticipants))*100;
$gain2 = (20/(ressource_quantite*nbparticipants))*100;
$gain3 = (10/(ressource_quantite*nbparticipants))*100;
*/
// on met a jour la distance dans la table course_participant
$sqlUp = "UPDATE course_participant, m_course2
SET course_participant.distance=m_course2.dist_parcourue
WHERE course_participant.id_course=m_course2.id_course AND course_participant.id_pet=m_course2.id_pet ";
$result = mysql_query($sqlUp) ;
if ($result===false){throw new Exception("Erreur update course_participant",E_USER_NOTICE);}
// On archive les courses terminées.
$sqlUp = "UPDATE course
SET statut='5'
WHERE statut='3' ";
$result=mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur de maj des course au statut 5",E_USER_NOTICE);}
// on efface la table m_course2
$sqlDel = "DROP TABLE m_course2 ";
$result = mysql_query($sqlDel);
if ($result===false){throw new Exception("Erreur de suppression de la table memory course2",E_USER_NOTICE);}
echo "<b>Archives des couses et lancement ok</b>";
}#go_statut3
}catch (Exception $e){print $e->getMessage();exit;}
echo "\n";
?>
Autre test réalisé à l'instant :
départ a 13h30 (statut 2)
passage au statut 3 a 14h11
Dernière modification par ebouilleur (10-12-2011 14:13:14)
Hors ligne
Bonsoir
Désolé si cela me fait sourire, mais y a des jours comme ça, faut pas chercher à comprendre.
Moi aussi je presiste et je signe cela ne viens pas de ta requête^^.
2 choses à dire
1) Il faut TOUJOURS initialiser ses variables. donc tes go_statut mets les à false avant de commencer.
2) pour la 3e partie si tu commences par clôturer les courses tu fais comment pour faire le classement sur la dernière course, attribuer les gains etc? ... Regarde ce que j'ai fait au départ...
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Excuse moi je pense que c'est moi qui t'es induit en erreur.
En effet à la page 4 j'ai dit A) on cloture les courses mais cela voulait dire que c'est la partie ou l'on cloture les courses. La cloture des courses n'intervient qu'à la toute fin du A).
Tiens moi au courant. Désolé si je te lis un peu en diagonale ces derniers temps mais j'ai la tête dans le guidon tout le mois de décembre^^.
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Salut,
Ok donc j'y mis a false mes variable go_statut au début du fichier
2) pour la 3e partie si tu commences par clôturer les courses tu fais comment pour faire le classement sur la dernière course, attribuer les gains etc? ... Regarde ce que j'ai fait au départ...
Eh bien meme les courses fini, les infos sont toujours stockés, donc pour afficher le classement final ce n'était pas un probleme.
En effet à la page 4 j'ai dit A) on cloture les courses mais cela voulait dire que c'est la partie ou l'on cloture les courses. La cloture des courses n'intervient qu'à la toute fin du A).
OK, mais du coup, pourquoi ne pas les passer au statut 5 directement?
Et du coup, ma requete d'insertion de donnée dans m_course2, je le fais avec un WHERE statut=2 ? (ou je laisse 3 )
Voici le code modifié (non testé):
// on met a jour la distance dans la table course_participant
$sqlUp = "UPDATE course_participant, m_course2
SET course_participant.distance=m_course2.dist_parcourue
WHERE course_participant.id_course=m_course2.id_course AND course_participant.id_pet=m_course2.id_pet ";
$result = mysql_query($sqlUp) ;
if ($result===false){throw new Exception("Erreur update course_participant",E_USER_NOTICE);}
// On archive les courses terminées.
$sqlUp = "UPDATE course
SET statut='5'
WHERE statut='3' ";
$result=mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur de maj des course au statut 5",E_USER_NOTICE);}
// on efface la table m_course2
$sqlDel = "DROP TABLE m_course2 ";
$result = mysql_query($sqlDel);
if ($result===false){throw new Exception("Erreur de suppression de la table memory course2",E_USER_NOTICE);}
// On clôturer les courses en cours qui sont terminées.
$sqlUp = "UPDATE course,pet
SET course.statut=3, pet.oqp=0
WHERE (UNIX_TIMESTAMP(depart_theorique)+duree*120) <= UNIX_TIMESTAMP(NOW()) AND statut='2' ";
mysql_query($sqlUp);
if ($result===false){throw new Exception("Erreur de Maj cloture course",E_USER_NOTICE);}
echo "<b>Archives des couses et lancement ok</b>";
}#go_statut3
Merci pour ton aide
Dernière modification par ebouilleur (11-12-2011 23:14:10)
Hors ligne
Bonsoir,
OK, mais du coup, pourquoi ne pas les passer au statut 5 directement?
Tout simplement par ce que tu as plusieurs courses à gérer en même temps et que la seule manière d'identifier la bonne à traiter à un moment t c'est son statut et l'heure à laquelle tu le fais.
Excuses moi si je ne prends pas le temps de lire ta nouvelle tâche cron mais je suis mort, je vais donc me coucher et je regarde cela demain.
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bon, le code ne doit pas fonctionner...
course lancé a 2011-12-11 23:50:00
et a 0h25 c'est toujours au statut 2
Bonne nuit
Hors ligne
Bonjour,
Alors mea culpa cela vient bien en effet de la requête, en plus de ce que je viens de te faire modifier. Je ne sais pas pourquoi mais j'étais encore avec la conversion de duree dans ta fonction calc_dist.. alors que là on est dans une gestion de secondes avec unix_timestamp.
donc ceci est faux:
Au moment de clôturer ta course tu as deux courses qui ont le même statut =2 il faut donc clotûrer celle qui a commencé il y a plus de 20min comme suit
Voilà
Dernière modification par Jc (12-12-2011 09:22:13)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour,
J'avais vu, j'ai un peu manquer de temps (pour ca que ne j'ai pas répondu avant), mais j'ai tester hier dans différentes configurations et ca fonctionne parfaitement
il ne me reste plus qu'a faire mes 3 updates pour les dotations des gains
Je vais essayer de poster qqchose de bien et de fonctionnel ^^
Merci
Hors ligne
Bonjour,
J'arrive pas a trouvé une bonne méthode pour faire ma distribution de gain.
Pour rappel voici les gains pour les 3 premier (rien pr les autres)
// on reverse les ressources gagnées pour les 3 1er pet (respectivement 60% - 20% - 10% de toutes les ressources "misées")
$gain1 = (60/(ressource_quantite*nbparticipants))*100;
$gain2 = (20/(ressource_quantite*nbparticipants))*100;
$gain3 = (10/(ressource_quantite*nbparticipants))*100;
Je pensais déja rajouter les colonnes : ressource_quantite et ressource_type dans la table m_course2
Idéalement il faudrait remplir ces champs en meme temps que les autres, via cette requete :
Mais je ne pense pas que ce soit possible...
Donc j'étais parti sur le fait de faire un update de m_course2 dans le genre :
Mais on ne peut pas faire de LIMIT sur un update avec plusieurs table
J'ai bien une solution, mais ca ne resemble pas a ce que tu m'a appris... ca serai genre :
Un SELECT des 3 premier pet
un WHILE et dans ce while un update pour chaque pet
Ca serai moche non?
Hors ligne
Bonjour,
Oui beuurrk! sauf... si tu le fais via une procédure stockée. C'est le plus simple et le plus rapide si tu ne veux pas t'embêter et reste la solution la plus propre.
Par contre ta table m_course2 il ne faut pas y toucher, car je te rappeles qu'il ne sert à rien de la mettre à jour (elle va être effacée à la fin du traitement) d'autant plus qu'elle est là pour te donner les informations (le classement et le nb de participants) pour la mise à jour de ta table pets.
Donc dans ta procédure stockée que tu dois faire avec en requête de base pour ta boucle une requête sur m_course2 en fonction de id_pet,nb_participants toujours avec ORDER BY dist_parcourue DESC mais en rajoutant un limit 3. A partir de là tu peux faire une boucle pour mettre à jour ta table pets (celle qui contient les ressources pets et qui n'est pas de type memory). Mais n'oublie pas qu'il faut que tu soies en mode transactionnel (idéalement mais là vu que tu n'y es pas depuis le début tu peux zapper), et qu'il te faille exécuter cette procédure avant d'effacer ta table m_course2.
Je te laisse travailler un peu sur ta procédure, et si tu as besoin d'un coup de main, n'hésites pas
++
Dernière modification par Jc (17-12-2011 12:57:15)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
J'ai essayer de faire qqchose mais ca coince un peu
SELECT id_pet, nb_participants, ressource_quantite, ressource_type
INTO p_id_pet, p_nb_participants, p_ressource_quantite , p_ressource_type
FROM m_course2 WHERE id_course=id_course ORDER BY dist_parcourue DESC LIMIT 3;
DECLARE iter TINYINT DEFAULT 0;
DECLARE valeur TINYINT;
iterwhile: WHILE iter < 3 DO
SET valeur = 60;
SET gain = (valeur/(p_ressource_quantite*p_nbparticipants))*100;
UPDATE perso_ressource SET p_ressource_type=(p_ressource_type + gain) WHERE id_pseudo=p_id_pseudo;
IF valeur = 60 THEN
SET valeur = 20;
END IF;
IF valeur = 20 THEN
SET valeur = 10;
END IF;
END WHILE iterwhile;
END##
Et on ne se moque pas svp
Dernière modification par ebouilleur (17-12-2011 14:58:04)
Hors ligne
Excuse-moi, mais avant de faire quoi que ce soit, peux-tu me rappeler d'où viens l'info des quantités de ressources disponibles pour chaque course? (où si tu préféres la quantité de ressources disponible totale à partager aux gagnants)
Merci
Dernière modification par Jc (17-12-2011 18:06:25)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Elles sont dans la table course (c'est la valeur donner par chaque participant)
On reverse les ressources gagnées pour les 3 prmier pet (respectivement 60% - 20% - 10% de toutes les ressources "misées")
soit si je ne metrompe pas :
$gain1 = (60/(ressource_quantite*nbparticipants))*100;
$gain2 = (20/(ressource_quantite*nbparticipants))*100;
$gain3 = (10/(ressource_quantite*nbparticipants))*100;
Les ressources des pet sont dans la table : pet_ressources
CREATE TABLE IF NOT EXISTS `perso_ressource` (
`id_pseudo` int(11) NOT NULL auto_increment,
`bois` int(10) unsigned NOT NULL,
`herbe` int(10) unsigned NOT NULL,
`viande` int(10) unsigned NOT NULL,
`plante` int(10) unsigned NOT NULL,
`fer` int(10) unsigned NOT NULL,
`angreal` int(10) unsigned NOT NULL,
`quartz` int(10) unsigned NOT NULL,
UNIQUE KEY `id_pseudo` (`id_pseudo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=28567 ;
ET j'ai une fonction pour retrouver le nom d'une ressource :
merci
Dernière modification par ebouilleur (17-12-2011 18:11:31)
Hors ligne
Bonsoir,
Tu as un souci de modèle ici. Si le joueur x paye avec du quartz et un autre avec du bois sa participation, tu n'as aucun moyen d'avoir pour chaque course un inventaire précis de l'ensemble des ressources disponibles à partager aux 3 gagnants.
Idéalement il te faudrait une table course_ress (table de jonction) avec une clé primaire composite id_course et id_ress, elle même clé étrangère d'une table ressources listant l'ensemble des ressources disponibles pour ton jeu (relation de 1 à plusieurs vers course_ress). Ainsi cela te permettra plus tard de définir les coûts d'inscription à chaque course en fonction de son niveau. Par exemple 3 unité de bois et 2 unité d'herbe ou 1 unité de quartz, avec autant d'équivalence que tu souhaites. Tu peux même créer une précédence dans la valeur entre les ressources dans le cadre de ton jeu. Ainsi 5 unité de bois= 1 unité de quartz, etc... . Tu peux même définir une unité de valeur propre au jeu interne qui permet de convertir les types les uns par rapport aux autres, et simplifier ainsi ton système de coûts. Par exemple cette course vaut 10 unités X, en sachant que 3unités bois vaut 1 unité X, cela permet de gérer les ressources d'une manière plus fine.
Donc pour revenir à nos moutons, il te faudrait un modèle pour connaître pour une course donnée, l'ensemble des ressources disponibles à distribuer (ex: 3u de bois, 2u d'herbe, 5u de quartz, etc..) et faire une répartion par ressource et par valeur les unes par rapport aux autres.) A partir de là la requête de ta procédure sera un jeu d'enfants.
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
C'est le joueur qui cré la course qui choisi combien ca coute, donc s'il décide que c'est 100 bois, ca sera 100 bois que tt le monde devra payer
et c'est ces informations qui sont stocké dans la table course.. ne va pas chercher compliquer quand c'est simple
Bonne soirée
Hors ligne
brrrrrrrrrrr, cette fonction me donne des boutons
a++
Hors ligne
Bonjour Jc,
Vu que la période de Noel est passé, je voulais savoir si tu attendais qqchose de plus de moi vu que tu n'as pas fait de retour encore?
Merci
Hors ligne