récupération de date mysql avec php

Eléphant du PHP | 150 Messages

02 oct. 2005, 13:27

Bonjour,

J'ai un problème avec une manipulation de date venant de ma BD MySQL sur une page php.
Voilà: j'ai une colonne avec une date que je vais chercher pour l'afficher sur ma page - jusque là tout va bien, ça fonctionne-, mais je pose une condition: si la date, à laquelle je soustrais la date d'aujourd'hui, est négative, alors la date de ma BD (qui était une date de fin) devient une date de début, à laquelle j'ajoute 21 jours pour trouver une nouvelle date de fin... Puis je modifie le jeu d'enregistrement de ma base et crée en crée un nouveau avec les nouvelles données obtenues (dates...).

Tout fonctionne, sauf, la détermination des deux nouvelles dates: ce que je ne comprends pas, pcq notamment la nouvelle date de début n'est rien d'autre que l'ancienne date de fin, que je récupère bien, et qui refuse de se copier dans le nouveau jeu d'enregistrement.


Pour éclaircir le tout, voici le code:
$mysql_link = mysql_connect('localhost','id','pwd');
$var = 'SELECT cp_fin FROM cp WHERE cp_statut ="On"';
$result = mysql_db_query('DB',$var);

// Là je récupère la date de fin 

while ($row = mysql_fetch_array($result))
{
        list($year, $month, $day, $hour, $min, $sec) = split("-", $row[0]);
        // On split sur les tirets pour séparer an, mois, et jour
        $oldtimestamp = gmmktime($hour, $min, $sec, $month, $day, $year);
        // On créé un time stamp avec cette date.
        $nowtimestamp = gmmktime();
        // On crée le timestamp correspondant à aujourd'hui
        $differ = $oldtimestamp - $nowtimestamp;
        // On fait la différence entre les deux timestamp
        $nb_days = floor(($differ/86400));
        $mod = $differ - ($nb_days * 86400); 
        // ici on calcule combien de secondes restent apres avoir determine les jours
        $nb_hours = floor(($mod/3600)); 
        // Ici on retrouve combien d'heures
        $mod = $mod - ($nb_hours * 3600); 
        // ici on calcule combien de secondes restent apres avoir détermine les heures
        $nb_mins = floor(($mod/60)); 
        // Ici on retrouve combien de minutes
        $nb_secs = $mod - ($nb_mins * 60);
        $time = $nb_days;
        $time .= $nb_hours;
        $time .= $nb_mins;
        $time .= $nb_secs;
}       

        if ($time < 0){
        
        $date_debut = $row[cp_cycleLESC_fin];
        
        $date_fin = 'DATE_ADD("$date_debut", INTERVAL 21 DAY)';

        $maj = 'UPDATE cp SET cp_statut ="Off" WHERE cp_statut ="On"';
        $vieux_cycle = mysql_db_query('CP', $maj);
        
        $create = 'INSERT INTO cp (id_cp, cp_comm, cp_fin, cp_Qt, cp_statut) VALUES ("","$date_debut","$date_fin","0","On")';
        $newcycle = mysql_db_query('CP', $create);
        
        $requete2 = $var;
        $new_result = mysql_db_query('CP', $requete2);
        
        while ($row = mysql_fetch_array($new_result))
        {
        list($year, $month, $day, $hour, $min, $sec) = split("-", $row[0]);
        // On split sur les tirets pour séparer an, mois, et jour
        $oldtimestamp = gmmktime($hour, $min, $sec, $month, $day, $year);
        // On créé un time stamp avec cette date.
        $nowtimestamp = gmmktime();
        // On crée le timestamp correspondant à aujourd'hui
        $differ = $oldtimestamp - $nowtimestamp;
        // On fait la différence entre les deux timestamp
        
        $nb_days = floor(($differ/86400));
        $mod = $differ - ($nb_days * 86400); 
        // ici on calcule combien de secondes restent apres avoir determine les jours
        $nb_hours = floor(($mod/3600)); 
        // Ici on retrouve combien d'heures
        $mod = $mod - ($nb_hours * 3600); 
        // ici on calcule combien de secondes restent apres avoir détermine les heures
        $nb_mins = floor(($mod/60)); 
        // Ici on retrouve combien de minutes
        $nb_secs = $mod - ($nb_mins * 60);
        echo $nb_days.'j.'.$nb_hours.'h.'.$nb_mins.'mn.';
        }
        }
        
        else{
        echo $nb_days.'j.'.$nb_hours.'h.'.$nb_mins.'mn.';
        }


mysql_close ();

Merci d'avance !

Mammouth du PHP | 19672 Messages

02 oct. 2005, 14:06

D'abord, tu as une ligne qui me laisse songeur:
$date_debut = $row[cp_cycleLESC_fin];
Où est définie la constante "cp_cycleLESC_fin" :?:

Ensuite, je crois que si tu faisais afficher tes requêtes, tu aurais quelques surprises: tes concaténations sont douteuses, voici une proposition de corrigé pour quelques lignes:
<?php
//.....
    $date_fin = "DATE_ADD('". $date_debut ."', INTERVAL 21 DAY)";

    $maj = "UPDATE cp SET cp_statut ='Off' WHERE cp_statut ='On'";
    $vieux_cycle = mysql_db_query('CP', $maj);

    $create = "INSERT INTO cp (id_cp, cp_comm, cp_fin, cp_Qt, cp_statut) VALUES ('','". $date_debut ."', '". $date_fin ."', 0, 'On')";
//...
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 150 Messages

03 oct. 2005, 14:08

Même avec la concaténation, ça ne fonctionne pas !

Alors, voilà, je vais poser mon problème sans avancer de solution pcq j'ai tout essayé et que rien ne marche:

- j'ai une date que je vais chercher ds ma BD comme ça:
$mysql_link = mysql_connect('localhost','id','pwd');
$connect = mysql_select_db('DB');
$req = 'SELECT fin FROM cycle WHERE statut ="On"';
$result = mysql_query($req);
- si cette date est inférieure à la date d'aujourd'hui, je change le statut de l'enregistrement actuel (1) et crée un nouvel enregistrement (2):
// (1)
$vieux = 'UPDATE cycle SET statut ="Off" WHERE statut ="On"';
$connect = mysql_select_db('DB');
$oldcycle = mysql_query($vieux);

//(2)       
$maj = 'INSERT INTO cyclelesc (id, comm, fin, Qt, statut) VALUES("","","","0","On")';
$newcycle = mysql_query($maj);
Jusque là tout va bien. Mais ce que je voudrais, c'est insérer la valeur 'fin' de l'ancien enregistrement dans la valeur 'comm' du nouveau et ajouter 21 jours à ce dernier pour déterminer la valeur 'fin' du nouveau...

Dites-moi que c'est possible...!

Mammouth du PHP | 19672 Messages

03 oct. 2005, 14:11

Même avec la concaténation, ça ne fonctionne pas !
Ça ne nous aide pas beaucoup :-k

Ensuite, tu n'as pas répondu au problème de la constante que j'ai soulevé dans ma précédente réponse.

Enfin, la réponse à ta dernière question, c'est oui, mais il manque des détails et j'ai un peu perdu le fil.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 150 Messages

03 oct. 2005, 14:25

pour la question de la constante, c'est une erreur de ma part: il faut lire:
$date_debut = $row[fin];
Mais quand j'insère $date_debut dans ma requête INSERT, je me retrouve avec un superbe 0000-00-00 00-00-00 dans ma base de données.

Donc, je crois que cette donnée que je récupère sur ma page php n'est pas renvoyée dans la BD, ou plus encore: elle n'est plus sous la bonne forme...

Qu'en penses-tu?

Eléphant du PHP | 150 Messages

03 oct. 2005, 14:57

Est-ce qu'il n'existe pas qqc comme ça en sql :

UPDATE cycle SET (comm WHERE statut = "On") = (fin WHERE statut = "Off")
?

Mammouth du PHP | 19672 Messages

03 oct. 2005, 16:01

Pourquoi faire simple quand on peut faire compliqué ;)
non, le mieux est l'ennemi du bien, surtout quand le mieux est invalide en SQL, donc la requête appropriée est

Code : Tout sélectionner

UPDATE cycle SET WHERE statut = "Off"
Rien n'interdit pour antaunt d'ajouter d'autre clauses de sélection s'il y a risque d'ambiguïté entre deux lignes.

As-tu fait afficher les variables de date que tu essayes d'insérer ? Si oui, ont-elles un format correct ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 150 Messages

03 oct. 2005, 17:04

Je ne comprends pas :(
Après ton SET, il faut bien que tu définisse la donnée que tu veux rentrer, non?

Tu veux dire une syntaxe de ce style?

UPDATE cycle SET WHERE statut = "On" comm = fin WHERE = "Off"?

Mammouth du PHP | 19672 Messages

03 oct. 2005, 18:08

Oui, absolument, mais la syntaxe suggérée précédemment était erronée :

Code : Tout sélectionner

UPDATE cycle SET (comm WHERE statut = "On") = (fin WHERE statut = "Off")
Ça n'existe pas à ma connaissance en SQL. Ou alors il faudrait aller plus loin et faire des requêtes imbriquées, pour MySQL, ce n'est pas possible avant la version 4.1.xx
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 150 Messages

03 oct. 2005, 18:16

Alors, que dois-faire?

Mammouth du PHP | 19672 Messages

03 oct. 2005, 18:52

La syntaxe d'un update est la suivante::

Code : Tout sélectionner

UPDATE table SET champ_1 = 'nouvelle valeur 1', champ_2 = 'nouvelle valeur 2', .... champ_n = 'nouvelle valeur n', WHERE champ_repere = "Off";
Là sinon, j'ai du mal à visualiser ce que tu veux mettre à jour sur quelle(s?) table(s?) :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 150 Messages

03 oct. 2005, 19:13

Le problème est que je dois mettre à jour une donnée sur une ligne avec une donnée qui appartient à une autre ligne !!! Donc, je dois utiliser deux WHERE, et apparemment ce n'est pas possible.

Mammouth du PHP | 19672 Messages

03 oct. 2005, 21:10

En une seule requête, je ne crois pas effectivement, il va te falloir dnas un premier temps récupérer la valeur à mettre à jour sur une ligne et dans un second temps faire ton UPDATE avec cette valeur sur l'autre ligne
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

03 oct. 2005, 22:33

Je suis désolé, mais je crois que je vais te demander de m'aider encore un peu pour en finir avec ça, pcq les solutions que j'imagine pour mettre en oeuvre la mise à jour en deux fois sont ni plus ni moins la même chose que ce que je faisais, mais en deux parties... Je tourne en rond.

Mammouth du PHP | 19672 Messages

03 oct. 2005, 22:38

Bon, dis mois donc quelle est la structure de la table (nom des champs et types), quel champ tu veux récupérer et quel champ tu veux mettre à jour.

Dans l'idée, tu auras une première requête SELECT champ_a_recuperer etc.. et on conserve cette valeur dans une variable;
Deuxième requête, UPDATE table SET champ_a_mettre_a_jour = $valeur_sauvegardee;

Je ne vois là pas de difficulté particulière, mais j'ai peut-être loupé un chapitre...? :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: