PHP|Débutant :: Forums

Advertisement

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

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

#176 03-04-2012 21:53: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,

Je viens un peu aux nouvelles pour savoir si tu as réussi à la construire.

++


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

Hors ligne

#177 03-04-2012 22:53:24

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

Bonsoir,

Je n'ai pas eu vraiment le temps de la faire, mais j'ai du en faire une pour un autre site, donc j'ai utiliser ce que tu m'avais dis.
IL faut vraiment que j'arrive à trouver du temps pour crazy pet hmm

Mais je ne colle l'autre que j'ai pu faire grace a ton aide :


CREATE DEFINER=`root`@`localhost`
FUNCTION `calc_combat`(agressivite int)
RETURNS INT
RETURN ROUND(RAND()*agressivite,RAND()*agressivite*10)


CREATE DEFINER=`root`@`localhost`
FUNCTION `calc_combat2`(id_employe_expediteur int,  agressivite_expediteur int, id_employe_destinataire int,  agressivite_destinataire int)
RETURNS INT
BEGIN

DECLARE rand1 INT;
DECLARE rand2 INT;
DECLARE id_gagnant INT;
DECLARE id_perdant INT;

SET rand1 = ROUND(RAND()*agressivite_expediteur,RAND()*agressivite_expediteur*10);
SET rand2 = ROUND(RAND()*agressivite_destinataire,RAND()*agressivite_destinataire*10);

   IF rand1 >= rand2 THEN
      SET id_gagnant = id_employe_expediteur;  
      SET id_perdant = id_employe_destinataire;
   END IF;  
   IF rand1 < rand2 THEN
      SET id_gagnant = id_employe_destinataire;  
      SET id_perdant = id_employe_expediteur;  
   END IF;

INSERT INTO defis_perdu VALUES (id_perdant,'honte',DATE_ADD(NOW(),INTERVAL 1 DAY))

RETURN id_gagnant;
END##
 

Je te tiens au courant
merci

Hors ligne

#178 04-04-2012 22:16:10

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,

La progression fait plaisir à voir. N'oublie pas que que tu peux utiliser tes fonctions non seulement dans des instruction SELECT mais aussi dans les SET de tes procédures
par exemple : SET p=calc_combat(20);

A bientôt donc.

++


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

Hors ligne

#179 04-04-2012 23:08: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

Merci
smile

La je l'utilise dans une requete :


        INSERT INTO m_defis2 (id_defis, id_employe_expediteur, agressivite_expediteur, id_employe_destinataire, agressivite_destinataire, id_gagnant)
        SELECT t0.id, p1.id_employe, t1.agressivite AS agressivite_expediteur, p2.id_employe, t2.agressivite AS agressivite_destinataire,
          calc_combat2(p1.id_employe, t1.agressivite, p2.id_employe, t2.agressivite) as id_gagnant
        FROM defis AS t0
        INNER JOIN defis_participant AS p1 ON (p1.id_defis=t0.id AND p1.lanceur=1  )
        INNER JOIN defis_participant AS p2 ON (p2.id_defis=t0.id AND p2.lanceur=0  )        
        LEFT JOIN perso_masseur AS t1 ON (t1.id=p1.id_employe)
        LEFT JOIN perso_masseur AS t2 ON (t2.id=p2.id_employe)    
        WHERE t0.statut=2
 

bonne soirée

Hors ligne

#180 29-04-2012 15:41:05

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,
avec du retard, j'essaye donc de faire ma fonction de calcule de distance, avec les améliorations souhaitées, mais phpmyadmin me sert qu'il y a un erreur donc ca n'en veut pas. j'ai essayer de la tourner dans tous les sens et je vois pas le chmilblik... une idée?


CREATE DEFINER=`root`@`localhost`
FUNCTION `calc_dist`(strong smallint, agilite smallint, intel smallint, endurance smallint, temps smallint, puissance_min smallint, puissance smallint, duree smallint, type_circuit char(1))
RETURNS decimal(6,2)    


DECLARE rand INT;
SET rand = ROUND(-999,999);
   IF type_circuit == 'S' THEN SET add_competence = strong; END IF;
   IF type_circuit == 'A' THEN SET add_competence = agilite; END IF;
   IF type_circuit == 'I' THEN SET add_competence = intel; END IF;
   IF type_circuit == 'E' THEN SET add_competence = endurance; END IF;

RETURN ((puissance-((puissance_min+add_competence)/endurance)*temps/(duree*120))*temps+ rand)
RETURN id_gagnant;
END##
 

Merci

Hors ligne

#181 29-04-2012 19:17:09

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

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

1) quelle erreur ????
2) END## ??????????????? deliliter §?????
3) 2 return ?????????????????

a++

Hors ligne

#182 29-04-2012 19:21:24

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

1)
MySQL a répondu:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE rand INT;
SET rand = ROUND(-999,999);
    IF type_circuit == 'S' THEN S' at line 6

2) le delimiter est bien a ##
3) oui, 2 return... surement un mauvais copier/coller via le forum

Hors ligne

#183 29-04-2012 19:38:01

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,

Tu as tout simplement oublié un BEGIN entre ton RETURNS et ton DECLARE wink
ensuite tu vas avoir une autre erreur avec tes RETURN qui se suivent et avec en plus le premier qui n'a pas de ; à la fin. J'ai pas bien compris ce que tu souhaites faire avec, car il n'y a aucun intérêt à les mettre ainsi.

Dernière modification par Jc (29-04-2012 19:40:27)


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

Hors ligne

#184 29-04-2012 19:43:46

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

Malgré le code modifié, ca me donne tjs la même erreur :


CREATE DEFINER=`root`@`localhost`
FUNCTION `calc_dist`(strong smallint, agilite smallint, intel smallint, endurance smallint, temps smallint, puissance_min smallint, puissance smallint, duree smallint, type_circuit char(1))
RETURNS decimal(6,2)    
BEGIN

DECLARE rand INT;
SET rand = ROUND(-999,999);
   IF type_circuit == 'S' THEN SET add_competence = strong; END IF;
   IF type_circuit == 'A' THEN SET add_competence = agilite; END IF;
   IF type_circuit == 'I' THEN SET add_competence = intel; END IF;
   IF type_circuit == 'E' THEN SET add_competence = endurance; END IF;

RETURN ((puissance-((puissance_min+add_competence)/endurance)*temps/(duree*120))*temps+ rand);
END##
 

Hors ligne

#185 29-04-2012 19:47:38

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

Oui excuse moi, j'ai oublié de te dire qu'il te faut aussi remplacer tes == par = (on est pas en PHP) wink


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

Hors ligne

#186 29-04-2012 19:49:30

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

evite aussi d'appeler ta variable rand ainsi. Appele-la c_rand par exemple, ca ne mange pas de pain, et cela evite les conflits potentiels.


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

Hors ligne

#187 29-04-2012 19:50:28

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'avais hésité a essayer sans, puis je me suis dis que non..
enfin toujours est il que non ca ne solution pas le probleme. tjs même msg d'erreur

Hors ligne

#188 29-04-2012 19:51:38

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

Ton SET rand=ROUND(-999,999) c'est pour faire quoi????


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

Hors ligne

#189 29-04-2012 19:55: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

Si c'est ce que je pense tu l'as déjà dans ta formule ecrit correctement * temps + RAND(-999999));


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

Hors ligne

#190 29-04-2012 19:55:22

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

pour avoir un nombre aléatoire.
l'idée est de faire la meme chose que ca en php :


function calcul_distance_course3($strong,$agilite,$intel,$endurance,$temps,$puissance_min,$duree,$type_circuit)
// on calcule la distance parcouru par le pet
{
  $rand = mt_rand(-999,999);
  $rand = $rand/100;
  if ($type_circuit == S) $add_competence = $strong;
  if ($type_circuit == A) $add_competence = $agilite;
  if ($type_circuit == I) $add_competence = $intel;
  if ($type_circuit == E) $add_competence = $endurance;
  $puissance = $strong + $agilite + $intel;
  $distance_parcouru = ( $puissance - (($puissance_min+$add_competence)/$endurance) * ($temps)/($duree * 20 * 60) ) * $temps + $rand ;
  return $distance_parcouru;
}
 

Hors ligne

#191 29-04-2012 20:00: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,

En fait la syntaxe initiale est bonne mais pas le contenu

manuel MySQL a écrit :

To obtain a random integer R in the range i <= R < j, use the expression FLOOR(i + RAND() * (j – i)).

Pour un nombre compris entre 1 et 999 999 il te faut donc ecrire


SET c_rand=FLOOR(1+RAND()*999998);
 

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

Hors ligne

#192 29-04-2012 20:40: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

J'ai donc mis :
[code)mysql]SET c_rand=FLOOR(-999+RAND()*1998);[/code]
mais j'ai toujours :
MySQL a répondu:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN
DECLARE rand INT;
SET c_rand=FLOOR(-999+RAND()*1998);
    IF type_ci' at line 4

sad

Hors ligne

#193 29-04-2012 21:46:18

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

Ty peux nous réécrire au propre ta fonction que je puisse voir ce qui ne vas pas encore?

