[Résolu] Problème d'opérateurs sql

Eléphant du PHP | 418 Messages

24 déc. 2010, 04:56

Bonjours à tous

Voila mon problème

j'ai créer une fonction permettant d'invalider une annonce automatiquement

voila comment cela fonctionne

on cherche les messages ayant la date limite égale à la date du jours et on les invalides

le problème c'est que lors de ma requête, j'aurais aimer mettre comme condition, que la date limite soit égale ou inférieure à la date du jours, ce qui permet d'invalider des annonces dont cela n'aurais pas était fait , car personne ne se serait connecter sur le site à la date prévu.

Mais lors de mon essaie, cela fonctionnais super bien, sauf que une fois la date limite remise à jours, ça continuais quand même à m'invalider cette annonce, alors que j'ai bien vérifié, la date limite étais bien supérieur à la date du jours donc ne devrai pas être dans ma condition

Je vous met le code que vous puissiez comprendre (j'envoie mail lors de l'invalidation du message, mais j'enlève cette partie pour ne garder que l'essentiel)

le champ pour la date limite se nome TimeDate
        $date = date('d-m-Y');
	$DeletDate = ucwords(strftime("%d-%m-%Y",mktime(0,0,0,date("m"),date("d")+5,date("Y"))));
	// on cherche les annonces valides dont timedate est inferieur ou égale à la date du jours
	$timedate = mysql_query("SELECT * FROM Annonces WHERE Etat='Valid' AND TimeDate='".$date."'"); // Ici c'est une simple égalité car ce que je voulais marchait pas.
	while ($rtimedate = mysql_fetch_assoc($timedate))
	{
			// on cherche et selection son propriétaire
			$liste = mysql_query("SELECT * FROM Membres WHERE Login='".$rtimedate['Login']."'");
			while ($select = mysql_fetch_assoc($liste))
			{
// ici on envoie le mail et en fonction on continue avec cela:
				// On met à jours la table annonces
				mysql_query("UPDATE Annonces SET Etat='Nonvalid', DeletDate='".$DeletDate."', CodeId='".$Code."' WHERE Id='".$IdA."'");
				echo '<br /><span style="color:#AE00FF;font-size:13px;font-weight:bold;">Annonce Invalidé</span><SCRIPT LANGUAGE="JavaScript">document.location.href="index.php"</SCRIPT>';
                        }
        }
Pour me permettre de sélectionner les annonces dont la date limite est inférieur à la date j'ai mit comme requette
	$timedate = mysql_query("SELECT * FROM Annonces WHERE Etat='Valid' AND TimeDate<='".$date."'");
ce qui devrais sélectionner les annonces sont TimeDate est égale ou inférieur à la date du jours.

Mais pourquoi malgré tous cela continue à invalider celles dont TimeDate est supérieur à la date du jours?

Merci de votre aide

j'espère que ce que j'ai dit est compréhensible

Bonnes fêtes à vous

Cordialement
Modifié en dernier par Fre3z69 le 02 janv. 2011, 11:02, modifié 2 fois.

ViPHP
ViPHP | 2577 Messages

24 déc. 2010, 10:03

Bonjour,

N'y aurait il pas un problème de format de date ?

Tu peux utiliser GET_FORMAT(DATE,'ISO') avec Mysql pour avoir la date au format YYYY-MM-DD et mettre $date = date('Y-m-d').

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 déc. 2010, 11:20

Est-ce que ton champ "timedate" est bien de type date ou datetime ?

Je n'ai pas forcément tout regardé en détail, mais pourquoi ne pas simplement faire un :
UPDATE annonces SET etat='Nonvalid' WHERE etat='Valid' AND timedate < NOW()
Ca te permet de désactiver d'un coup toutes tes annonces pour lesquelles la date est antérieure à la date du jour...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 418 Messages

25 déc. 2010, 08:30

cela fonctionne bien en égalité donc c pas un problème de format de date ou type de champ (enfin je pense pas)

pour les date j'ai mis simplement du texte, mais je sais pas si ca joue sur ca, sachant que c un format standard a la française (j'aime pas le format us ^^ qui na ni queue ni tête )

avec ce système :
$DeletDate = ucwords(strftime("%d-%m-%Y",mktime(0,0,0,date("m"),date("d")+5,date("Y"))));
je peux travailler sur tous les format de date, donc vu que dans un champ texte on enregistre bien la date, j'ai mis texte, mais si dés fois il faut changer, comment convertir un type de champ dans la BDD sans passer par mysql??

et je vais essayer NOW() mais connaissait pas

bref merci a vous de votre aide

bonnes fêtes à vous

coidalement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 déc. 2010, 13:58

Ben en fait, si, le type du champ a une grande importance :) Que ce soit pour des questions de tri, de comparaison, mais aussi et surtout des fonctions que tu vas pouvoir utiliser.

Pour te donner un exemple simple avec les trois valeurs suivantes : 1, 5, 11
- Si le champ est de type "int", un tri croissant te donnera : 1, 5, 11 (car tri numérique)
- Si le champ est de type "varchar", le tri croissant te donnera : 1, 11, 5 (car tri alphabétique)

Et c'est le problème que tu rencontres avec tes dates quand tu compares des champs de type texte : dans un ordre alphabétique, la chaine '01/01/2011' sera classée avant la chaine '01/12/2010' parce que "alphabétiquement" '01/0' vient avant '01/1'

L'autre avantage d'un champ de type date au lieu de varchar, c'est que tu peux utiliser tout un tas de fonction SQL pour comparer, ajouter ou soustraire des jours, extraire l'année, le jour ou le mois, ... Et la fonction NOW() qui te retourne la date du jour peut être utilisée pour la comparer une date stockée ...

Et une petite remarque en passant, le format US, c'est Mois-Jour-Année, le format de la base est Année-Mois-Jour (qui a l'avantage de supporter les tris alphabétiques).
Tu trouveras des explications détaillées sur les manipulations que tu peux faire avec les dates dans ce sujet de la FAQ :
:arrow: Quelques petites manipulations avec les dates &#40;PHP/MySQL)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 418 Messages

25 déc. 2010, 22:51

Merci à vous

j'ai convertis les champs date, TimeDate et DeletDate en format "date".

Du coup j'ai du refaire mon code pour mettre à jours le format date du style YYYY-mm-dd

Et pour être sur de bien d'invalider les annonces dont la date est arrivée à expiration ainsi que les effacer, j'ai fait comme dit plus haut

WHERE TimeDate<$date, ce qui fait bien, car en fait à compter du premier jours, il ya jour pour jour 35 jours, soir 5 semaines de validité comme souhaité.

Merci beaucoup de votre aide

Bonnes fêtes à tous

Bonne et heureuse année à tous en avance mais ne sait on jamais ^^

Cordialement