Page 1 sur 1

date et comparaison

Posté : 05 mars 2006, 14:33
par Florent
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

Posté : 05 mars 2006, 15:50
par ouckileou
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

Posté : 05 mars 2006, 16:40
par Florent
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 ?

Posté : 05 mars 2006, 17:57
par BeRoots
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());

Posté : 05 mars 2006, 18:48
par Florent
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...

Posté : 05 mars 2006, 19:02
par ouckileou
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

Posté : 05 mars 2006, 19:08
par Florent
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) :)

Posté : 05 mars 2006, 19:24
par ouckileou
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);

Posté : 05 mars 2006, 19:45
par Florent
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)

Posté : 05 mars 2006, 19:53
par ouckileou
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

Posté : 05 mars 2006, 20:00
par Florent
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