Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2008, 06h29   #1
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
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.

Citation:
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 :
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 :
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
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2008, 21h41   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
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 :
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
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2008, 23h33   #3
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
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 :
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.
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2008, 08h40   #4
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
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 :
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
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2008, 11h18   #5
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
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.
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2008, 11h23   #6
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
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
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2008, 11h32   #7
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
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.
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2008, 18h47   #8
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
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
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2008, 19h07   #9
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
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 :
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 :
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
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2008, 19h59   #10
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
Donc la date d'inscription sera '0000-00-00' ? Utilisez plutôt la fonction now().
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2008, 04h13   #11
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
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 :
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 :
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 :
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
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2008, 12h47   #12
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
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 :
INSERT INTO `membres` (`nom`, `dateInscription`, `statut`) VALUES ('$nom', now(), 'attente')
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 04h31   #13
Membre habitué
 
Avatar de Alexandrebox
 
Inscription : août 2006
Messages : 613
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 613
Points : 107
Points : 107
Merci DaRian, Merci le modérateur.
Le code marche parfaitement. Je suis très content.
Alexandrebox est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h56.


 
 
 
 
Partenaires

Hébergement Web