PHP et ADD_TIME

Fermé
samghami Messages postés 61 Date d'inscription mercredi 21 mars 2012 Statut Membre Dernière intervention 2 mars 2016 - 30 oct. 2012 à 13:29
maka54 Messages postés 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 - 31 oct. 2012 à 10:33
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 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
30 oct. 2012 à 14:27
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 mardi 17 juillet 2012 Statut Membre Dernière intervention 6 décembre 2012 83
30 oct. 2012 à 14:28
ah je préfère !!
:D
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
30 oct. 2012 à 13:50
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 mardi 17 juillet 2012 Statut Membre Dernière intervention 6 décembre 2012 83
Modifié par Blunderer le 30/10/2012 à 14:18
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 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
30 oct. 2012 à 14:31
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 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
Modifié par maka54 le 30/10/2012 à 14:33
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 61 Date d'inscription mercredi 21 mars 2012 Statut Membre Dernière intervention 2 mars 2016 1
30 oct. 2012 à 15:43
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 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
30 oct. 2012 à 16:12
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 61 Date d'inscription mercredi 21 mars 2012 Statut Membre Dernière intervention 2 mars 2016 1
30 oct. 2012 à 16:21
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 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
30 oct. 2012 à 16:27
<?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 61 Date d'inscription mercredi 21 mars 2012 Statut Membre Dernière intervention 2 mars 2016 1
30 oct. 2012 à 16:33
Je suis desole mais cela ne fonctionne pas :(
0
maka54 Messages postés 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
30 oct. 2012 à 16:40
peut etre que tu obtient un message d'erreur ?

tu peux aussi tester la requete directement dans phpmyadmin
0
samghami Messages postés 61 Date d'inscription mercredi 21 mars 2012 Statut Membre Dernière intervention 2 mars 2016 1
30 oct. 2012 à 16:47
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 698 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
30 oct. 2012 à 16:50
ok, remplace BETWWEN par BETWEEN

c'est une erreur de frappe
0