PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#101 07-12-2011 00:57:56

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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 :


<?php
define (VERSION_ARGS, "-V");
/***************************************************************
* Recuperation des parametres
***************************************************************/

if ($argc > 1) {
   for($i=1;$i<=$argc;$i++) {
      $arg = substr($argv[$i],0,2);
      if (strcmp($arg,VERSION_ARGS) == 0) {
          list(,$version) = explode("=",$argv[$i],2);
      }  
   }
}

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 smile

Dernière modification par ebouilleur (07-12-2011 01:00:10)

Hors ligne

#102 07-12-2011 16:12:27

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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

#103 07-12-2011 17:08:14

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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 wink

Hors ligne

#104 07-12-2011 22:36:59

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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

#105 09-12-2011 15:44:23

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bonjour,

Bon ca ne fonctionne toujours pas correctement hmm

A priori ca doit venir de cette requete :


UPDATE course,pet
          SET course.statut=3, pet.oqp=0
          WHERE (UNIX_TIMESTAMP(depart_theorique)+duree*120) <= UNIX_TIMESTAMP(NOW()) AND statut='2'
 

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

#106 09-12-2011 21:03:07

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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. wink

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

#107 10-12-2011 00:07:03

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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

#108 10-12-2011 08:42:33

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Parce qu'elle n'est pas exécutée wink 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

#109 10-12-2011 13:02:59

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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 :


<?php
define (VERSION_ARGS, "-V");
/***************************************************************
* Recuperation des parametres
***************************************************************/

if ($argc > 1) {
   for($i=1;$i<=$argc;$i++) {
      $arg = substr($argv[$i],0,2);
      if (strcmp($arg,VERSION_ARGS) == 0) {
          list(,$version) = explode("=",$argv[$i],2);
      }  
   }
}

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 hmm

Dernière modification par ebouilleur (10-12-2011 14:13:14)

Hors ligne

#110 10-12-2011 18:08:32

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bonsoir big_smile

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

#111 10-12-2011 22:25:26

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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

#112 11-12-2011 23:12:26

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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é):


if ($go_statut3 == TRUE){
/*********************************
 * On enregistres le classement à l'arrivée et attribue les gains (statut 3 et +)
 *  *********************************/

 // 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=2
      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 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

#113 12-12-2011 00:02:24

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bonsoir,

ebouilleur a écrit :

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

#114 12-12-2011 00:26:10

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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 smile

Hors ligne

#115 12-12-2011 09:21:16

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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:

WHERE (UNIX_TIMESTAMP(depart_theorique)+duree*120) <= UNIX_TIMESTAMP(NOW()) AND statut='2'

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


WHERE (UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(depart_theorique) > 1200 AND statut=2

Voilà wink

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

#116 15-12-2011 15:17:36

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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 wink
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

#117 17-12-2011 11:32:18

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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 :


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=2
      ORDER BY dist_parcourue DESC
 

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 :


UPDATE course, m_course2
          SET m_course2.ressource_quantite=(60/(course.ressource_quantite*m_course2.nbparticipants))*100, m_course2.ressource_type=course.ressource_type
          WHERE course.id_course=m_course2.id_course LIMIT 0,1
 

Mais on ne peut pas faire de LIMIT sur un update avec plusieurs table hmm

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

#118 17-12-2011 11:50:21

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

Bonjour,

Oui beuurrk! lol  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 wink

++

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

#119 17-12-2011 14:57:41

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

J'ai essayer de faire qqchose mais ca coince un peu hmm


DELIMITER ##
CREATE PROCEDURE `calc_gain`(IN id_course int)
BEGIN
DECLARE p_id_pet INT;
DECLARE p_nb_participants TINYINT;
DECLARE p_ressource_quantite INT;
DECLARE p_ressource_type TINYINT;

  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 wink

Dernière modification par ebouilleur (17-12-2011 14:58:04)

Hors ligne

#120 17-12-2011 18:05:11

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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 wink

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

#121 17-12-2011 18:09:44

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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 `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 ;

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 :


function ressource2nom($ressource)
// trouve le nom d'une ressource en fct de son numéro
{
  switch ($ressource)
  {
    case '1':
      $nom = "Bois";
    break;
    case '2':
      $nom = "Herbe";
    break;
    case '3':
      $nom = "Viande";
    break;
    case '4':
      $nom = "Plante";
    break;
    case '5':
      $nom = "Fer";
    break;
    case '6':
      $nom = "Angreal";
    break;
  }
  return $nom; 
}
 

merci

Dernière modification par ebouilleur (17-12-2011 18:11:31)

Hors ligne

#122 17-12-2011 19:46:27

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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

#123 17-12-2011 19:52:08

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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 wink

Bonne soirée

Hors ligne

#124 17-12-2011 22:53:48

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Trier le résultat d'une requete puis l'afficher comme voulu

brrrrrrrrrrr, cette fonction me donne des boutons big_smile
a++

Hors ligne

#125 28-12-2011 15:49:14

ebouilleur
Membre
Lieu : Nantes
Inscription : 19-05-2009
Messages : 165
Site Web

Re : Trier le résultat d'une requete puis l'afficher comme voulu

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

Pied de page des forums