date et comparaison

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : date et comparaison

par Florent » 05 mars 2006, 20:00

Alors là, honte à moi !!!
Tu as remis le mysql_query() ?
Ben non :oops:

J'ai dû trop chercher et ma cervelle bug.

Un grand merci pour ton aide, ça marche

par ouckileou » 05 mars 2006, 19:53

Si tu envoie la requête directement, via phpMyAdmin par exemple, ça fonctionne ?
Tu as remis le mysql_query() ?
$Tdansdixjours = mktime(00, 00, 00, date("m") , date("d") - 10, date("Y"));
$Ddansdixjours = date("Y-m-d", $Tdansdixjours);

$requete = "DELETE FROM Liste WHERE date1 <='$Ddansdixjours'";
echo $requete; // tester ceci dans phpMyAdmin
mysql_query($requete) or die (mysql_error()); // pour voir les erreurs

par Florent » 05 mars 2006, 19:45

Merci, là c'est bien plus clair dans mon esprit.

J'ai donc fais ceci :
$Tdansdixjours = mktime(00, 00, 00, date("m") , date("d") - 10, date("Y"));
$Ddansdixjours = date("Y-m-d", $Tdansdixjours);
echo $Ddansdixjours;
$requete = "DELETE FROM Liste WHERE date1 <='$Ddansdixjours'";
Mon echo me donne : 2006-02-23 et même quand je colle cette date dans mon champ date1 cela ne me l'efface pas !
Bizard.
Pourtant si je remplace la condition :
date1 <='$Ddansdixjours', j'ai bien une égalité, et j'ai vérifié dans la table, mon "date1" est bien de type date (0000-00-00 par défaut)

par ouckileou » 05 mars 2006, 19:24

Je voulais dire : voir le code que tu envoies à MySQL, comme ceci :
$dansdixjours = mktime(0, 0, 0, date("m") , date("d") - 10, date("Y"));
$requete = "DELETE FROM Liste WHERE date1 >='$dansdixjours'";
echo $requete;
Code qui doit ressembler à ça :

Code : Tout sélectionner

DELETE FROM Liste WHERE date1 >= '12345679890'
On voit donc bien que ça ne peut pas fonctionner

Pour garder ton principe, il te suffit de reformater ce timestamp (nombre de secondes) au bon format : AAAA-MM-JJ

Tu peux le faire avec la fonction date() :
string date ( string format [, int timestamp] )
Facile donc, tu lui dis quel format tu veux, tu lui fournis ton timestamp, et voilà :
$Tdansdixjours = mktime(0, 0, 0, date("m") , date("d") - 10, date("Y")); // ce serait plutôt "il y a 10 jours"
$Ddansdixjours = date("Y-m-d", $Tdansdixjours);

$requete = "DELETE FROM Liste WHERE date1 <='$Ddansdixjours'";
Là ça devrait fonctionner ;)

Pour la version full MySQL :

Code : Tout sélectionner

DELETE FROM Liste WHERE date1 <= DATE_SUB(NOW(), INTERVAL 10 DAY);

par Florent » 05 mars 2006, 19:08

Est-ce que tu as regardé le code SQL que tu génères comme je l'ai dit dans mon premier message ?
En fait je ne vois pas ce que tu veux dire...

Oui j'avais regardé la faq et essayé avec le point 3 (les écarts) mais je n'ai pas réussi à adapté le script sur ma page et le faire fonctionner.
le test de comparaison qui est mauvais : tu compares une colonne de type DATE (AAAA-MM-JJ) avec un timestamp UNIX, ça ne peut pas fonctionner
Oui c'est exactement ça, c'est bien mon problème.

C'est marrant qu'un truc apparament simple pose tant de problèmes (j'ai fais des recherches suur le forum, ben les comparaison de date posent toujours problème) :)

par ouckileou » 05 mars 2006, 19:02

Est-ce que tu as regardé le code SQL que tu génères comme je l'ai dit dans mon premier message ?

Le problème n'est pas sur le DELETE, mais sur le test de comparaison qui est mauvais : tu compares une colonne de type DATE (AAAA-MM-JJ) avec un timestamp UNIX, ça ne peut pas fonctionner

Donc soit tu gardes ton principe, mais tu repasses ton timestamp au bon format avec la fonction date() en PHP

Soit tu regroupes tout dans ta requête et tu peux regarder ce point de la FAQ : http://www.phpfrance.com/forums/voir_sujet-8323.php

par Florent » 05 mars 2006, 18:48

Merci
Essayé mais ça ne marche pas.
Je suis allé dans la table et j'ai remplacé le 03 de mars par 02 de février donc un mois pour faire les essais et rien n'est effacé.

je continue à chercher...

par BeRoots » 05 mars 2006, 17:57

j'ai fait cela il y a peu et sa fonctionne à merveille :wink:

essaye comme ceci:
// on efface les lignes périmees de la table
    $sql = "DELETE QUICK FROM liste WHERE date1 < '$dixjours'";
    mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

par Florent » 05 mars 2006, 16:40

J'avoue y être allé un peu à tatons.

Voici les détails de mon champ Date1 :

Champ........Type...........Null........Defaut
date1 date Non 0000-00-00

Alors ce que je voulais faire, c'est qu'a chaque fois qu'un membre sollicite cette table, supprimer tout ce qui date de plus de 10 jours

J'ai changé les signes :
$dixjours = mktime(0, 0, 0, date("m") , date("d") - 10, date("Y"));
mysql_query("DELETE FROM Liste WHERE date1 <='$dixjours'");

Ca ne marche vraiment pas.
Mais en fait je ne sais pas si je suis sur la bonne voie, peut-être qu'il ne s'agit pas de la bonne méthode ?

par ouckileou » 05 mars 2006, 15:50

Heu... je crois qu'il y a une petite différence entre ce que tu souhaites faire et ce que tu fais

Tu souhaites : supprimer les enregistrements dont la date <= aujourd'hui-10
Tu fais : supprimer les enregistrements dont la date >= aujourd'hui+10, ce qui n'arrivera jamais à moins que tu ais des lignes enregistrées avec une date future

Si ça efface tout, c'est peut-être parceque tu compares une colonne MySQL de type date, avec un timestamp : de quel type est "date1"
Regarde le code SQL généré avant d l'exécuter, pour voir si ça ressemble à ce que tu veux

date et comparaison

par Florent » 05 mars 2006, 14:33

Bonjour
Ce que je veux faire :
A la lecture d'une table, supprimer les lignes dont la date est plus ancienne que 10 jours...
J'ai fais ça :

// virer les transferts de + de x jours

$dansdixjours = mktime(0, 0, 0, date("m") , date("d") + 10, date("Y"));
mysql_query("DELETE FROM Liste WHERE date1 >='$dansdixjours'");

Ca efface tout, y aurait-il un moyen autre, ou je crois que les choses sont trop simples ?

Merci d'avance pour toute suggestion