PHP et ADD_TIME
                    
        
     
             
                    samghami
    
        
    
                    Messages postés
            
                
     
             
            85
        
            
                                    Statut
            Membre
                    
                -
                                     
maka54 Messages postés 721 Statut Membre -
        maka54 Messages postés 721 Statut Membre -
        Bonjour, Je fais actuellement la création d'un jeux. Pour cela j'ai besoin de créer une tache cron. Qui, toutes les heures vas mettre a jour l'état d'une plante.
Il faut 3 jours pour quel passe en état de floraison
puis il faut trois jour pour quel passe en état de récolte.
Pour cela je doit contrôler le temps. Mais c'est ici que je coince ..
Je vais détailler pas à pas ce que j'ai fais jusqu'à présent:
Pour l'instant, ce code me permet juste de me connecter a ma BDD MySQL, ainsi que de selectionner ma table rpg_jardin_int.
Puis maintenant il faut que je créer des conditions:
Ce que je souhaite faire ici, c'est si la date de la plantation est égal ou superieur a 3 jour mais inférieur a 6 jour l'état est floraison.
Ensuite il faudra que je face, si la date de plantation est superieur ou égal a 6jour l'état est récolte.
Malheureusement mon script ne fonctionne pas... Pourriez vous me donner un coup de main pour réaliser mon projet? Merci d'avance
                
            
                
    
    
    
        Il faut 3 jours pour quel passe en état de floraison
puis il faut trois jour pour quel passe en état de récolte.
Pour cela je doit contrôler le temps. Mais c'est ici que je coince ..
Je vais détailler pas à pas ce que j'ai fais jusqu'à présent:
<?php
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=xxxxx', 'xxxxxxx', 'xxxxxx');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
// Si tout va bien, on peut continuer
// On récupère tout le contenu de la table de jardination interieur
$reponse = $bdd->query('SELECT * FROM  rpg_jardin_int');
Pour l'instant, ce code me permet juste de me connecter a ma BDD MySQL, ainsi que de selectionner ma table rpg_jardin_int.
Puis maintenant il faut que je créer des conditions:
if ($reponse['date_plantation'] >= DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY) ){
	$reponse->exec('UPDATE * SET etat = floraison ');
	}
Ce que je souhaite faire ici, c'est si la date de la plantation est égal ou superieur a 3 jour mais inférieur a 6 jour l'état est floraison.
Ensuite il faudra que je face, si la date de plantation est superieur ou égal a 6jour l'état est récolte.
Malheureusement mon script ne fonctionne pas... Pourriez vous me donner un coup de main pour réaliser mon projet? Merci d'avance
        A voir également:         
- PHP et ADD_TIME
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Retour a la ligne php - Forum Webmastering
- Alert php - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
7 réponses
                        
                    oups j'ai pas copier / coller la bonne ligne !
reste à voir le format du champ date_plantation et sa compatibilité avec NOW()
voir http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html
    
                if (NOW() >= DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY) && NOW() <= DATE_ADD($reponse['date_plantation'], INTERVAL 6 DAY))
reste à voir le format du champ date_plantation et sa compatibilité avec NOW()
voir http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html
                        
                    essayes:
    
                if ($reponse['date_plantation'] >= DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY) && $reponse['date_plantation'] <= DATE_ADD($reponse['date_plantation'], INTERVAL 6 DAY))
                        
                    Ce que je ne comprend pas c'est : 
car $reponse['date_plantation'] ne pourra jamais etre >= à DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY) !
C'est comme si :
admettons que $reponse['date_plantation'] soit égal à 1.
1 >= 1 + 3 ($reponse['date_plantation'] >= DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY)) est impossible !
  
Maintenant, je suis.
    
                if ($reponse['date_plantation'] >= DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY)
car $reponse['date_plantation'] ne pourra jamais etre >= à DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY) !
C'est comme si :
admettons que $reponse['date_plantation'] soit égal à 1.
1 >= 1 + 3 ($reponse['date_plantation'] >= DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY)) est impossible !
Maintenant, je suis.
                        
                    DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY) 
c'est du langage SQL çà pas php, il faut que ce soit dans ta requete
$reponse->exec('UPDATE * SET etat = floraison ');
pas de table dans ta requete, et pas de condition
UPDATE rpg_jardin_int SET etat = 'floraison'
WHERE date_plantation BETWWEN DATE_ADD(NOW(),INTERVAL -3 DAY) AND DATE_ADD(NOW(),INTERVAL -6 DAY)
    
                c'est du langage SQL çà pas php, il faut que ce soit dans ta requete
$reponse->exec('UPDATE * SET etat = floraison ');
pas de table dans ta requete, et pas de condition
UPDATE rpg_jardin_int SET etat = 'floraison'
WHERE date_plantation BETWWEN DATE_ADD(NOW(),INTERVAL -3 DAY) AND DATE_ADD(NOW(),INTERVAL -6 DAY)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
                        
                    et pour la récolte : 
UPDATE rpg_jardin_int SET etat = 'recolte'
WHERE date_plantation < DATE_ADD(NOW(),INTERVAL -6 DAY)
    
                UPDATE rpg_jardin_int SET etat = 'recolte'
WHERE date_plantation < DATE_ADD(NOW(),INTERVAL -6 DAY)
                        
                    Voici ma table sql:
Voici le code que j'ai fais, mais qui ne fonctionne pas:
Auriez vous une solution?
    
                --
