Vous n'êtes pas identifié(e).
Donc en gros tu ne stock jamais de valeur time() en bdd?
Car mon cron, pour savoir si une course est a lancé, je fais ca :
Pour le moment je gere "duree" en minutes, mais si tu as besoin de l'avoir en second, je peux modifier
Voila mes tables (j'ai mis la table course_participant, mais je pense vu ce que tu m'a dis que je vais devoir le modifier bcp):
CREATE TABLE IF NOT EXISTS `course` (
`id_course` int(11) NOT NULL auto_increment,
`id_pseudo` int(11) NOT NULL,
`time_depart` int(11) NOT NULL,
`datetime_depart` datetime NOT NULL,
`duree` tinyint(3) unsigned NOT NULL,
`status` 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(1) 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 ;
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,
`strengh` tinyint(3) unsigned NOT NULL,
`agilite` tinyint(3) unsigned NOT NULL,
`intel` tinyint(3) unsigned NOT NULL,
`endurance` tinyint(3) unsigned NOT NULL,
`puissance` tinyint(3) unsigned NOT NULL,
`distance` int(10) unsigned NOT NULL,
KEY `id_pet` (`id_pet`),
KEY `id_pseudo` (`id_pseudo`),
KEY `distance` (`distance`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Dernière modification par ebouilleur (17-11-2011 16:26:02)
Hors ligne
Aïe^^
Bon je vais essayer de t'expliquer, car en plus ta tâche CRON est fausse.
1) Pour la durée c'est toi qui décide si tu désires l'exprimer en minutes ou en secondes. Ce que je disais c'est de faire attention à ta définition selon ton choix pour que tu comprennes.
2) Pour ton départ tu n'as besoin que d'un seul champ: depart DATETIME NULL DEFAULT NULL
3) Tu peux stocker une valeur de type TIME dans MySQL mais dans un champ TIME et toujours pas dans un VARCHAR ou un INT. Pourquoi? et Pourquoi il faut que tu le fasses dans un DATETIME dans ton cas?
a) Si tu le fait dans un champ TIME, tu auras un problème dans ta tâche CRON car tu lanceras toutes les courses pour une heure donnée sans te soucier du jour et c'est source d'erreur. Comment fais-tu ensuite pour différencier la course de 14h du lundi de celle du mardi à la même heure (même circuit, etc...)?
b) Dans ta tâche CRON que tu m'as montré, tu as deux erreurs. La première est que $heure_depart est bien une heure (au format PHP) et donc définie au format séxagésimal, et que dans ta table si départ est défini en INT (format décimal) ta comparaison sera au petit bonheur la chance sans parler du fait que le format de date et d'heure dans mysql est ou peut être différent de celui défini dans PHP...
c) La deuxième erreur de ta tache CRON, est sa grande instabilité et sa grande imprécision. Il serait plus judicieux de créer un status=1 par exemple pour dire quelles sont les courses prêtes à partir (nombre de participants requis, etc...) et de faire un UPDATE course SET depart=NOW() where status=1 par exemple où l'heure de départ tiendrait compte du jour et de l'heure et correspond à l'heure à la seconde prêt du départ réel de la course, et non une heure approximative comme actuellement car depart correspond à l'heure prévue du départ de la course et non l'heure à laquelle elle a été lancée.
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Note: Tu pourrais également alléger ton serveur et créer des horaires de course (par exemple toutes les 15min) ce qui libérerait la charge de ton CRON pour d'autres tâches, comme la vérification des courses prêtes à partir, etc...
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
b) Dans ta tâche CRON que tu m'as montré, tu as deux erreurs. La première est que $heure_depart est bien une heure (au format PHP) et donc définie au format séxagésimal, et que dans ta table si départ est défini en INT (format décimal) ta comparaison sera au petit bonheur la chance sans parler du fait que le format de date et d'heure dans mysql est ou peut être différent de celui défini dans PHP...
$heure_depart contient la valeur de time() au moment ou sera lancé mon cron. et dans ma bdd, le champ "depart" contient la valeur time() dans quand sera lancé la course donc en gros ca donne un truc genre (avec depart = 1321545090 par exemple) :
Donc je ne vois pas ou c'est instable
c) La deuxième erreur de ta tache CRON, est sa grande instabilité et sa grande imprécision. Il serait plus judicieux de créer un status=1 par exemple pour dire quelles sont les courses prêtes à partir (nombre de participants requis, etc...) et de faire un UPDATE course SET depart=NOW() where status=1 par exemple où l'heure de départ tiendrait compte du jour et de l'heure et correspond à l'heure à la seconde prêt du départ réel de la course, et non une heure approximative comme actuellement car depart correspond à l'heure prévue du départ de la course et non l'heure à laquelle elle a été lancée.
Admettons que le status 1 soit le "pret a partir", tu fais comment pour passer du status 0 à 1 ?
Car quand le joueur crée une course, il sélection le circuit, et l'heure/jour de départ (choix d'une liste déroulante, pour faire simple les départs sont possible a xh10 ou xh30 ou xh50).
Donc ce n'est pas moi, ni le joueur qui donnons le "top départ"...
Par rapport a ta note, je crois y comprendre que le cron qui lancerai le départ ne ferai pas de vérification alors?
Dernière modification par ebouilleur (17-11-2011 17:58:52)
Hors ligne
Le but n'est pas de stocker une valeur time (définie en php) dans un champ varchar, mais l'intérêt est de le faire gérer par mysql et pour cela il faut définir un champ approprié pour que mysql puisse le faire correctement.
EDIT:
depart<='1321546004'
Ici MYSQL ne compare pas des heures mais deux chaînes de caractères contenant que des chiffres.. Je te laisse regarder dans la doc comment cela peut être interprété par MySQL....
Si dans ton appli tu as 3 départ possibles par heure (3 tâches cron / heure) alors c'est certain que l'on peut faire différemment aussi. Donc j'expose les deux méthodes (la tienne et la mienne)
- Ton cas de figure
le champ départ correspond à la date et l'heure (défini en datetime) du choix de l'utilisateur pour le départ de sa course. La tâche cron lance automatiquement les courses définies avec un départ qui corresponds à l'heure pour laquelle la tâche s'est éxécutée (pas besoin de faire comme tu fais en passant par php).
Problème: s'il n'y a qu'un inscrit, la course par quand même....
-Le mien
Vu la précision que tu m'as apporté quand aux horaires de départ existants, tu peux garder le champ départ avec l'heure prévue (en datetime) mais tu auras un petit décalage en l'heure prévue et l'heure réelle du départ (inférieur à 1 ou plusieurs secondes). Pour lever cette imprécision, dans le cas où par exemple il est possible qu'un pet puisse gagner une course à une seconde prêt, il te faudra un champ supplémentaire pour l'heure de départ effectif toujours en datetime.
Pour l'histoire du status=1, suffit de faire un cron 10 min avant chaque départ prévu de course, pour vérifier que les demandes de courses pour le prochain départ soient ok. Si ok alors update avec statut=1, sinon notification au joueur, que sa course pour le prochain départ ne pourra pas avoir lieu faute de participants par ex.
Dernière modification par Jc (17-11-2011 18:20:20)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
le champ départ correspond à la date et l'heure (défini en datetime) du choix de l'utilisateur pour le départ de sa course. La tâche cron lance automatiquement les courses définies avec un départ qui corresponds à l'heure pour laquelle la tâche s'est éxécutée (pas besoin de faire comme tu fais en passant par php).
Problème: s'il n'y a qu'un inscrit, la course par quand même....
Dans mon cron il y avait différente verif avant de passer au calcul. La course n'a pas lieu si il y a moins de 4 participants
Mais ok, on va partir sur ta proposition :
Du coup il y a 4 status :
0 : course ouverte au inscription
1 : cloture des inscriptions 10 min avant le départ -> cron qui vérifie le nb de joueur
2 : course en cours
3 : course terminée
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 NOT NULL,
`duree` tinyint(3) unsigned NOT NULL,
`status` 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(1) NOT NULL,
`ressource_quantite` int(11) NOT NULL,
`puissance_min` smallint(5) unsigned NOT NULL,
UNIQUE KEY `id` (`id_course`),
KEY `id_pseudo` (`id_pseudo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
Ca donne ca, avec depart_theorique qui est le champ rempli a la création de la course et depart qui est celui qui est pour toi (NULL avant le lancement de la course)
Ca te convient?
Dernière modification par ebouilleur (17-11-2011 18:29:27)
Hors ligne
Oui sauf que tu as défini depart en NOT NULL donc il ne peut prendre la valeur NULL^^. La définition exacte je te l'ai donnée precedemment : depart DATETIME NULL DEFAULT NULL
et que pour le 1 tu as donné une définition et non pas un statut. Cela serait 1: Prêt au départ^^
Allez, j'essaye de te faire ca au plus tôt.
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Compte tenu de tes mises à jour, voici celles que tu dois faire pour ta procédure
Comme tu le verras, les paramètres de cette procédure correspondront dans ma requête aux champs respectifs dans la table pets et non course_participants. Donc pense à mettre à jour les définitions dans ta table.
Dernière modification par Jc (17-11-2011 18:44:57)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Oui sauf que tu as défini depart en NOT NULL donc il ne peut prendre la valeur NULL^^. La définition exacte je te l'ai donnée precedemment : depart DATETIME NULL DEFAULT NULL
^^ je voulais voir si tu suivais
merci
Pour la procédure, je pense que j'y verrais mieux avec ta requête, mais juste pour rappel, "temps" est le temps écoulé depuis le début de la course et power_min l'addition de force+agilité+intel
Dernière modification par ebouilleur (17-11-2011 18:50:59)
Hors ligne
Compte tenu de tes mises à jour, voici celles que tu dois faire pour ta procédure
Comme tu le verras, les paramètres de cette procédure correspondront dans ma requête aux champs respectifs dans la table pets et non course_participants. Donc pense à mettre à jour les définitions dans ta table.
OK alors, peux tu prendre en compte que pour ne pas a avoir a modifier toutes mes autres page du site, met :
Merci
Dernière modification par ebouilleur (17-11-2011 18:49:44)
Hors ligne
Bonsoir,
Donc voila, il est tard donc je passe sur les explications pour le moment mais on en parle quand tu veux
A) Les modifs à faire pour que cela fonctionne bien
1) Table course_participant
- Supprimer tous les indexs.
- Créer Primary Key (id_course, id_pet)
- Si tu passes sur innodb rajouter : key id_pet
2) Table Course
- Supprimer key id_pseudo
- Créer primary key id_course
- Créer key status
3) Table pet
- Supprimer unique key id_pet
- Créer primary key id_pet
- key id_pseudo
B) Requête de gestion de course
Alors tu vois, la requête est super simple. Si dans la table course il y avait la distance de la course, on peut rajouter un champ dans la requête pour dire si un pet à gagné (déjà parcourue la distance) au moment de la consultation et avant le temps imparti (20min) pour la parcourir.
De plus la coloration syntaxique a souligné t1.status à juste titre, remplace le par statut cela évitera bien des problèmes.
++
Dernière modification par Jc (20-11-2011 02:38:00)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour,
J'avais pas fait attention que
...power_min est l'addition de force+agilité+intel
Ce qui s'implifie pas mal les choses puisque
est donc equivalent
d'où la nouvelle requête
Mais il faut rajouter puissance_min dans la table pet (dans la table course cela n'est pas sa place) pour l'avoir pour chaque pet. C'est pour cela que puissance_min ici est appelé à partir de t2.
Voilà. Si il y a un souci avec la requête dis-le, j'ai pas test.
Dernière modification par Jc (21-11-2011 14:41:47)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Salut,
Merci pour ton retour,
1) Table course_participant
- Supprimer tous les indexs.
- Créer Primary Key (id_course, id_pet)
- Si tu passes sur innodb rajouter : key id_pet
Je ne peux pas mettre Primary key sur id_course, car j'ai plusieurs enregistrement avec le meme id_course.
Et sinon, dans cette table, je garde juste les champs : id_course , id_pet, id_pseudo ?
Dans ta requete, je crois comprendre que je dois rajouter le champ "depart" ?
Sinon j'ai une erreur pour créer ta procédure :
requête SQL:
CREATE DEFINER `root`@`localhost` FUNCTION `calc_dist` (
endurance tinyint,
temps tinyint,
power_min tinyint,
duree tinyint
) RETURNS DECIMAL( 6, 2 ) RETURN (
(
(
power_min - ( power_min / endurance ) * temps
) / ( duree *120 )
) * temps
)
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 '`root`@`localhost`
FUNCTION `calc_dist`(endurance tinyint, temps tinyint, power' at line 1
Et la formule de calcule de distance, c'est une formule simple pour le moment, sans variable aléatoire.. si je dois en rajouter une, pour rendre la course plus réaliste, on peut?
Merci
Dernière modification par ebouilleur (21-11-2011 00:18:16)
Hors ligne
Bonjour,
Concernant la primary key tu peux car je t'ai demandé d'en mettre une sur id_course ET sur id_pet. Cela s'appele crée une clé primaire composite. Ta table deviendra une table de jonction.
Retire le create definer au pire commence directement à partir de function. Et ce n'est pas une requête SQL mais une fonction DDL^^. power est un mot clé de part ailleurs donc gaffe qu'il soit bien suivi de _min tout attaché. Il faut de plus utilsé la fonction avec les définitions en SMALLINT ^^.
Pour répondre à ta question. Oui tu pourras.
Dernière modification par Jc (21-11-2011 11:06:22)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
OK, pour les 2 clés primaires c'est ok.
Pour la procédure, j'ai pu la faire en faisant juste :
et en indiquant $$ dans la case délimiteur
Tu ne m'a pas répondu pour ma question sur la table course_participant :
Et sinon, dans cette table, je garde juste les champs : id_course , id_pet, id_pseudo ?
Dans ta requete, je crois comprendre que je dois rajouter le champ "depart" ?
Dernière modification par ebouilleur (21-11-2011 14:18:08)
Hors ligne
Désolé pour la requête me suis trompé...
Comme quoi faire des requêtes à 2h du mat, il n'y a pas que du bon..
Dernière modification par Jc (21-11-2011 14:44:44)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bon, il manquait des parenthèses, et un r a course et statut avec un T (ou non un s vu que tu m'a conseiller de changer).
Mais j'ai quand meme une erreur mysql que je trouve pas
MySQL a répondu:Documentation
#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 'AS ellapsed,
calc_dist(t2.endurance,ellapsed,t2.puissance_min,t3.duree) AS d' at line 1
Hors ligne
Mais je doute que tu aies le droit d'utiliser l'alias ellapsed dans les calculs inter-colonnes du SELECT.
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
ok, c'est mieux, mais tu dois avoir raison, là j'ai comme erreur : #1054 - Unknown column 'ellapsed' in 'field list'
Humm même en modifiant ellapsed par autre chose ca ne fonctionne pas (même erreur)...
Remarque autre : J'étais en train de coder mon cron pour passer une course au statut 1 -> 2
et je viens de penser que je t'ai pas expliquer un truc (qui ne change pas grand chose).
dans la table course, il y a puissance_min. C'est le plus faible puissance_min de tous les participant et c'est celui la qu'il faut utiliser dans la procédure stockée
Edit 2 : Arf, je m'embrouille moi meme avec tout ca ^^
J'explique : le puissance_min est le meme pour tout le monde (le plus pet de tous les pet) par contre on a bien besoin de strenght, agilite et intel (=power ci-dessous et contenu dans la table pet) de chaque pet ^^
Donc pour la procédure ca doit donner :
Dernière modification par ebouilleur (21-11-2011 18:27:54)
Hors ligne
Pour ellapsed, s'il ne le trouve pas, c'est pas grave et c'est normal, à chaque fois j'oublie ce souci. Donc remplace partout où tu l'utilises son nom par sa définition (la soustraction).
Ne définie pas "power" comme nom de champ dans ta procédure c'est un nom réservé. Utilise power_norm ou tout ce que tu veux d'autre mais pas power (regarde la coloration syntaxique).
Donc le power = la puissance de chaque pet
et power_min = la puissance la plus faible de tous les participants c'est cela?
Si c'est ça faut modifier la requête...
je vais en profiter aussi pour la modifier pour que tu n'aies pas "Donc remplace partout où tu l'utilises son nom par sa définition (la soustraction)." à faire..
Je reviens vers toi. Mais modifie ce dont je viens de parler stp.
Dernière modification par Jc (21-11-2011 18:51:09)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Donc le power = la puissance de chaque pet
et power_min = la puissance la plus faible de tous les participants c'est cela?.
Oui c'est ca. ésolé de pas y avoir pensé avant
Hors ligne
Procédure modifiée comme suit :
Pour ellapsed, s'il ne le trouve pas, c'est pas grave et c'est normal, à chaque fois j'oublie ce souci. Donc remplace partout où tu l'utilises son nom par sa définition (la soustraction).
Et pour ca.. je ne vois pas quoi faire
Dernière modification par ebouilleur (21-11-2011 19:28:32)
Hors ligne
Voici la nouvelle requête (pas test car pas le temps de me monter une simulation)
Si tu as un souci avec la clause ORDER BY remplace dist_parcourue par la formule calc_dist
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
OK après qq ajustement c'est ok avec :
Après un test rapide, (avec un départ à 19h30) le résultat de la requete me donne :
id_course id_pet ellapsed dist_parcourue tps_restant
2 23 14.7000 0.01 5.3000
2 1 14.7000 -0.04 5.3000
2 32 14.7000 -0.44 5.3000id_course id_pet ellapsed dist_parcourue tps_restant
2 23 16.2167 0.00 3.7833
2 1 16.2167 -0.06 3.7833
2 32 16.2167 -0.50 3.7833
Donc y a un truc qui cloche
Dernière modification par ebouilleur (21-11-2011 19:46:41)
Hors ligne
- Les temps sont en minutes duree et ellapsed.
- Les types de champs dans ta table utilisés dans la fonction doivent correspondre à ceux de la fonction (or duree en tinyint d'un coté et smallint de l'autre).
- Je n'ai pas vérifé la pertinence du calcul de ta fonction de distance..
- Pour vérifier les données entrées dans la fonction tu peux rajouter le champs t4.puissance_min dans la requête principale.
- Je ne sais pas ce que tu appeles "qq ajustements" ...
Ce qui me semble clocher c'est ton calcul de distance. Vérifie tout de même la valeur de t4.puissance_min.
Dernière modification par Jc (21-11-2011 20:03:59)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne