IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Remplacer une date incrémentée dans une base de donnée [mysql]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Points : 40
    Points
    40
    Par défaut Remplacer une date incrémentée dans une base de donnée [mysql]
    Bonjour à tous

    Voilà, en résumé, j'ai des membres dans un BDD.
    Ses membres peuvent avoir une sanction (en cas de mauvais comportement)
    Cette sanction peut avoir une durée déterminée.
    J'ai donc créé une colonne "fin_sanction" dans ma table "membres" de format DATE (0000-00-00)

    je voudrais donc pouvoir modifier cette colonne via une requête.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $GETreqD = mysql_query('SELECT fin_sanction from membres where membre_id="'.$_SESSION['cible'].'"');
    $GETaResultreqD = mysql_fetch_array($GETreqD);
     
    /* je vais chercher la valeur actuelle de la colonne et la place dans la variable $fin_sanction_old */
    $fin_sanction_old = $GETaResultreqD['fin_sanction'];
    $fin_sanction = date('Y m d');
     
    /*Je remplace $fin_sanction_old par $fin_sanction dans ma table */
    $reqDuree = mysql_query('UPDATE membres
    SET fin_sanction = REPLACE(fin_sanction, '.$fin_sanction_old.', '.$fin_sanction.')
    where membre_id="'.$_SESSION['cible'].'"');

    Mais, la date reste inchangée :/
    Sachant que dans cette exemple, on suppose que la date de fin sanction sera celle du jour en cours.

    A terme je voudrais pouvoir dire
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $fin_sanction = date('Y m d') + $_POST['duree'];

    $_POST['duree'] étant un chiffre issu d'un <input type="text" name="duree" size="3" /> (un nombre de 2 chiffres maxi)

    IL y a forcément qq chose que j'écris mal ... / mais quoi

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il ne faut pas utiliser REPLACE mais DATE_ADD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éclairé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2012
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2012
    Messages : 416
    Points : 747
    Points
    747
    Par défaut
    Au passage: l'extension mysql_ est obsolète. Utiliser mysqli_ ou PDO en remplacement

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    Donc si je comprends bien suffirait de faire :


    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $reqDuree = mysqli_query('UPDATE membres
    SET fin_sanction = DATE_ADD(fin_sanction, '.$fin_sanction_old.', '.$fin_sanction.')
    where membre_id="'.$_SESSION['cible'].'"');

    tout simplement ?

    Parceque c'est ce que j'ai fait, mais rien n'y fait :/

    Saleté de requête ^^

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Non, les paramètres sont pas les mêmes du coup : voir la doc.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Donner le lien vers la doc de la fonction à utiliser et se rendre compte que ça n'a servi à rien... Check !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    OUp pardon CinePhil, je n'avais pas vu le lien sur DATE_ADD ^^

    Ceci étant dit, merci, mais si je viens ici, c'est pour avoir justement des explications un peu personnalisée, qu'on a pas dans les docs génériques qu'on peut trouver sur Internet
    Sinon, pas de problème, j'ai su trouver la fonction DATE, et même en français, mais ca ne m'avance pas sur mon cas, je n'arrive pas à l'adapter :/

    Oui je sais, c'est chiant un NooB :p

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    En mode PDO, ça devrait donner à peu près ça (ça fait quelques temps que je n'ai pas fait de PHP), en partant d'aujourd'hui comme base de calcul de la date de fin de sanction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $sql = "
    	UPDATE membres
    	SET fin_sanction = DATE_ADD(CURRENT_DATE, INTERVAL :duree DAY)
    	WHERE membre_id = :id_membre
    ";
     
    $prep = $pdo->prepare($sql);
    $prep->bindValue(':duree', $duree, PDO::PARAM_INT);
    $prep->bindValue(':id_membre', $_SESSION['cible'], PDO::PARAM_INT);
     
    $prep->execute();
     
    $result = $prep->fetch(PDO::FETCH_ASSOC);
    L'important, c'est que tu comprennes la syntaxe de DATE_ADD. Dans ma requête, la fin de sanction sera enregistrée à aujourd'hui (CURRENT_DATE) + duree jours.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    Merci Cinephil

    Hm, effectivement je n'aurai jamais abouti à ça tout seul.

    En fait, la syntaxe DATE_ADD, me paraissait simple à comprendre, dans l'absolu, et répondre à ma recherche.
    Ce qui me gênait c'est que, ok, il sélectionne une date et ajoute "x" DAY à cette date... Parfait.
    Oui, mais, où (comment) je lui dit de le faire à TEL endroit précis de ma table (Colonne précise (ici fin_sanction), ligne précise (membre_id=$_SESSION[cible]))

    En fait quand je regarde la fonction, j'ai simplement l'impression que ca nous dit comment sélectionner une date, et y ajouter un nombre de jours voulu, mais ca ne nous dit pas comment insérer(modifier) cette date à un endroit choisi de la BDD.
    J'avais peut-être mal exprimé mon vrai souci faut dire ^^

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    DATE_ADD est juste une fonction de calcul sur les dates. Elle ne va pas changer les valeurs enregistrées dans la BDD toute seule. Ça c'est le rôle de la requête UPDATE... qui peut utiliser la fonction DATE_ADD.
    Mais DATE_ADD pourrait aussi être utilisé dans la partie SELECT ou dans la partie WHERE d'une requête.
    Par exemple, si tu veux les membres dont la sanction se termine dans les 10 prochains jours, tu peux faire ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT membre_id
    FROM membres
    WHERE fin_sanction <= DATE_ADD(CURRENT_DATE, INTERVAL 10 DAY)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    Ahh ok, ca s'éclaircit

    Bon bientôt j'arrêterai d'être une calamité...

    j'ai fait ca :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $GETreqD = mysql_query('SELECT fin_sanction from membres where membre_id="'.$_SESSION['cible'].'"');
    $GETaResultreqD = mysql_fetch_array($GETreqD);
     
    $fin_sanction_old = $GETaResultreqD['fin_sanction'];
    $new_date = DATE_ADD(CURRENT_DATE, INTERVAL 10 DAY);
     
    /* UPDATE la date de fin de sanction*/
    $reqDuree = mysql_query('UPDATE membres
    SET fin_sanction = REPLACE(fin_sanction, '.$fin_sanction_old.', '.$new_date.'
    where membre_id="'.$_SESSION['cible'].'"');						
    }
    Mais je m'en doutais, y'a encore un truc que j'ai pas pigé puisque j'ai ca :

    Parse error: syntax error, unexpected T_LNUMBER in "mon fichier et ma ligne où il ya [$new_date = DATE_ADD(CURRENT_DATE, INTERVAL 10 DAY);]

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* UPDATE la date de fin de sanction*/
    $reqDuree = mysql_query('UPDATE membres
    SET fin_sanction = REPLACE(fin_sanction, '.$fin_sanction_old.', '.$new_date.'
    where membre_id="'.$_SESSION['cible'].'"');
    Mais pourquoi avoir remis l'ancienne requête avec le REPLACE ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $new_date = DATE_ADD(CURRENT_DATE, INTERVAL 10 DAY);
    Tu mélanges du php et du SQL !
    DATE_ADD est une fonction MySQL ; elle ne peut pas être utilisée en tant qu'instruction dans du code PHP mais dans le texte d'une requête !

    Reprenons ton code avec un peu plus de rigueur !

    Je ne sais pas quelle en est l'utilité mais dans la première requête, tu récupères l'actuelle date de fin de sanction. Ré-écrivons cette partie en utilisant PDO afin d'éviter les injections SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $sql = "
    	SELECT fin_sanction 
    	FROM membres 
    	WHERE membre_id = :membre_id
    ";
     
    $prep = $pdo->prepare($sql);
    $prep->bindValue(':membre_id', $_SESSION['cible'], PDO::PARAM_STR);
    $prep->execute();
     
    $result = $prep->fetch(PDO::FETCH_ASSOC);
     
    $fin_sanction_old = $result['fin_sanction'];
    Ensuite tu veux faire quoi ?
    Tu veux ajouter 10 jours à la date de fin de sanction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql = "
    	UPDATE membres
    	SET fin_sanction = DATE_ADD(fin_sanction, INTERVAL 10 DAY)
    	WHERE membre_id = :membre_id
    ";
     
    $prep = $pdo->prepare($sql);
    $prep->bindValue(':membre_id', $_SESSION['cible'], PDO::PARAM_STR);
    $prep->execute();
    Même pas besoin d'aller chercher la date de fin de sanction actuelle pour la mettre à jour.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre du Club
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    Hm effectivement, je voulais récupérer l'ancienne date parceque je pensais qu'il fallait le faire, pour pouvoir la remplacer
    Mais à lire ton code, y'a effectivement pas besoin, on remplace par dessus et point barre ^^.
    Je préfère ^^

    Par contre, je ne comprends pas toute la syntaxe et l'histoire du "PDO"
    Kézaco ?

    D'ailleurs il me sort cette erreur :

    Notice: Undefined variable: pdo in /Volumes/Devpart/websites/Cours_PHP/Olhyon_jeu/pagelement/change_sanction.php on line 186

    Fatal error: Call to a member function prepare() on a non-object in /Volumes/Devpart/websites/Cours_PHP/Olhyon_jeu/pagelement/change_sanction.php on line 186
    La ligne 186 étant
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $prep = $pdo->prepare($sql);

    Effectivement, on sort $pdo sans l'avoir initialisé, du coup, je ne sais pas bien :/

    Pour expliquer clairement :
    J'ai des membres.
    Ces membres peuvent obtenir une sanction pour une durée déterminée.
    Pour se faire, je sélectionne une sanction et via un champs input ($_POST['duree']) j'entre le nombre de jours que doit durer la sanction.

    Quand je valide, ca va modifier l'ID de sanction dans la BDD (pour attribuer la sanction sélectionnée), et je voudrais aussi que ca remplisse la colonne FIN_SANCTION, avec la date qui correspond à (la date du jour + "x" jours)
    Ces "x" jours étant déterminés par mon champs input ($_POST['duree'])

    < bon sachant que mon problème n'est pas de récupérer le nombre de jours de sanction, ni même d'attribuer la sanction ou de la retirer, ca je sais faire au moins et ca fonctionne bien ^^)

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Oui, j'ai repris un bout de code de chez moi pour faire le tien.
    $pdo correspond à une un objet PDO.

    Voir la doc sur PDO pour comprendre comment ça fonctionne.

    Tu peux adapter mon code avec mysqli_ si tu préfères mais là aussi, faut bucher un minimum la doc quand même pour sécuriser son application parce qu'affecter une valeur directement depuis $_SESSION ou autre variable globale système, ce n'est vraiment pas top !

    L'essentiel est que tu aies compris le principe de DATE_ADD puis de la requête UPDATE.
    Si en plus j'ai pu te convaincre de mieux structurer ton code et de faire attention à la sécurité, je n'aurai pas perdu mon temps !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  15. #15
    Membre du Club
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    Ah ok je comprends mieux ^^

    Bon je vais aller fouiller la doc sur "Monsieur PDO" alors

    Quand à mieux structurer mon code pour le rendre sécure, je ne demande que ça.
    C'est sûr, comme je ne sais pas bien le faire, je fais avec ce que je connais et que j'arrive à faire, mais je suis preneur de toute amélioration ^â

    Pour expliquer clairement :
    J'ai des membres.
    Ces membres peuvent obtenir une sanction pour une durée déterminée.
    Pour se faire, je sélectionne une sanction et via un champs input ($_POST['duree']) j'entre le nombre de jours que doit durer la sanction.

    Quand je valide, ca va modifier l'ID de sanction dans la BDD (pour attribuer la sanction sélectionnée), et je voudrais aussi que ca remplisse la colonne FIN_SANCTION, avec la date qui correspond à (la date du jour + "x" jours)
    Ces "x" jours étant déterminés par mon champs input ($_POST['duree'])

    < bon sachant que mon problème n'est pas de récupérer le nombre de jours de sanction, ni même d'attribuer la sanction ou de la retirer, ca je sais faire au moins et ca fonctionne bien ^^)

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/04/2012, 09h28
  2. Réponses: 82
    Dernier message: 05/02/2011, 14h34
  3. Réponses: 3
    Dernier message: 06/12/2010, 15h59
  4. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  5. Réponses: 2
    Dernier message: 21/03/2007, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo