PHP|Débutant :: Forums

Advertisement

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

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

#1 10-11-2011 20:46:22

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

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

Bonjour,

Mon titre est pas très parlant, mais c'est dur de résumer mon problème en quelques mots wink
Je dois afficher le classement d'une course en fonction de la plus grande distance parcouru :
Le but est de classer un tableau par ordre décroissant en fonction d'un résultat obtenu grace a un calcul dont les variables sont dans ma bdd.

Dans ma bdd, j'ai les caractéristiques de personnes.
je les sorts, et grace a mon fonction calcul_distance_course je calcule combien ils ont parcouru (jusque la j'y arrive).
Maintenant je voudrais pouvoir afficher ces informations par ordre décroissant sur la distance...

Voici mon code actuel :


<?php
$sql = "SELECT id_course, id_pseudo, pseudo, strong, agilite, intel, endurance FROM course_participant WHERE id_course='$id_course' ";
$req = mysql_query($sql) or die('Erreur SQL 1!<br>'.mysql_error());
$tabAnnonces = array();
$first=true;
while ($var_news = mysql_fetch_array($req)) {
  $id_pseudo = $var_news ['id_pseudo'];  
  if(!$first) {
      $liste_id_pseudo.= " , ";
  }
  $liste_id_pseudo.= $id_pseudo; 
  array_push($tabAnnonces, $id_pseudo);  
  $tabAnnonce[$id_pseudo]['pseudo'] = $var_news ['pseudo'];    
  $strong = $var_news ['strong'];  
  $agilite  = $var_news ['agilite'];  
  $intel  = $var_news ['intel'];  
  $endurance = $var_news ['endurance'];    
  $tabAnnonce[$id_pseudo]['distance'] = calcul_distance_course($strong,$agilite,$intel,$endurance,$temps_ecoule_s,$puissance_min,$duree);
  $first = false;
}
?>
<table align="center" width="750" cellpadding="0" cellspacing="0">         
  <tr align="center">
    <td width="100" class="entetetableau">
    <b>Position</b>
    </td>
    <td width="400" class="entetetableau">
    <b>Maître</b>
    </td>  
    <td width="300" class="entetetableau">
    <b>Distance parcouru</b>
    </td>      
  </tr>      
  <?php
  $p = 1;
  foreach($tabAnnonces as $ind => $id_pseudo) {
  //recap variables
  $id_course  = $tabAnnonce[$id_pseudo]['id_course'];
  $pseudo     = $tabAnnonce[$id_pseudo]['pseudo']; 
  $distance   = $tabAnnonce[$id_pseudo]['distance'];
  ?> 
  <tr align="center">
    <td>
      <?php echo $p ;?>
    </td>  
    <td>
      <?php echo $pseudo ;?>
    </td>  
    <td>   
      <?php echo $distance; ?>
    </td>    
  </tr>  
  <?php
  $p++;
  }
  ?>
</table>
 

J'ai bien essayer avec asort($tabAnnonces); mais ca marche pas... je doute que ce soit si simple sad

Une idée?
Merci

Dernière modification par ebouilleur (10-11-2011 20:46:54)

Hors ligne

#2 11-11-2011 23:37:12

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,

Désolé de ne pas me contenter du tout de répondre à ta question. La meilleure solution serait en effet d'effectuer cette tâche par une requête. Si tu nous en disait plus, je t'aiderais bien volontier à la mettre en place wink

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 12-11-2011 01:24: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

Le soucis c'est que le calcul est fait apres avoir extrais les info de la bdd...

Hors ligne

#4 12-11-2011 23:34:23

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

Justement, le but est de le faire dans la requête. Une fois cela fait, tu pourras mettre deux, trois pages de code php à la poubelle et ton appli ne s'en portera que mieux.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 13-11-2011 23:15:48

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

Ca va etre guère pratique, car le classement peut être visualisé pendant les 20 minutes de course, donc ca voudrait dire modifier les info de ma bdd avant chaque affichage? ca me parrait plus compliquer au final...

Hors ligne

#6 13-11-2011 23:38:20

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,

Dans ce que tu nous montres :
1) tu récupères des informations statiques via ta requête (en apparence et de part le nommage choisi)
2) tu récupères tous les champs de ta requête que tu appliques dans une fonction de calcul de distance PHP (le calcul en lui-même est statique) et tu affiches le résultat : pas de mise à jour DB.

