Faire une suite d'insctruction à une date précise en php

Résolu
Shikapowa Messages postés 51 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 26 juin 2009 - 13 mai 2009 à 15:36
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 14 mai 2009 à 16:41
Mesdames Mesdemoiselles Messieurs bonjour,
Alors qu'il pleut intensément dehors, j'essaie de me consoler avec mon projet dans mon bureau et après moulte réflexion avec script javascript et php, j'ai besoin de vos conseils et de votre aide pour réaliser un bout de code.
En faite je souhaite supprimer le contenu d'une table à une date précise (supprimer les produit en promotion chaque fin de mois vu que c'est une promotion par mois)
Hors je sais qu'en javacript ce n'est pas possible sauf si on reste connecté
regardez ce bout de code que j'avais mis mais qui ne peut fonctionner si on est pas sur la page:

        <script type="text/javascript">
        // Script pour afficher le compte à rebours//
                var temps = <?php echo $secondes ?>;
                var timer =setInterval('CompteaRebour()',1000);
                function CompteaRebour(){
               
                  temps-- ;
                  j = parseInt(temps/(24*60*60)) ;
                  h = parseInt((temps%(24*60*60))/3600) ;
                  m = parseInt((temps%3600)/60) ;
                  s = parseInt((temps%3600)%60) ;
                  document.getElementById('lool').innerHTML= (j<10 ? "0"+j : j) + '  j :  ' +
                                                                (h<10 ? "0"+h : h) + '  h :  ' +
                                                                (m<10 ? "0"+m : m) + ' mn : ' +
                                                                (s<10 ? "0"+s : s) + ' s ';if ((s 0 && m0 && h ==0)) {
  
   url = "<?php echo $redirection;?>";
   Redirection(url);
   clearInterval(timer);
}
}
function Redirection(url) {
setTimeout("window.location=url", 500)

}

        </script>

à la fin du décomptage je fais une redirection sur une page php qui supprime le contenu de ma table. Hors si nous sommes pas sur la page promo.php eh bien quand le compteur arrive à 0, ça ne fais pas une redirection, normal.

Donc j'ai pensé à ce petit script PHP que je me demande si ça fonctionnerais?

$heures   =23;  // Heure de fin de la promo
$minutes  =23;   // Minutes de fin pour la promo
$secondes = 59;  // Secondes de fin pour la promo

$annee = date("Y");  //-----------------------//
$mois  = date("m");  // Pou le mois en cours--//
$jour  = date("t");  //-----------------------//

$redirection = "delete.php";
if (time()==mktime($heures,$minutes,$secondes,$mois,$jour,$annee))
{
header(Location:delete.php);
ou
$delete = "delete from promo";
$resultat = mysql_query($delete);
}
?>

Cela fonctionnerait - il même si je ne suis pas sur la page?

Cordialement,
Shikapowa

18 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
14 mai 2009 à 16:41
J'ai peut être mal compris ...

C'est pas plus mal non ^^?
= >
A mon avis si, c'est plus mal
Quand tu as des promos en cours ta requête delete va être exécutée à chaque fois. Ce n'est pas ce qui va mettre ton serveur à genoux mais étant donné que tu peux la mettre ailleurs (page admin) sans que ça pose le moindre pb, pourquoi ne pas le faire ?

Je voudrais que l'admin ne s'occupe que de l'insertion des articles dans la base via une page qui lui est dédiée.
=>
L'admin n'a rien à faire, la suppression se fait automatiquement dès qu'il appelle la page d'entrée des nouvelles promos.

Cordialement,

Kohntark -
3
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
13 mai 2009 à 16:05
le plus simple lorsqu'un événelment doit s'exécuter de manière régulière, par exemple une suppression mensuelle, c'est d'en faire un crontab. Evidemment si les cron ne sont pas disponibles sur le serveur, ça complique les choses.

Une autre solution, bien plus simple, est de confier à l'appli le soin de gérer ça. Une simple mini routine, du genre:

