bon, suite a mon intrusion dans le topic de prog, revoici ma question :
j’ai une requete SQL
$sql2 = mysql_query("SELECT id,date,statut FROM matable WHERE statut=0") or die(mysql_error());
$result2 = mysql_fetch_array($sql2);
je veux chercher dans le résultat de cette requete, tous les enregistrement dont
$result2[‘date’] est passée par rappot à l’instant d’exécution de la dite requête.
la date est enregistrée dans la base de données au format AAAA-MM-JJ.
Normalement il ne doit retourner qu’un seul enregistrement, puisque dès qu’une date est passée, je la récupère par le biais du système qui fait l’objet de ce topic, et l’id de l’enregistrement est envoyé a une autre requete qui va modifier statut=0 en staut=1. Du coup, sauf en cas de dates doublons, il ne devrait y avoir qu’un seul enregistrement retourné.
Voilà, si besoin de plus d’infos faites moi signe, en espérant que quelqu’un arrive enfin a m’aider, parce que là… :pt1cable:
On en a causé hier soir sur MSN, mais je comprends toujours pas très bien ce que ca sert à faire, sans bonne compréhension du besoin, difficile d’y répondre
ça permet de changer le staut lorsque la date qui est enregistrée est passée
j’explique vite fait mon script :
on considère $datedujour = time();
d’abord une requete va récupérer tous les enregistrements qui ont statut = 1 (normalement il n’y en a qu’un).
Ensuite, un script de comparaison convertis d’abord les dates, enregistrées au format YYYY-MM-DD, en format unix avec cette fonction :
$date1 = @strtotime($result[‘date1’]);
puis :
si $datedujour < $date1, on affiche telle page
si $datedujour > $date1 mais $datedujour < $date2, on affiche une autre page
pour finir si $datedujour > $date2, on affiche une page encore différente.
maintenant, si cette requete ne retourne aucun résultat, on vérifie les enregistrement avec statut = 0,
dans les résultats, on sort l’id de (normalement) l’unique enregistrement où $date1 <= $datedujour
donc il faut sortir les dates du résultat, les convertir avec strtotime, et les comparer, pour ensuite récupérer l’id, id que je prends pour modifier son statut en 1 avec une autre requête.
en fait c’est pour passer automatiquement le statut à 1 lorsque $date1 est atteinte (y’a ptetre plus simple :p)
fais ce que startide t’as dit, utilise les fonctions faites pour cela.
coup de main :
$sql2 = mysql_query("SELECT id,date,statut FROM matable WHERE statut=0 AND DATEDIFF(date,".date("Y/m/d").")>0 or die(mysql_error());
$result2 = mysql_fetch_array($sql2);
[color=blue;font-weight:bold]SELECT[/color] id,date_open,statut FROM matable WHERE statut=0 AND DATEDIFF(date_open,".date("Y-m-d", time()).")>0 LIMIT 1
et y’a un bug ça ne fonctionne pas. J’ai lancé la commande dans PHPMyAdmin, il me retourne cette erreur :
[edit] bon j’ai essayé comme ceci :
SQL
$nowd = date("Y-m-d",time());
$sql2 = mysql_query(“SELECT id,date_open,statut FROM matable WHERE statut=0 AND DATEDIFF(‘date_open’,’”.$nowd."’)>=0") or die(mysql_error());
$result2 = mysql_fetch_array($sql2);
sauf que ça marche toujours pas :riva:
cette fois plus d’erreur de synthaxe, mais il ne me retourne aucun enregistrement, même dans PHPmyadmin, pourtant j’ai un enregistrement avec 2006-12-12 :neutre:
quelqu’un a une idée ?
mais tu ne peux pas essayer dans phpmyadmin car date(\“Y-m-d\”, time()); c’est du php et pas du sql :nexath (besoin de te rafraichir la mémoire sur le fonctionnement de php ?)
j’ai essayé :
alors la fonction pour créer la date fonctionne.
maintenant côté SQL il faut effectivement mettre les simples cotes :
j’avais justement pensé a changer mon champ en date, mais je crains qu’il n’accepte plus mes enregistrements après… j’essaye et je te dis ce qu’il en est
merci de ton aide
dans phpMyadmin j’ai naturellement essayé avec 2006-12-15 :na:
[edit] j’ai changé mes champs en date, toujours aucun signe d’enregistrement :pt1cable:
j’essaye plus en détails cet après-midi, mais si quelqu’un a des remarques…
n’hésitez pas :super:
y’a pas un moyen de conserver ce qui existe déja ? parce que ça me ferais refaire tous mes scripts dont celui qui enregistre les dates et ceux qui comparent…
ou alors c’est que j’ai pas compris :heink:
Bon j’ai modifié le type de base de données en date, toujours aucun résultat.
je sens le truc qu’il va faloir mettre toutes mes dates en format unix, et changer tous mes scripts… :sweet:
Si c’est ce que je crois avoir compris c’est tout simple :
D’un change ta requete comme ça :
$sql2 = mysql_query("SELECT id,DATE_FORMAT(date, '%d') as day,DATE_FORMAT(date, '%m') as month,DATE_FORMAT(date, '%Y') as year,statut FROM matable WHERE statut='0'") or die(mysql_error());
$result2 = mysql_fetch_assoc($sql2);
Après ton fichier php qui vérifies les enregistrements dont $result2[‘date’] est passée :
if(mktime('0','0','0',$result2['month'],$result2['day'],$result2['year'])>=mktime('0','0','0',date("m"),date("d"),date("Y")))
{
echo 'l\'enregistrement est supérieur à la date actuelle de la requete';
}
Si c’est bien de ce code que tu as besoin, je suis sur qu’il marche à 100% car je m’en suis déjà servie sur un site, si parcontre ce que je viens de te donner marche pas, montres les erreurs que je corriges mes possibles erreurs.
Si c’est pas le bon code, re-explique stp car j’ai pas tout compris, voilà, bonen soirée !
Au passage, quand c’est en date, je crois qu’il fait une conversion implicite en entier, et que derrière l’opérateur < fonctionne d’une manière naturelle.
je crois que j’ai embrouillé tout le monde là… :ane:
je vais expliquer plus simplement mon problème…
donc voilà, j’ai une table, avec des champs. Ceux qui m’intéressent là sont id (INT (3)), date_open (VARCHAR (10)), et statut (INT (1)).
Lorsque j’enregistre une information, la date du champ date_open est future, et le statut est à 0. Le format de la date est YYYY-MM-DD.
Maintenant, le problème. Je souhaiterais que lorsque j’exécute mon script, il bascule automatiquement le statut à 1 lorsque la date enregistrée est atteinte.
Peu importe la manière, le format de date ne doit pas etre modifié dans la table
ben fais ce que je t’ai dit avec un type correct pour tes dates déjà et après on verra.
il n’y a strictement pas de raison pour laquelle cela ne marcherait pas.