A partir de là, qui t'a parlé de "modifier les infos de ma bdd avant chaque affichage"?????

++

Dernière modification par Jc (13-11-2011 23:38:44)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 14-11-2011 22:22:47

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

Les info de la bdd sont statique, mais le temps évolu wink

Donc voila mon code (en fait c t plus simple que ce que ma tête imaginais wink )


<?php
 
$id_course = (INT)$_POST['id_course'];   
$sql1 = "SELECT depart, duree, status, puissance_min, time_maj_distance FROM course WHERE id_course='$id_course' ";
$req1 = mysql_query($sql1) or die('Erreur SQL 1!<br>'.mysql_error());
$var1=mysql_fetch_array($req1);
$puissance_min = $var1['puissance_min'];
$time_depart = $var1 ['depart'];
$duree = $var1 ['duree'];
$status = $var1 ['status'];
$time_maj_distance = $var1 ['time_maj_distance'];
$time = time();

// on regarde si la calcule de la distance date de moins de 2 minutes, si oui on programme la mise a jour de la distance dans la bdd
if (($time_maj_distance + 120 < $time ) AND ($status!=2) ){
  $maj_distance = TRUE;  
}

// si l'heure actuel dépasse l'heure de début + la durée de la course, alors on passe  la course en fini
$time_depart_plus_duree = $time_depart + ($duree * 60);
if ($time >= $time_depart_plus_duree){
  // on stop la course
  $sqlUp = "UPDATE course SET status=2, time_maj_distance=$time WHERE id_course='$id_course' ";
  mysql_query($sqlUp) or die('Erreur SQL : maj fin course !<br>'.$sqlUp.'<br>'.mysql_error());  
  $course_fini = TRUE;
  $temps_ecoule_s = $duree * 60;   # en seconde donc *60
}else{
  $temps_ecoule_s = $time - $time_depart;
  $sqlUp = "UPDATE course SET time_maj_distance=$time WHERE id_course='$id_course' ";
  mysql_query($sqlUp) or die('Erreur SQL : maj time_maj_distance !<br>'.$sqlUp.'<br>'.mysql_error());  
}

$sql = "SELECT id_pseudo, strong, agilite, intel, endurance FROM course_participant WHERE id_course='$id_course' ";
$req = mysql_query($sql) or die('Erreur SQL 1!<br>'.mysql_error());
$tabAnnonces = array();
$first=true;
while ($var_news = mysql_fetch_array($req)) {
  $id_pseudo = $var_news ['id_pseudo'];  
  if(!$first) {
      $liste_id_pseudo.= " , ";
  }
  $liste_id_pseudo.= $id_pseudo; 
  array_push($tabAnnonces, $id_pseudo);  
  $strong = $var_news ['strong'];  
  $agilite  = $var_news ['agilite'];  
  $intel  = $var_news ['intel'];  
  $endurance = $var_news ['endurance'];    
  $distance = calcul_distance_course($strong,$agilite,$intel,$endurance,$temps_ecoule_s,$puissance_min,$duree);
  if ($maj_distance == TRUE){
    // on met a jour la distance parcuouru par chaque pet
    $sqlUp = "UPDATE course_participant SET distance=$distance WHERE id_pseudo='$id_pseudo' ";
    mysql_query($sqlUp) or die('Erreur SQL : maj oqp pet départ course !<br>'.$sqlUp.'<br>'.mysql_error());  
  }  
  $first = false;
}