// Test du changement de mois...
$dt = date_create() ;
$jour = intval( $dt->format( 'j' ) ) ;
if ( $jour == 1 ) {
   // mise en place d'un contrôle pour ne pas surcharger...
   $test = $dt->format( 'Y-m-d' ) ;
   if ( !file_exists( $test ) ) {
     touch ( $test ) ;
     $delete = "delete from promo";
     $resultat = mysql_query($delete);
   }
}

enfin, ce n'est qu'une suggestion.
0
Shikapowa Messages postés 51 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 26 juin 2009
13 mai 2009 à 16:10
Peux tu m'expliquer, si tu as le temps et l'envie surtout ^^, ce que se passedans le début du if oO? stp

Cordialement,
Shikapowa
0
Shikapowa Messages postés 51 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 26 juin 2009
13 mai 2009 à 16:12
Enfin tout =s, je ne connais pas la syntaxe avec date_create et les "->" =s
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
13 mai 2009 à 16:31
date_create() crée un objet date, c'est là depuis PHP 5.2 et ça utilise une classe dateTime.
$jour récupère uniquement le jour du mois avec le format 'j' et assure un entier...
le reste est très simple.
on crée un nom de fichier avec un format date genre 2009-05-01
touch crée ce fichier (vide))

tout simple et très efficace.
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
13 mai 2009 à 16:33
la syntaxe avec des -> et des :: est la syntaxe objet de PHP, qui est également celle du C++.
Pour comprendre mieux, dans le manuel d ePHP, les Objets en PHP5 est un très bon point de départ.
0
Shikapowa Messages postés 51 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 26 juin 2009
13 mai 2009 à 16:35
$jour = intval( $dt->format( 'j' ) ) ;
$heur = intval($dt->format( 'H' ));
if ( $jour 13 && $heur 17 ) {
   // mise en place d'un contrôle pour ne pas surcharger...
   $test = $dt->format( 'Y-m-d' ) ;
   if ( !file_exists( $test ) ) {
     touch ( $test ) ;
 mysql_select_db($database, $Commercemysql);
    
     $delete = "delete from produit";
     $resultat = mysql_query($delete);
   }
}

Donc ceci va delete quand l'heure sera 17 si j'ai bien suivi tes conseil ^^?
Mais je me demande, si je suis pas sur le site, ça fonctionne pas si?
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
13 mai 2009 à 16:59
Cette série d'instructions fonctionnera que tu y sois ou pas, puisqu'elle se déclenchera dès que la condition sera validée, par le prmeier visiteur qui y passera... à cette heure là.
Tyu peux affiner la chose en testant systématiquement la présence du fichier si tu as très peu de visiteurs.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
13 mai 2009 à 17:04
Salut,

Encore plus simple et efficace à mon avis : ne pas les supprimer le 01 du mois
tu ajoutes un champ 'date_limite' à ta table
pour l'affichage tu contrôles la date de validité (WHERE date_limite > CURRENT_DATE())

Pour la suppression je crois que le mieux est de le faire dans la partie admin, lorsque tu rentres de nouvelles promotions tu exécutes automatiquement le delete des enregistrements du mois n-1.
Sauf a avoir les 10 prochaines années de promo déjà entrées à raison de 500 / mois ça ne posera aucun pb de rapidité., ça sera même bien plus rapide qu'un script qui effectue des tests, écriture, etc ...

Une petite remarque sur le script de Nautilus :
Si il n'y a pas de connexion le 01 du mois les promos ne sont pas supprimées si tu t'appelles google par de pb, mais pour les "petits" sites c'est une donnée à prendre en compte.

Cordialement,

Kohntark -
0
Shikapowa Messages postés 51 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 26 juin 2009
13 mai 2009 à 17:05
Donc je dois garder le jours même vu que je ne sais pas à l'heure si quelqu'un passera
Donc si je mets au premier du mois comme tu l'as mis, cela veut dire que tant que nous sommes le premier du mois, il ne sera pas possible de mettre des nouveaux enregistremenbt dans la table produit, sinon dès qu'un visiteur passeras, ça re delete encore une fois ^^?
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
13 mai 2009 à 17:06
Salut,

Oui, c'est entre autres la solution qui est utilisée par VirtueMart, avec des dates et heures et début et de fin de promotion.
la méthode consistant à vider la table est radicale :)
0
Shikapowa Messages postés 51 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 26 juin 2009
13 mai 2009 à 17:10
Kohntark, donc selon toi je devrais faire
delete from prduit where date_limite > CURRENT_DATE()

Donc dans mon script qui ajoute les articles dans la table produit je devrais mettre une new variable:
$date = date(Y-m-t); // pour la fin du mois ou sinon date(Y-m-1) ?
après:
Insert into produit (..... date_limite) values (..... '$date');

Comme cela?

Cordialement,
Shikapowa
0
Shikapowa Messages postés 51 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 26 juin 2009
13 mai 2009 à 17:30
Car vuiii ça n'a l'air pas bête du tout x), j'en apprends des new fonctions ici,
Donc je devrais faire comme ci - dessus?
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
13 mai 2009 à 17:43
l'idéal, dans ta table des promos rajoutes les champs de type datetime debutpromo et fin promo.
C'est le plus souple.

dans les requêtes du front end, tu peux mettre une clause where
$now = date( 'Y-m-d H:i:s' ) ;
$query = "SELECT * FROM produits _promo WHERE debutprom <= '$now' AND finpromo > '$now'" ;

et en admin, pour éliminer les anciennes promos dépassées...

$now = date( 'Y-m-d H:i:s' ) ;

$query = "DELETE FROM produits _promo WHERE finpromo < '$now'" ;
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
13 mai 2009 à 18:04
delete from prduit where date_limite > CURRENT_DATE()

=>
plutôt ça :
DELETE FROM produit WHERE date_limite < DATE_SUB(NOW(), INTERVAL 1 MONTH)
Il peut même être utile de conserver un historique sur 3 mois, 1 an ... ça n'a pas vraiment d'importance, tu n'auras aucun pb de lenteur ou surcharge avec ça (sauf bien sur si tu a 1 million de promotions, mais dans ce cas file moi l'adresse )

$date = date(Y-m-t); // pour la fin du mois ou sinon date(Y-m-1) ?
après:
Insert into produit (..... date_limite) values (..... '$date');
=>
encore plus simple, dans la requête :
INSERT INTO produit (... date_limite) VALUES (....., LAST_DAY(NOW()));

Tu devrais cependant te réserver la possibilité d'entrer, via un formulaire, la date de début et de fin de la promo. Même si tu ne t'en sert pas de suite ça te permettra d'entrer des promos sur plusieurs mois ou sur des laps de temps différents

Cordialement,

Kohntark -
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
13 mai 2009 à 18:06
Arf, j'ai encore loupé des messages, je n'avais pas vu ton dernier Nautilus ... not grave

Kohntark -
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
13 mai 2009 à 18:57
lol :)

En SQL, il y a tellement d epossibilités qu'on a souvent le choix. L'avantage que je trouve à la solution de jouer sur les dates et heures, c'ets d epermettre de programmer aussi des ventes flash, sur une heure ou deux.
C'ets une des modifications que j'ai apportée à du VirtueMart pour gérer le spromos flash.
0
Shikapowa Messages postés 51 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 26 juin 2009
14 mai 2009 à 08:21
dans les requêtes du front end, tu peux mettre une clause where
$now = date( 'Y-m-d H:i:s' ) ;
$query = "SELECT * FROM produits _promo WHERE debutprom <= '$now' AND finpromo > '$now'" ;

et en admin, pour éliminer les anciennes promos dépassées...

$now = date( 'Y-m-d H:i:s' ) ; $query "DELETE FROM produits _promo WHERE finpromo < '$now'" ;> Je voudrais que l'admin ne s'occupe que de l'insertion des articles dans la base via une page qui lui est dédiée.


$now = date( 'Y-m-d H:i:s' ) ;

$query = "DELETE FROM produits _promo WHERE finpromo < '$now'" ;
Je peux la mettre dans la page promo, car j'ai fais une condition, s'il n'y a pas d'objet dans la base, j'affiche un message "plus de promo actuellement" et je cache les onglets promo sur chaque page. C'est pas plus mal non ^^?
Merci encore de votre aide ^^, j'ai plein d'idées comme ça :)
0
Rejoignez-nous