[resolu] [php] (...)enregistrements avec date - Enfin résolu ;)

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:

Merci d’avance :super: (##### :miam: )

Je pense que les fonctions date de mysql sont à privilégier.

http://dev.mysql.com/doc/refman/4.1/en/dat…-functions.html

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 :confused:

ça permet de changer le staut lorsque la date qui est enregistrée est passée :wink:

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 :wink: (y’a ptetre plus simple :p)

en espérant que ce soit plus clair :wink:

Je me permets de faire un UP car c’est assez important :wink:

Merci :super:

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);

essaye :neutre:

merci benj :wink:

alors j’ai essayé cela :

SQL
[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 ?

p-ê en enlevant les ’ de date_open

Je viens d’essayer et ça ne marche pas non plus :confused: aucun enregistrement ne m’est retourné

Je vois vraiment pas là…

[edit] je pense pas que ça joue beaucoup là dessus, mais je précise que la date est enregistrée au format YYYY-MM-DD dans un champ type varchar :wink:

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 :

plus je ne peux pas faire pour toi :neutre:

bye :hello:

quelle bonne idée :sarcastic:

:confused:

ALLEZ lache un coup d’alter table …

http://mysql.org/doc/refman/5.1/en/alter-table.html

par exemple sur une table standard :

on insère quelques dates :

et on change le type de fluflu:

et après datediff devrait fonctionner :wink:

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 :wink:
merci de ton aide :wink:

dans phpMyadmin j’ai naturellement essayé avec 2006-12-15 :na:

:smiley:

[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:

Tu peux changer tes champs en entier (base retournée par time()) ce qui facilite les tests…

genre

  1. ajout d’un champ t2, type INT UNSIGNED
  2. UPDATE table SET t2 = UNIX_TIMESTAMP(date_…)
  3. suppression champ date_…
  4. renommage de t2 en date_…

Et tu compare avec des entiers (= maths primaire, que même moi je sais faire!)

Ca sera plus pratique surtout si tu fais mumuse avec la fonction time() de php.

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:

alors je UP, là jsais plus trop quoi faire :riva:

merci d’avance :super:

J’ai pas tout compris ce que tu veux faire, expliques plus simplement stp ou dis moi si j’ai bien compris :

Tu a une date au format YYYY-MM-DD dans ta Base, et tu veux simplement comparer cette date avec la date du jour (ou une date particulière) c’est ça ?

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 :wink: !

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 :wink:

En espérant que vous aillez mieux compris :wink:

Messieurs, merci d’avance :super:

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.

C’est bon, problème résolut via MSN, il suffisait simplement d’utiliser la requete SQL suivante :

mysql_query("UPDATE matable SET statut='1' WHERE statut='0' AND date_open<='".date('Y-m-d')."'") or die(mysql_error());