if ($course_fini == TRUE){
  // on met les pet en non oqp si la course est finie  
  $sqlUp = "UPDATE pet SET oqp=0 WHERE id_pet IN (".$liste_id_pseudo.") ";
  mysql_query($sqlUp) or die('Erreur SQL : maj oqp pet départ course !<br>'.$sqlUp.'<br>'.mysql_error());  
}  
include ('pages/msg.php');
?>     


<table width="700" cellpadding="0" cellspacing="0">        
  <tr align="center">
    <td width="100" class="entetetableau">
    <b>Position</b>
    </td>
    <td width="400" class="entetetableau">
    <b>Maître</b>
    </td>  
    <td width="300" class="entetetableau">
    <b>Distance parcouru</b>
    </td>      
  </tr>      
  <?php
  $sql = "SELECT pseudo, distance FROM course_participant WHERE id_course='$id_course' ORDER BY distance ASC ";
  $req = mysql_query($sql) or die('Erreur SQL 1!<br>'.mysql_error());
  $p = 1;
  while ($var_news = mysql_fetch_array($req)) {
  ?> 
  <tr class="ligne_messagerie1" onmouseover="this.className='ligne_messagerie2';" onMouseOut="this.className='ligne_messagerie1';" align="center" >
    <td>
      <?php echo $p ;?>
    </td>  
    <td>
      <?php echo $var_news ['pseudo'] ;?>
    </td>  
    <td>   
      <?php echo $var_news ['distance']; ?>
    </td>    
  </tr>  
  <?php
  $p++;
  }
  ?>
  <tr align="center">
    <td colspan="3"> 
      <br />
      <?php
      $temps_ecoule_m = floor($temps_ecoule_s / 60);
      echo "Classement à ".$temps_ecoule_m." minutes du départ :" ;
      if ($status == 1 ) echo " <b>Course en cours...</b>" ; if ($status == 2 ) echo " <b>Course terminée !</b>" ;
      ?>
    </td>  
  </tr>  
</table>           

 

Je pense que ca le fait, non?
Merci en tout cas
smile

Hors ligne

#8 15-11-2011 00:03:47

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,

Bien que tu m'aurais expliqué un peu le contexte de ta course ca aurais pu m'aider, (ca m'aiderait encore un peu), mais je pense qu'en terme de simplification tu as encore pas mal de marge wink
Si j'ai bien tout compris, les durées de tes courses sont constantes (ou prédéfinies à l'avance), les distances parcourues (bien que cela aurait été chouette de ta part que tu nous montre le calcul) sont déterminées par le calcul de ta fonction. Bien que cela sous entende qu'un pet parcours toujours la même distance en un temps donné, et que du coup je ne vois pas bien l'intérêt de ces courses car selon les pets en présence, on peut savoir d'avance qui sera le vainqueur, enfin il me semble, à partir du moment où tu connais ta fréquence t'intérogation de ta bdd, ta requête n°1 peut te dire si ta course à déjà commencée ou si elle est terminée et peut te donner à chaque interrogation la distance parcourue de tout le monde si elle est en cours. Te reste juste à créer une requête qui enregistre que la course est terminée et qui enregistre en même temps la distance parcourue de tout le monde. (Tu ne peux pas la faire dans la première pour des questions de gestion de verrous avec MySQL).

voilà wink

Dernière modification par Jc (15-11-2011 00:04:19)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#9 15-11-2011 23:30: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

Comme je détails tout, mais je voulais pas faire peur avec un énorme pavé dès le début wink

Donc en gros on prend le principe d'un diablo-like et d'une course et ca donne mon truc.
Donc chaque pet a un niveau différent et au fur et a mesure du jeux va gagné en niveau.
La formule (non fini) de calcule de distance est calculé en fonction de la force, agilite, intel et endurance, du temps depuis le début de la course et de la durée (en principe 20 minutes) comme ca :


function calcul_distance_course($strong,$agilite,$intel,$endurance,$temps,$puissance_min,$duree)
// on calcule la distance parcouru par le pet

