IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

pb de requête avec conditions, débutant [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Points : 109
    Points
    109
    Par défaut pb de requête avec conditions, débutant
    BOnjour,

    je m'arrache les cheveux sur qq chose dont la réponse doit êter extra simple, comme d'habitude.
    J'ai une BDD avec pour chaque ligne 5 dates, chacune représentée par une colonne jour, une colonne mois, une colonne année. Quand il n'y a rien, la cellule est NULL
    je souhaite sortir uniquement les lignes qui comprennent au moins une date supérieure à la date du jour. Or ma requête me sort toutes les dates.

    N'ayant pas trop su comment bien l'écrire,je l'ai fractionnée en deux : SOIT mois supérieur au mois de la date OU mois égal au mois de la date et jour supérieur à aujourd'hui

    Voila ce que ca donne avec un exemple copié dans PHPmyadmin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    requête SQL:SELECT count( * ) AS nb_res
    FROM guide, aide_st
    WHERE guide.structure = aide_st.s_clef
    AND s_clef = "189"
    AND (
    (
    mois1 > "11"
    AND annee1 >= "2006"
    )
    OR (
    mois2 > "11"
    AND annee2 > "2006"
    )
    OR (
    mois3 > "11"
    AND annee3 >= "2006"
    )
    OR (
    mois4 > "11"
    AND annee4 >= "2006"
    )
    OR (
    mois5 > "11"
    AND annee5 >= "2006"
    )
    OR (
    jour1 > "29"
    AND mois1 = "11"
    AND annee1 >= "2006"
    )
    OR (
    jour2 > "29"
    AND mois2 = "11"
    AND annee2 >= "2006"
    )
    OR (
    jour3 > "29"
    AND mois3 = "11"
    AND annee3 >= "2006"
    )
    OR (
    jour4 > "29"
    AND mois4 = "11"
    AND annee4 >= "2006"
    )
    OR (
    jour5 > "29"
    AND mois5 = "11"
    AND annee5 >= "2006"
    )
    OR (
    rythme != ""
    )
    )

    et le code donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    {$sql1 .= ' AND s_clef= "'.$_SESSION['s_clef'].'"';
    $sql1 .= ' AND 
    ((mois1 >= "'.$_SESSION['mois'].'" AND annee1 >= "'.$_SESSION['annee'].'" ) 
    OR 
    (mois2 >= "'.$_SESSION['mois'].'" AND annee2 >= "'.$_SESSION['annee'].'" ) OR 
    (mois3 >= "'.$_SESSION['mois'].'" AND annee3 >= "'.$_SESSION['annee'].'" ) OR 
    (mois4 >= "'.$_SESSION['mois'].'" AND annee4 >= "'.$_SESSION['annee'].'" ) OR 
    (mois5 >= "'.$_SESSION['mois'].'" AND annee5 >= "'.$_SESSION['annee'].'" )
     //le jour en plus
    OR (jour1 > "'.$_SESSION['jour'].'" AND mois1 = "'.$_SESSION['mois'].'" AND annee1 >= "'.$_SESSION['annee'].'" ) 
    OR (jour2 > "'.$_SESSION['jour'].'" AND mois2 = "'.$_SESSION['mois'].'" AND annee2 >= "'.$_SESSION['annee'].'" )
    OR (jour3 > "'.$_SESSION['jour'].'" AND mois3 = "'.$_SESSION['mois'].'" AND annee3 >= "'.$_SESSION['annee'].'" )
    OR (jour4 > "'.$_SESSION['jour'].'" AND mois4 = "'.$_SESSION['mois'].'" AND annee4 >= "'.$_SESSION['annee'].'" )
    OR (jour5 > "'.$_SESSION['jour'].'" AND mois5 = "'.$_SESSION['mois'].'" AND annee5 >= "'.$_SESSION['annee'].'" ) OR(rythme != "")) ';
     
    		}
    j'ai pourtant des lignes prises en compte, alors que
    rythme est vide
    jours 1=06
    mois1 = 09
    annee1 = 2006

    les variables de session jour, mois, année sont définies avec {$jour=date("Y-m-d");


    Merci à ceux qui pourront m'aider
    En essayant continuellement on finit par réussir. Donc : plus ca rate, plus on a des chances que ca marche. Shadocks.

    un seul header par page, et pour les autres redirections : echo "<script language='javascript'>window.location.href='XXX.php'</script>";

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Salut,
    Je ne répondrais pas à ta question car y'a rien de pire que d'essayer de comprendre les "bidouilles" d'atruis...
    Je me permet en revanche de te proposer de revoir (dans la mesure du possible) ton system...
    A mon sens, t'es parti sur une très mauvaise base pour le stockage de tes dates en BDD... En effet, il existe 2 façon "propres" de stocker des dates dans une base de donnée :
    le type date et le timestamp (pas celui de SQL, celui de Linux).

    le type date :
    ta date est directement stocké sous la forme AAAA-MM-JJ dans ta base de donnée. La précision est donc de 24h, les enregistrement indéxés dessus se retrouvent naturellement dans l'ordre chronologique et cela permet de faire des tris sur soit sur l'année, le mois et le jour en faisant abstraction des 2 autres composant de la date.

    Le timestamp, ou nombre de seconde écoulé depuis le 1/1/1970 (donc précision à la seconde), stocké sous la forme d'un entier long et particulièrement pratique quand tu dois gérer des interval de temps, d'autant que les fonction PHP native pour gérer ça sont nombreuses et oh combien bien foutu !
    exemple, tu veux recup tous les enregistrement dont la date (stocké en timestamp) est supérieur à la date du jour :
    mysql_query('select * from ma_table where date > '.time());

    tous les enregistrement compris entre le 1/1/1990 a 8h30 et 1/2/1990 a 8h30 et 14 secondes :
    mysql_query('select * from ma_table where date > '.mktime(8,30,0,1,1,1990).' and date < '.mktime(8,30,14,2,1,1990);

    Donc dans la mesure du possible, revois ta table !
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  3. #3
    Membre actif Avatar de frol
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 288
    Points : 296
    Points
    296
    Par défaut
    bonjour
    moi j'ai une question
    un TIMESTAMP comme sous linux dans une base mysql c'est possible?

    sinon une requête sql comme ça il faut directement se dire qu'il y a un problème d'optimisation.
    Si un jour tu dois retravailler ton code tu es mal

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Salut,
    +1 pour gloubi.

    Si tu peux pas faire autrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT * FROM table WHERE TO_DAYS(CONCAT_WS('-', year1, month1, day1)) > TO_DAYS(NOW())";
    Bye

    (oui tu peux stocker un timestamp, dans un champ de type, timestamp, par exemple )
    Vive les roues en pierre

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Citation Envoyé par frol
    bonjour
    moi j'ai une question
    un TIMESTAMP comme sous linux dans une base mysql c'est possible?

    sinon une requête sql comme ça il faut directement se dire qu'il y a un problème d'optimisation.
    Si un jour tu dois retravailler ton code tu es mal
    un timestamp linux EST un entier long, donc tu met int(11) en type de champs et t'as ton timestamp

    EDIT :

    (oui tu peux stocker un timestamp, dans un champ de type, timestamp, par exemple )
    Si je ne m'abuse, pas du tout ! le timestamp SQL est une date formaté d'une façon bizar avec lettre et chiffres... je crois que c'est pas loin d'etre inutilisable ! il faut utiliser un INT(11) !
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  6. #6
    Membre actif Avatar de frol
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 288
    Points : 296
    Points
    296
    Par défaut
    sauf que chez moi les timestamps on cette geule la
    "2006-11-29 18:41:42"

    et le plus génial c'est que ça dépend des versions de mysql donc belles prises de têtes

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    CF mon poste que j'ai édité pendant que tu ecrivais ça Frol

    EDIT : n'oubliez pas, timestamp linux et SQL, c'est pas du tout pareil :p
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  8. #8
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Citation Envoyé par gloubi
    Si je ne m'abuse, pas du tout ! le timestamp SQL est une date formaté d'une façon bizar avec lettre et chiffres... je crois que c'est pas loin d'etre inutilisable ! il faut utiliser un INT(11) !
    Effectivement
    Vive les roues en pierre

  9. #9
    Membre actif Avatar de frol
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 288
    Points : 296
    Points
    296
    Par défaut
    mais avec un int on pert des fonctions sql de gestion de dates non?

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    avec un INT, ça te donne accès aux fonction <, > et = ainsi qu'a tous les opérateur +, -, / et *...

    si tu relis les exemples que je donne, tu vas voir que t'y perd pas au change !
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  11. #11
    Membre actif Avatar de frol
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 288
    Points : 296
    Points
    296
    Par défaut
    en effet oh merci gloubi je viens de gagner un bon bout de temps

  12. #12
    Membre régulier Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Points : 109
    Points
    109
    Par défaut
    merci gloubi, ca m'avait arrété car je n'arrivait pas avec le format date à savoir comment extraire toutes les dates de Novembre par exemple, mais tant qu'à faire, je vais peut être tout remettre au propre.
    En essayant continuellement on finit par réussir. Donc : plus ca rate, plus on a des chances que ca marche. Shadocks.

    un seul header par page, et pour les autres redirections : echo "<script language='javascript'>window.location.href='XXX.php'</script>";

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Je ne peut que t'y encourager
    Tu vas voir, une fois qu'on a gouté aux fonction Timestamp de PHP en plus, on peut plus gérer les dates autrements
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  14. #14
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Je crois que je vais m'y mettre aussi
    Vive les roues en pierre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Requête avec condition
    Par nicofromChina dans le forum SQL
    Réponses: 2
    Dernier message: 27/01/2009, 14h13
  2. [MySQL] Requête avec condition sur un champ
    Par nonhosonno dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/02/2007, 14h00
  3. Requête avec condition
    Par lolo_bob2 dans le forum Access
    Réponses: 1
    Dernier message: 08/06/2006, 19h59
  4. [Requête]Requête avec condition
    Par Miles Raymond dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 23/05/2006, 08h30
  5. Calcul requête avec conditions multiples
    Par Phullbrick dans le forum Access
    Réponses: 7
    Dernier message: 18/04/2006, 13h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo