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

 MySQL Discussion :

Comment supprimer les données de plus de 5 jours dans la table Mysql ?


Sujet :

MySQL

  1. #1
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut Comment supprimer les données de plus de 5 jours dans la table Mysql ?
    Bonjour,
    J'ai la date d'inscription de chaque membre. J'ai la date actuelle. Je cherche à supprimer les données vieilles de 5 jours dont le champ (inscrption) serait égal à(attente) et envoyer des emails aux membres comme quoi le délai pour confirmer leur inscription est dépassée et que le membre a été supprimé. Il faut que ça se fasse automatiquement.

    Voici les champs de la table membres
    $dateInscription est la date de l'inscrption du membre cette valeur est par exemple 08.02.2007
    $dateActuelle est la date actuelle : date('d.m.Y')
    $mailMembre est l'adresse email du membre

    Ce que j'aimerais faire, c'est supprimer automatiquement toutes les inscriptions qui datent plus de 5 jours et envoyer un mail aux membres supprimés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //la base de donnée
    $query_calcul = sprintf("DELETE FROM membres WHERE dateInscription = %s", $dateActuelle);
    $calcul = mysql_query($query_calcul, $idConnex) or die(mysql_error());
    $row_calcul = mysql_fetch_assoc($calcul);
    $total_calcul = mysql_num_rows($calcul);
    //ça peut donner un résultat juste, mais est ce que c'est bien? Quelque chose de plus optimal (PLEASE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    //TRAITEMENT DES COURRIERS AUX MEMBRES SUPPRIMES
    /*
    Comment récupérer leurs emails sans avoir à faire deux fois la requettes?
    Comme je suis débutant, la seule possibilité que j'ai, c'est de faire une première requette (SELECT * FROM membres WHERE dateInscription = $dateActuelle)
    et récupérer les emails ensuite les envoyer. Exemple de ce que j'ai fait pas du tout optimal. Je sais qu'il peut y avoir un moyen d'envoyer des emails et de supprimer sans passer par ce long chemin. AIDEZ-MOI SVP
    */
     
    //Code envoyer un email
    $texte = "Bonjour $prenomMembre<br>Votre compte a été supprimé après 5 jours. Veuillez-nous contacter.<br><br>La Direction";
     
    $query_rsReference = "SELECT * FROM membres";
    $rsReference = mysql_query($query_rsReference , $idConnex) or die("Problème lors de votre requête!");
    $res= mysql_numrows($rsReference);
     
        $i=0;
     
    	while($i < $res)
    	{
     
        $email= mysql_result($rsReference,$i,"email");
     
        $objet = "Concerne votre compte";
        $entete = "MIME-Version: 1.0\r\n";
        $entete .= "Content-type: text/html; charset=iso-8859-1\r\n";
        $entete = "Reply-to: Garderie Fleuris <info@garderiefleuris.com>\r\n";
        $entete .= "From: Garderie Fleuris <info@garderiefleuris.com>\r\n";
        $entetes .= "Content-Transfert-Encoding: 8bit\r\n";
        $entetes .= "X-Mailer:PHP/".phpversion()."\r\n";
     
        $message = stripslashes($texte);
     
        mail($email, $objet, $message, $entete);
    	 $i++;
            }
        mysql_close();
     
    		}
    D'avance je vous remercie beaucoup
    Je sais que je ne sais rien

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    avril 2002
    Messages
    5 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : avril 2002
    Messages : 5 931
    Points : 23 461
    Points
    23 461
    Par défaut
    Bonjour,

    Il faut faire la part des choses, dans ta demande.
    Sur un forum dédié à MySQL, on peut répondre à la première question, à savoir comment supprimer de la table les inscriptions de plus de 5 jours, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM membres 
    WHERE DATEDIFF(CURDATE(), dateInscription) > 5
    Mais pour l'envoi automatique du mail, il faut poser la question sur le forum PHP, pour avoir plus de chances d'obtenir une réponse...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Bonsoir,
    peut-être faire un SELECT pour trouver l'id et mail des inscriptions périmées, puis faire une boucle pour la notification par e-mail. Au final et si toutes les notifications se sont déroulées correctement, faire un DELETE en utilisant la syntaxe IN avec la liste des id retournés par le SELECT.

    Exemple schématique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
     
      $res = mysql_query('SELECT `id`, `email` FROM `membres` WHERE `confirmation` = 0 AND DATEDIFF(CURDATE(), `inscription`) > 5');
     
      while (list($id, $email) = mysql_fetch_row($res))
      {
     
        mail($email, 'Notification', 'Désolé votre inscription est périmée!');
     
        $idList[] = $id;
     
      }
     
      mysql_query('DELETE FROM `membres` WHERE `id` IN ('.join(',' $idList).')');
     
    ?>
    Enfin, quelque chose comme ça.

    Cordialement,
    DaRiaN.

  4. #4
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Merci beaucoup Ced et Darian.

    Concernant ton code, faut il déclarer le champ dateInscription d'une manière spéciale? Je dis ça parce que le mien est Varchar.
    Citation Envoyé par ced Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM membres 
    WHERE DATEDIFF(CURDATE(), dateInscription) > 5
    ced
    Ma deuxième question est la suivante. Est ce qu'il faut tous les jours afficher la page pour déclencher l'évènement ou il il se déclenche automatiquement dès que la limite de la date est atteinte?

    Merci beaucoup pour votre réponse
    Je sais que je ne sais rien

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Bonjour,
    le mieux serait de créer une tâche planifiée (crontab). Certains mutualisés le permettent, et si ce n'était pas le cas, il y a des solutions gratuites via le protocole HTTP.

    En ce qui concerne dateInscription, un champ date (ou datetime) plutôt qu'un varchar et créé un INDEX, cela serait parfait.

    Cordialement,
    DaRiaN.

  6. #6
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Merci beaucoup mais précise moi encore cette partie.
    Le fichier php tout seul avec ce code ne déclenche pas l'évènement dès que la date est atteinte? Il faut faire autre chose? C'est très compliqué cette histoire. Parce que normalement "rafraichir la page" est une action qui déclenche un évènement. Je croyais que la condition posée déclencherai automatiquement l'évènement
    Je sais que je ne sais rien

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Manuellement oui, donc tous les 24h vous devrez déclencher l'évènement en lançant le script ou vous créez une tâche planifiée qui lancera automatiquement le script tous les jours à la même heure.

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    avril 2002
    Messages
    5 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : avril 2002
    Messages : 5 931
    Points : 23 461
    Points
    23 461
    Par défaut
    Effectivement, pour que DATEDIFF fonctionne, il faut être sur un champ de type DATE...
    Tu peux utiliser la fonction de conversion CAST(ton_champ AS DATE), mais il faut que ton champ date soit au format 'YYYY-MM-DD' pour que la conversion se passe bien.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  9. #9
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Merci beaucoup.
    Une dernière question.
    Quand je crée le champ date, je dois insérer la date dans ce champ ou il faut laisser le champ vide et c'est msql qui s'en charge.

    Dans ce code, j'ai omis le champ date. Est ce que c'est juste?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $insertDonnee = "INSERT INTO membres(nom) VALUES('$nom')";
    mysql_query($insertDonnee, $idConnex) or die (mysql_error());
    Est-ce que c'est juste comme ça la table?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE `membres` (
      `ID` int(11) NOT NULL auto_increment,
      `nom` varchar(50) collate utf8_unicode_ci NOT NULL default '',
      `dateInscription` date NOT NULL default '0000-00-00',
      PRIMARY KEY  (`ID`),
      KEY `dateInscription` (`dateInscription`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
    Je vous remercie beaucoup
    Je sais que je ne sais rien

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Donc la date d'inscription sera '0000-00-00' ? Utilisez plutôt la fonction now().

  11. #11
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Merci beaucoup Darain pour ta gentillesse et merci aussi pour le moderateur de m'avoir accorder son attention.

    Seulement Darain, je ne sais pas où je dois utiliser cette fonction now().
    Ici tous les codes. Dites-moi s'il vous plaît si tout a l'air normal?

    Table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE `membres` (
      `ID` int(11) NOT NULL auto_increment,
      `nom` varchar(50) collate utf8_unicode_ci NOT NULL default '',
      `dateInscription` date NOT NULL default '0000-00-00',
      `statut` varchar(20) collate utf8_unicode_ci NOT NULL default '',
      PRIMARY KEY  (`ID`),
      KEY `dateInscription` (`dateInscription`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
    Ajouter données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $insertDonnee = "INSERT INTO membres(nom,statut) VALUES('$nom','attente')";
    mysql_query($insertDonnee, $idConnex) OR die (mysql_error());
    Supprimer automatiquement des données de plus de 5 jours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $deletePage = "DELETE FROM membres WHERE DATEDIFF(CURDATE(), dateInscription) > 5 AND statut = 'attente'";
    mysql_query($deletePage, $idConnex) or die (mysql_error());
    Merci d'avance pour votre aide
    Je sais que je ne sais rien

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Comme je pense qu'il est toujours impossible d'associer une fonction à la valeur par défaut d'un champ date, il ne reste plus que la requête d'insertion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `membres` (`nom`, `dateInscription`, `statut`) VALUES ('$nom', now(), 'attente')

  13. #13
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Merci DaRian, Merci le modérateur.
    Le code marche parfaitement. Je suis très content.
    Je sais que je ne sais rien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/12/2013, 19h59
  2. Réponses: 6
    Dernier message: 20/10/2013, 12h37
  3. Réponses: 1
    Dernier message: 17/10/2012, 17h18
  4. Réponses: 170
    Dernier message: 12/08/2009, 09h56
  5. Réponses: 4
    Dernier message: 02/05/2009, 18h56

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