{
  $puissance = $strong + $agilite + $intel;
  $distance_parcouru = ( $puissance - ($puissance_min/$endurance) * ($temps)/($duree * 20 * 60) ) * $temps ;
//  echo "distance parcouru : ".$distance_parcouru;
  return $distance_parcouru;
}
 

La code donné ci-dessus est le code de la page classement, qui est donc accessible dès le début de la course et on peut suivre l'évolution du classement toute au long des 20 minutes de la course.
Apres les 20 minutes du départ, ma page affiche juste les info sur la distance parcouru et donc le classement.

Par rapport a ta dernier phrase, tu veux dire qu'il me serai plus logique de directement calculer et stocker en bdd le résultat de la course, meme si celle ci n'est pas fini ? si oui je fais comment pour classer par ordre de position entre 0 et 20 minutes ? (en effet le 1er a 2minutes ne sera peut etre pas le 1er a 20min)

PS : Sinon, faut aussi savoir que la participation a une course coût des ressources (bois ou pierre ou ...) et que je dois redistribuer 90% des ressources au 3 premiers.

Merci

Dernière modification par ebouilleur (15-11-2011 23:54:07)

Hors ligne

#10 16-11-2011 11:20:57

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 cela confirme ce que je te disais tout au début, tu peux le faire en BD directement. Tu n'as pas besoin de stocker le résultat (classement) pendant la course, X se connecte à un instant t, Y se connecte à un instant t+u, les deux peuvent ne pas voir le même classement. Donc ta requête te sors le classement durant la course au moment où elle est consultée, et c'est une fois la course finie que tu stockes le classement final en db pour l'affectation des ressources.

As-tu les droits sur ta db pour créer une procédure stockée?

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#11 16-11-2011 11:59:35

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

Heu, je ne sais pas ce qu'est une procédure stockée, mais vu que c'est mon serveur, je devrais pouvoir satisfaire a ta demande.

Pour info je te montre la structure de mes 2 table actuel :


--
-- Structure de la table `course`
--