-- Structure de la table 'rpg_jardin_int'
--
CREATE TABLE IF NOT EXISTS 'rpg_jardin_int' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'joueur' text NOT NULL,
  'nombre_plan' int(11) NOT NULL,
  'espece' text NOT NULL,
  'date_plantation' datetime NOT NULL,
  'etat' text NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
--
-- Contenu de la table 'rpg_jardin_int'
--
INSERT INTO 'rpg_jardin_int' ('id', 'joueur', 'nombre_plan', 'espece', 'date_plantation', 'etat') VALUES
(1, 'samghami', 150, 'carrotte', '2012-06-26 10:04:00', 'vegetation'),
(2, 'samghami', 200, 'carrote', '2012-10-30 12:06:00', 'vegetation');
Voici le code que j'ai fais, mais qui ne fonctionne pas:
<?php
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
// Si tout va bien, on peut continuer
// On récupère tout le contenu de la table jeux_video
$reponse = $bdd->query('SELECT * FROM  rpg_jardin_int');
// On affiche chaque entrée une à une
while ($donnees = $reponse->fetch())
{
?>
<p>
<?php echo $donnees['joueur']; ?> <br /> <?php echo $donnees['date_plantation']; ?> <br /> <?php echo $donnees['etat']; ?> <br /> <?php echo $donnees['espece']; ?>
</p>
<?php 
if (NOW() >= DATE_ADD($donnees['date_plantation'], INTERVAL 3 DAY) && NOW() <= DATE_ADD($donnees['date_plantation'], INTERVAL 3 DAY)) { 
	$bdd->exec('UPDATE rpg_jardin_int SET etat = floraison WHERE etat = vegetation '); 
}
?>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la requête
?>
Auriez vous une solution?
    Alors ton code recupere tous les enregistrement de ta table rpg_jardin_int (sans criteres)  il risque d'en avoir enormement au fil du temps
tu fais une boucle pour tester si ils doivent passer en floraison
tu fais ton test :
c'est du php et sql mélangé, autrement dit çà ne risque pas de marcher
admettons que le test marche, si c'est ok , tu executes cette requete :
qui sera exactement la meme durant toute ta boucle .... et qui au passage modifiera toutes tes lignes et non pas celle que tu desire (entre 3 et 6 jours)
en résumé,
il ne faut modifier que les enregistrement compris entre 3 et 6 jours et pas de boucle (on modifie tout en une requete :
et peux egalement ajouter la condition etat = 'vegetation' pour limiter les résultats qui serait deja modifiés plutot
description de la requete :
passer etat = floraison, tous les enregistrements dont la date_plantation sont compris entre :
date actuelle - 3 jours et date actuelle - 6 jours
    tu fais une boucle pour tester si ils doivent passer en floraison
tu fais ton test :
if (NOW() >= DATE_ADD($donnees['date_plantation'], INTERVAL 3 DAY) && NOW() <= DATE_ADD($donnees['date_plantation'], INTERVAL 3 DAY)) { 
c'est du php et sql mélangé, autrement dit çà ne risque pas de marcher
admettons que le test marche, si c'est ok , tu executes cette requete :
$bdd->exec('UPDATE rpg_jardin_int SET etat = floraison WHERE etat = vegetation '); 
qui sera exactement la meme durant toute ta boucle .... et qui au passage modifiera toutes tes lignes et non pas celle que tu desire (entre 3 et 6 jours)
en résumé,
il ne faut modifier que les enregistrement compris entre 3 et 6 jours et pas de boucle (on modifie tout en une requete :
UPDATE rpg_jardin_int SET etat = 'floraison' WHERE date_plantation BETWWEN DATE_ADD(NOW(),INTERVAL -3 DAY) AND DATE_ADD(NOW(),INTERVAL -6 DAY)
et peux egalement ajouter la condition etat = 'vegetation' pour limiter les résultats qui serait deja modifiés plutot
UPDATE rpg_jardin_int SET etat = 'floraison' WHERE date_plantation BETWWEN DATE_ADD(NOW(),INTERVAL -3 DAY) AND DATE_ADD(NOW(),INTERVAL -6 DAY) AND etat = 'vegetation'
description de la requete :
passer etat = floraison, tous les enregistrements dont la date_plantation sont compris entre :
date actuelle - 3 jours et date actuelle - 6 jours
                        
                    Excuse moi mais pourrais tu me donner le code final? Depuis ce matin je fais beaucoup de test pour essayer d'avoir du résultat mais cela ne fonctionne pas et je m'embrouille le cerveau...
                
                
    
                
<?php
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
$bdd->exec("UPDATE rpg_jardin_int SET etat = 'floraison'
WHERE date_plantation BETWWEN DATE_ADD(NOW(),INTERVAL -3 DAY) AND DATE_ADD(NOW(),INTERVAL -6 DAY) AND etat = 'vegetation' "); 
?>
voilà le code final, pas besoin de plus
    Dans mon script je n'est obtenue aucune erreur mais cela ne fonctionne pas.
Je l'est essayer dans phpmyadmin et cela na pas fonctionner. il me dit l'erreur suivante:
#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 'BETWWEN DATE_ADD(NOW(),INTERVAL -3 DAY) AND DATE_ADD(NOW(),INTERVAL -6 DAY) AND ' at line 2
    Je l'est essayer dans phpmyadmin et cela na pas fonctionner. il me dit l'erreur suivante:
#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 'BETWWEN DATE_ADD(NOW(),INTERVAL -3 DAY) AND DATE_ADD(NOW(),INTERVAL -6 DAY) AND ' at line 2
 
    
    
    
    
:D