PS: si tu ecris SET c_rand=...   il te faut écrire DECLARE c_rand=..  et non rand=  (rand est un nom réservé n'oublie pas).

Dernière modification par Jc (29-04-2012 22:03:29)


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

Hors ligne

#194 29-04-2012 23:20:13

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

Voila le message d'erreur de pma :


requête SQL:

CREATE DEFINER = `root`@`localhost` FUNCTION `calc_dist` (
strong smallint,
agilite smallint,
intel smallint,
endurance smallint,
temps smallint,
puissance_min smallint,
puissance smallint,
duree smallint,
type_circuit varchar( 1 )
) BEGIN DECLARE c_rand INT;
SET c_rand = FLOOR( -999 + RAND( ) *1998 ) /100;
IF type_circuit = S THEN SET add_competence = strong;
END IF ;
IF type_circuit = A THEN SET add_competence = agilite;
END IF ;
IF type_circuit = I THEN SET add_competence = intel;
END IF ;
IF type_circuit = E THEN SET add_competence = endurance;
END IF ;

RETURN (
(
puissance - ( (
puissance_min + add_competence
) / endurance ) * temps / ( duree *120 )
) * temps + c_rand
);
END

 

MySQL a répondu:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN
DECLARE rand INT;
SET c_rand=FLOOR(-999+RAND()*1998)/100;
    IF type_ci' at line 4

Dernière modification par ebouilleur (29-04-2012 23:20:31)

Hors ligne

#195 30-04-2012 03:07:42

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,

Si a chaque fois que tu corriges une erreur tu en créé une là où il n'y en avait pas avant, on ne va pas s'en sortir^^
Je te corrige ça wink


DELIMITER $$

CREATE DEFINER = `root`@`localhost` FUNCTION `calc_dist` (strong SMALLINT UNSIGNED, agilite SMALLINT UNSIGNED, intel SMALLINT UNSIGNED, endurance SMALLINT UNSIGNED, temps SMALLINT UNSIGNED, puissance_min SMALLINT UNSIGNED, puissance SMALLINT UNSIGNED, duree SMALLINT UNSIGNED, type_circuit CHAR(1))
RETURNS INT
BEGIN
  DECLARE c_rand INT;
  DECLARE add_competence SMALLINT UNSIGNED;
  SET c_rand = FLOOR( -999 + RAND( ) *1998 );  -- J'ai retiré la division par 100 pour que c_rand reste un entier! Si tu veux diviser par 100 il faut modifier le type en conséquence ou arrondir.
  IF type_circuit = 'S' THEN SET add_competence = strong; END IF ;
  IF type_circuit = 'A' THEN SET add_competence = agilite; END IF ;
  IF type_circuit = 'I' THEN SET add_competence = intel; END IF ;
  IF type_circuit = 'E' THEN SET add_competence = endurance; END IF ;
RETURN FLOOR((puissance - ( (puissance_min + add_competence) / endurance ) * temps / ( duree *120 ) ) * temps + c_rand); -- J'ai rajouté le FLOOR pour être certain d'obtenir un entier conformément au type attentu déclaré plus haut.
END;$$
 

Normalement tout devrait aller maintenant.

Dernière modification par Jc (30-04-2012 03:09:11)


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

Hors ligne

#196 30-04-2012 13:09:55

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

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

quel intérêt de faire cette fonction en SQL ??????????????????????
a++

Hors ligne

#197 30-04-2012 13:15:03

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

Salut Pierrot,

Je vais laisser MK te répondre smile


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

Hors ligne

#198 30-04-2012 16:13:23

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

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

je réponds à sa place wink

AUCUN big_smile:D
a++

Hors ligne

#199 30-04-2012 16:49:36

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

Bon ben puisque tu y tiens je vais te le dire ^^

- Cela va d'abord permettre d'automatiser les processes de course coté SGBDR.

Cela signigie quoi?
- Cela évite les aller-retour inutiles entre les serveurs (MySQL-PHP) et les temps de communication sont les plus pénalisants dans les processes car à l'échelle du SGBDR ils sont longs, et soumis à beaucoup de paramètres qui vont rallonger d'autant les temps d'attente. Et je ne parle pas d'un blocage réseau, d'un plantage/bug PHP, qui peuvent geler les verrous et bloquer l'application.
- Qui dit temps d'attente important, implique des verrous posés plus longtemps sur les tables et donc, la capacité de montée en charge du serveur dans un contexte concurrentiel est fortement amoindrie. Il faut dire qu'avec MySQL ce facteur est aggravant car c'est un débutant en la matière: il commence à montrer ses limites à partir de 5 accès concurrentiels dans sa capacité à supporter la charge. Plus tôt on libère les ressources, plus on retarde le moment fatidique avec MySQL à partir duquel il faut migrer vers un SGBDR plus évolué et plus on limite les temps d'attente des autres utilisateurs dans leur accès à l'information.

Tu veux que je t'en rajoute une couche? big_smile

Dernière modification par Jc (30-04-2012 16:56:21)


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

Hors ligne

#200 30-04-2012 17:02: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

L'interet est de faire le calcule d'une distance parcouru et de l'utiliser dans une requete sql wink

ici :

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

Et merci JC, en effet ca fonctionne mieux wink

Dernière modification par ebouilleur (30-04-2012 17:02:39)

Hors ligne

Pied de page des forums