CREATE TABLE IF NOT EXISTS `course` (
  `id_course` int(11) NOT NULL auto_increment,
  `id_pseudo` int(11) NOT NULL,
  `depart` varchar(30) NOT NULL,
  `duree` int(4) NOT NULL,
  `status` int(1) NOT NULL,
  `nom_circuit` varchar(20) NOT NULL,
  `level_min` int(3) NOT NULL,
  `level_max` int(3) NOT NULL,
  `ressource_type` int(10) NOT NULL,
  `ressource_quantite` int(2) NOT NULL,
  `puissance_min` int(11) NOT NULL,
  `time_maj_distance` varchar(30) NOT NULL,
  UNIQUE KEY `id` (`id_course`),
  KEY `id_pseudo` (`id_pseudo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- --------------------------------------------------------

--
-- Structure de la table `course_participant`
--

CREATE TABLE IF NOT EXISTS `course_participant` (
  `id_course` int(11) NOT NULL,
  `id_pet` int(11) NOT NULL,
  `id_pseudo` int(11) NOT NULL,
  `pseudo` varchar(40) NOT NULL,
  `strong` int(10) NOT NULL,
  `agilite` int(10) NOT NULL,
  `intel` int(10) NOT NULL,
  `endurance` int(10) NOT NULL,
  `puissance` int(10) NOT NULL,
  `distance` varchar(10) NOT NULL,
  KEY `id_pet` (`id_pet`),
  KEY `id_pseudo` (`id_pseudo`),
  KEY `distance` (`distance`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 

Une course peut etre créée par n'importe quel joueur. Tous les pets (qui ont le niveau qui va bien) peuvent la rejoindre moyenne le cout de la course.
Une course qui n'a pas pris le départ est au status 0.
Elle passe au status 1 quand elle a démarrer (j'ai un cron qui vérifie les courses a lancer toutes les minutes)
Et une fois fini, elle passe au status 2.

Et je pensais faire un cron chaque semaine pour historiser les courses qui sont terminée (mais c'est a voir)

Dernière modification par ebouilleur (16-11-2011 12:03:02)

Hors ligne

#12 16-11-2011 13:13:56

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,

Sans aborder la pertinence de choix des types de champs ( ex: INT(10) pour endurance par exemple, un TINYINT UNSIGNED (1<=x<=255) ne serait-il pas suffisant? ), je ne comprends pas la pertinence de tes choix au niveau de la normalisation de tes tables: ex: que font strong (strengh^^), agilite, intel, endurance,puissance dans la table course? ce sont il me semble des caractéristiques de pet non?


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#13 16-11-2011 15:54: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

Exacte un tinyint serait suffisant.... Et avant de mettre strong, j'avais force... et j'ai mis un bout de temps avant de comprendre que c'est un terme qu'on ne peut pas utiliser lol

J'ai stocké ces valeurs pour plus de facilité je crois (en tout cas si il y avait une autre raison, ca ne me revient pas) et aussi pour que si les caractéristiques du pet évolue (sil gagne 1 niveau) ce sont les valeurs initiales qui soient utilisé.
Comme les infos ne sont stocké dans cette table que temporairement, je me suis dis que c'était plus simple de tout avoir dans la meme table plutot que de faire :
table course -> on va chercher les participatnt table participant -> puis on va chercher les info dans la table pet

Hors ligne

#14 16-11-2011 16:27:49

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,

^^ plus simple ^^ wink En fait non. La preuve: regarde la longueur de ton code PHP et le nombre de requêtes envoyées au serveur... Donc pour ta requête cela serait bien que tu fasses un show create table sur toutes les tables concernées (manque juste celle des pets si je ne m'abuse) et ensuite ca devrait aller.

Au fait "durée" est exprimée en minutes ou en secondes?
Dis moi aussi si je ne me trompe pas: La course dure 20min. Si aucun pet a parcouru la distance du parcours pendant ce laps de temps, le classement retenu est celui obtenu à 20min, et sinon c'est lorsqu'un pet a parcouru la distance totale. Et c'est une tache cron qui détermine lorsque la course est terminée c'est cela?

++

Dernière modification par Jc (16-11-2011 16:33:00)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#15 16-11-2011 16:32:25

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

Re,

Voila la table pet (je changerai les types de champs wink )

CREATE TABLE IF NOT EXISTS `pet` (
  `id_pet` int(11) NOT NULL auto_increment,
  `nom_pet` varchar(40) NOT NULL,
  `id_pseudo` int(11) NOT NULL,
  `type_pet` tinyint(1) NOT NULL,
  `level` int(3) NOT NULL,
  `xp` decimal(11,2) NOT NULL,
  `sante` int(10) unsigned NOT NULL,
  `strong` int(10) NOT NULL,
  `resistance` int(10) NOT NULL,
  `endurance` int(10) NOT NULL,
  `reactivite` int(10) NOT NULL,
  `attaque` int(10) NOT NULL,
  `defense` int(10) NOT NULL,
  `agilite` int(10) NOT NULL,
  `portage` int(10) NOT NULL,
  `intelligence` int(10) NOT NULL,
  `vie` int(10) NOT NULL,
  `oqp` int(1) NOT NULL,
  `aptitude` varchar(1) NOT NULL,
  `nourriture` varchar(1) NOT NULL,
  UNIQUE KEY `id_pet` (`id_pet`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;

 

Pour info :
type_pet : indique le type de pet (1 = chien, 2 = chat, etc...)
aptitude : indique si c'est un pet force, agilité ou magique (=intelligence)
nourriture : indique le type  denourriture mangé par le pet

duree est exprimer en minutes (en principe 20 ou 40)

En fait au début je voulais fixer une distance a parcourir en fonction du choix des parcours, mais ca me semblais pas simple a géré. Je suis donc parti sur le principe qu'une course avait une durée de fixé et que celui qui parcourait la plus grande distance avait gagné (et du coup, plus vraiment besoin de cron)

voila smile

Dernière modification par ebouilleur (16-11-2011 16:36:03)

Hors ligne

#16 16-11-2011 16:34: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

OK^^ excuses

Je reviens vers toi avec ma proposition de requete

Dernière modification par Jc (16-11-2011 16:36:07)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#17 16-11-2011 16:35:31

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

Vivi je modifiait mon post au fur et a mesure wink

Hors ligne

#18 16-11-2011 16:36:47

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

Dans ta formule les distances sont en metres?


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#19 16-11-2011 16:41:40

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 en ce que l'on veut, metres, kilometre, pouce, ...

Hors ligne

#20 16-11-2011 16:42:34

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

Ok a+ je fais au plus tot, mais boulot boulot en prio wink


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#21 16-11-2011 16:47:47

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

Oui pas de soucis, c'est normal.
Et mon jeu à plus de 1 an de retard.. je suis plus a quelques jours près hmm

Merci d'avance

Hors ligne

#22 17-11-2011 14:06:50

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,

Excuse moi pour mon retour tardif sur le forum, mais j'ai fini hier à 3h du mat^^..
J'ai encore un petit souci avec tes définitions, qui dans un but de simplification n'ont que pour effet d'en compliquer allègrement la gestion. Pour pouvoir effectuer la requête que j'ai immaginé pour toi (elle va te plaire wink ) mon principal problème est que je n'ai pas à disposition d'un champ datetime ou timestamp pour qualifier le référentiel du départ de chaque course. C'est un champ qui peut être défini avec une valeur par défaut NULL tant que le départ n'à pas eu lieu. Le champ statut reste malgré tout indispensable à plus d'un titre si cela peut te rassurer. D'une part de part la façon dont tu gères tes courses, et d'autre part, ce champ garde son intérêt pour savoir si une course à démarré ou non, et ce, même si pour le savoir il suffirait de regarder le champ départ: Si =NULL alors course non démarrée, si <>NULL alors course démarée. Mais voilà, il est peu rentable/performant d'indexer un champ pouvant recevoir des valeurs de type NULL. Ainsi en indexant ton champ status, tu gardes les performances et la pertinence de cet index. Donc ne m'en veut pas, mais pour ma proposition de requête, je pars du principe que le champs depart de la table course est un champ de type DATETIME avec NULL comme valeur par défaut. Je te laisse faire la modif, ou le rajout.

En attendant cette validation et la requête qui va suivre, voici déja la procédure stockée pour ton calcul de distance. A ce propos, tu as vraiment un souci avec tes définitions de champ dans tes tables, car même si un TINYINT UNSIGNED n'est pas suffisant pour ta gestion un SMALLINT UNSIGNED devrait l'être largement. Donc si tu modifies les définitions de tes champs dans tes tables, je te laisse mettre à jour les définition dans la procédure de manière à les faire correspondre.


DELIMITER $$
CREATE DEFINER `root`@`localhost`
FUNCTION `calc_dist`(strengh int, agilite int, intel int, endu int, temps int, power_min int, duree int) RETURNS DECIMAL (6,2)
RETURN ((((strengh+agilite+intel)-(power_min/endu)*temps)/(duree*120))*temps)
 

Merci de me faire un retour sur ce problème de définition de champ. J'attaque la requête dans la journée.

++

Dernière modification par Jc (17-11-2011 14:10:56)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#23 17-11-2011 14:34:55

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

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

Jc a écrit :

Excuse moi pour mon retour tardif sur le forum, mais j'ai fini hier à 3h du mat^^...

Donc aujourd'hui ? tongue




Je suis déjà dehors ....:rolleyes:


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#24 17-11-2011 14:57:01

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

Jc a écrit :

mon principal problème est que je n'ai pas à disposition d'un champ datetime ou timestamp pour qualifier le référentiel du départ de chaque course.

Je ne te suis pas. Dans la table course, il y a le champ "depart" (certe c'est un varchar), mais ca contient la valeur time du départ de la course.
Pourquoi veux tu avoir un autre champ à NULL et remplis quand la course a commencée?

Pour mes définitions de champs, c'est vrai que j'ai tendance a etre très généreux lors de la création... et donc oui je vais les modifier comme tu me l'as conseillé (je le fais maintenant, et je te copie/colle une fois fait).

Pour la procédure stockée, je ne connait pas du tout ca, je vais demander à google de m'éclairer la dessus wink

Et si tu veux voir le "rendu" web de ce qu'il y a deja en place pour la course, je peux te donner accès au site.
merci

Apres les modif dans mes tables, ca donne (confirme moi si ca te semble ok stp) :

CREATE TABLE IF NOT EXISTS `pet` (
  `id_pet` int(11) unsigned NOT NULL auto_increment,
  `nom_pet` varchar(40) NOT NULL,
  `id_pseudo` int(11) unsigned NOT NULL,
  `type_pet` tinyint(1) NOT NULL,
  `level` tinyint(3) unsigned NOT NULL,
  `xp` decimal(11,2) NOT NULL,
  `sante` smallint(6) unsigned NOT NULL,
  `strong` tinyint(3) unsigned NOT NULL,
  `resistance` tinyint(3) unsigned NOT NULL,
  `endurance` tinyint(3) unsigned NOT NULL,
  `reactivite` tinyint(3) unsigned NOT NULL,
  `attaque` tinyint(3) unsigned NOT NULL,
  `defense` tinyint(3) unsigned NOT NULL,
  `agilite` tinyint(3) unsigned NOT NULL,
  `portage` tinyint(3) unsigned NOT NULL,
  `intelligence` tinyint(3) unsigned NOT NULL,
  `vie` tinyint(3) unsigned NOT NULL,
  `oqp` tinyint(1) NOT NULL,
  `aptitude` varchar(1) NOT NULL,
  `nourriture` varchar(1) NOT NULL,
  UNIQUE KEY `id_pet` (`id_pet`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;


CREATE TABLE IF NOT EXISTS `course` (
  `id_course` int(11) NOT NULL auto_increment,
  `id_pseudo` int(11) NOT NULL,
  `depart` int(11) NOT NULL,
  `duree` tinyint(4) NOT NULL,
  `status` tinyint(4) 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,
  `puissance_min` smallint(5) unsigned NOT NULL,
  `time_maj_distance` varchar(30) NOT NULL,
  UNIQUE KEY `id` (`id_course`),
  KEY `id_pseudo` (`id_pseudo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


 

Question "bête" : j'ai honte de poser cette question, mais bon, y a t-il une différence entre tinyint(3) et tinyint(4) ?

Dernière modification par ebouilleur (17-11-2011 15:16:46)

Hors ligne

#25 17-11-2011 16:06:48

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

Merci.
Dans MySQL ou tout autre SGBDR on stocke des dates ou des heures dans DATETIME pour le moins et ce qui est certain pas dans un VARCHAR ni dans un INT non plus. Ce dont j'ai besoin, donc, c'est que la date et heure de départ de la course soient stockées dans un DATETIME ou dans un TIMESTAMP, car cela permet de gérer le temps de course au niveau de la requête sinon c'est impossible ou presque. Pourquoi NULL par défaut pour le champ depart? car si il est renseigné par une valeur non nulle alors que la course n'a pas commencée, alors le champs ne sert plus à rien. Le TINYINT (4) signifie qu'il est défini sur un Octet de plus pour pouvoir gérer les valeurs négatives.. Donc ton duree avec un TINYINT (4), à moins que tu souhaites gérer des durées négatives n'a pas de raison d'être et un TINYINT UNSIGNED serait plus adapté. Attention cependant, si tu utilises un TINYINT pour ta durée, cela t'obligera à définir tes durées en minutes, car en secondes 20*60 > 255. Donc pour une durée exprimée en secondes il te faut un SMALLINT UNSIGNED.

Voila.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums