PHP et ADD_TIME

samghami Messages postés 85 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:

<?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:

7 réponses

Alain_42 Messages postés 5413 Statut Membre 894
 
oups j'ai pas copier / coller la bonne ligne !

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
1
Blunderer Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   83
 
ah je préfère !!
:D
0
Alain_42 Messages postés 5413 Statut Membre 894
 
essayes:

if ($reponse['date_plantation'] >= DATE_ADD($reponse['date_plantation'], INTERVAL 3 DAY) && $reponse['date_plantation'] <= DATE_ADD($reponse['date_plantation'], INTERVAL 6 DAY))
0
Blunderer Messages postés 273 Date d'inscription   Statut Membre Dernière intervention   83
 
Ce que je ne comprend pas c'est :
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.
0
maka54 Messages postés 721 Statut Membre 80
 
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maka54 Messages postés 721 Statut Membre 80
 
et pour la récolte :

UPDATE rpg_jardin_int SET etat = 'recolte'
WHERE date_plantation < DATE_ADD(NOW(),INTERVAL -6 DAY)
0
samghami Messages postés 85 Statut Membre 1
 
Voici ma table sql:

--
-- 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?
0
maka54 Messages postés 721 Statut Membre 80
 
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 :

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
0
samghami Messages postés 85 Statut Membre 1
 
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...
0
maka54 Messages postés 721 Statut Membre 80
 
<?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
0
samghami Messages postés 85 Statut Membre 1
 
Je suis desole mais cela ne fonctionne pas :(
0
maka54 Messages postés 721 Statut Membre 80
 
peut etre que tu obtient un message d'erreur ?

tu peux aussi tester la requete directement dans phpmyadmin
0
samghami Messages postés 85 Statut Membre 1
 
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
0
maka54 Messages postés 721 Statut Membre 80
 
ok, remplace BETWWEN par BETWEEN

c'est une erreur de frappe
0