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 :

Récupérer le mois et l'année d'un champ date pour instruction WHERE [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 35
    Points : 25
    Points
    25
    Par défaut Récupérer le mois et l'année d'un champ date pour instruction WHERE
    Bonjour à tous !

    Je suis en train de réaliser un tableau de suivi des ventes sur MySQL, pour l'affichage des vente du jour aucun soucis (j'utilise current_date).

    Maintenant, je souhaite afficher le nombre de ventes du mois, depuis mon champs date. Voilà mes instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $Myear = date("Y/m");
    $reponsenbrcommandemois = $gbdd->query('
    SELECT COUNT(id_accessoire) AS nbrcommandemois, DATE_FORMAT(date_commande, "%Y/%m")
    FROM produit_commande_accessoire 
    WHERE commande.date_commande = '.$Myear.'');
    $countnbrcommandemois = $reponsenbrcommandemois->fetch();
    $nbrcommandemois = $countnbrcommandemois['nbrcommandemois'];
     
    Vente du mois <?php echo $nbrcommandemois ?><br />
    J'ai bien conscience que l'instruction est mauvaise car çà me retourne 0, mais je ne vois pas trop comment gérer la date par mois de l'année en cours.

    Merci de votre aide !

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Votre requête est fausse car avec une fonction de groupage et une colonne simple (certe formatée mais simple quand même) dans le SELECT, il faudrait un GROUP BY. Mais comme vous avez une restriction sur la date, vous n'avez tout simplement pas besoin de la partie , DATE_FORMAT(date_commande, "%Y/%m").

    En plus, vous indiquez dans le WHERE une table qui n'est pas dans la partie FROM (commande) !

    Enfin, il y a un problème de syntaxe à la fin de la requête !

    Bref, votre requête doit normalement générer des erreurs. Si vous écriviez votre code autrement, vous pourriez vous en rendre compte.

    Plus précisément, quel est votre besoin ?
    Obtenir le comptage pour un mois donné ou pour chaque mois d'une année donnée ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    Oui, c'est fort probable qu'il y est des erreurs, simplement car j'ai garder le principal de l'instruction, j'ai enlever le inner join qui appel justement la table commande ; )

    Quelle faute de syntaxe vois tu ?

    voici le code entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php							
    $Myear = date("Y/m");
    $reponsenbrcommandemois = $gbdd->query('
    SELECT COUNT(produit_commande_accessoire.id_accessoire) AS nbrcommandemois, DATE_FORMAT(commande.date_commande, "%Y/%m"), produit_commande_accessoire.id_commande 
    FROM produit_commande_accessoire 
    INNER JOIN commande 
    ON commande.id_commande = produit_commande_accessoire.id_commande
    WHERE commande.date_commande = '.$Myear.'');
    $countnbrcommandemois = $reponsenbrcommandemois->fetch();
    $nbrcommandemois = $countnbrcommandemois['nbrcommandemois'];
    ?>
    Vente du mois <?php echo $nbrcommandemois ?><br />
    <?php echo $Myear ?>
    Mon objectif est d'obtenir un comptage pour le mois en cours (février ce mois-ci, mars le mois prochain....) depuis un champs DATE

    Par la suite j'adapterai le code pour afficher l'historique des commandes mois par mois et année par année.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Mon objectif est d'obtenir un comptage pour le mois en cours (février ce mois-ci, mars le mois prochain....) depuis un champs DATE
    Comme ça, ce sera mieux :
    Code PHP : 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
    <?php
    $Myear = date("Y/m");
     
    $sql = "
    	SELECT COUNT(produit_commande_accessoire.id_accessoire) AS nbrcommandemois
    	FROM produit_commande_accessoire
    	INNER JOIN commande ON commande.id_commande = produit_commande_accessoire.id_commande
    	WHERE commande.date_commande = '$Myear'
    ";
     
    $reponsenbrcommandemois = $gbdd->query($sql);
    $countnbrcommandemois = $reponsenbrcommandemois->fetch();
    $nbrcommandemois = $countnbrcommandemois['nbrcommandemois'];
    ?>
    Vente du mois <?php echo $nbrcommandemois ?><br />
    <?php echo $Myear ?>
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    Oui çà peux paraître un peu plus propre de cette manière, merci.

    Pour ce qui est de l'affichage de la réponse, çà bloque toujours, je pense que c'est à cause du champs DATE qui me renvoie un format YYYY-MM-JJ, pour le coup, j'ai essayer de le formater date_commande en YYYY-MM avec DATE_FORMAT mais sans succès...
    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
    <?php
    $Myear = date("Y-m");
     
    $sql = "
    	SELECT COUNT(produit_commande_accessoire.id_accessoire) AS nbrcommandemois, DATE_FORMAT(commande.date_commande, "%Y-%m")
    	FROM produit_commande_accessoire
    	INNER JOIN commande ON commande.id_commande = produit_commande_accessoire.id_commande
    	WHERE commande.date_commande = '$Myear'
    ";
     
    $reponsenbrcommandemois = $gbdd->query($sql);
    $countnbrcommandemois = $reponsenbrcommandemois->fetch();
    $nbrcommandemois = $countnbrcommandemois['nbrcommandemois'];
    ?>
    Vente du mois <?php echo $nbrcommandemois ?><br />
    <?php echo $Myear ?>

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonsoir,

    c'est normal tu ouvre les doubles quotes ("") pour indiquer le format de ta date mais vue que pour construire ta requête tu utilise les doubles quotes ta construction de requête est fausse,

    replace $sql par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = '
    	SELECT COUNT(produit_commande_accessoire.id_accessoire) AS nbrcommandemois, DATE_FORMAT(commande.date_commande, "%Y-%m")
    	FROM produit_commande_accessoire
    	INNER JOIN commande ON commande.id_commande = produit_commande_accessoire.id_commande
    	WHERE commande.date_commande = \'' . $Myear . '\' ';
    J'ai remplacer les doubles quotes par des simple '', par contre PHP n’interprète pas ce qui se trouve entre simple quote,

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $toto = 'je suis toto';
    echo "$toto"; //Affichera je suis toto qui est la valeur de la variable $toto
     
    echo '$toto'; //Affichera $toto en tant que chaine de caractère et non sa valeur
    Seulement dans ta requête tu a besoin des caractère '' pour entourer ta chaîne de caractère $Myear sinon ta requête tombe en echec car ta date sera interpréter comme étant une colonne par MySQL,

    pour ne pas tomber dans la même erreur qu'avant il faut échapper les '' qui seront utilisé par MySQL avec le caractère \.
    une réponse vous a permis d'avancer ?

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu n'as pas besoin d'avoir la date de le SELECT étant donné que tu la connais d'avance puisque c'est ton critère.
    Par contre si tu veux comparer ta date à Y-m il faut la formater en Y-m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = '
    	SELECT COUNT(produit_commande_accessoire.id_accessoire) AS nbrcommandemois
    	FROM produit_commande_accessoire
    	INNER JOIN commande ON commande.id_commande = produit_commande_accessoire.id_commande
    	WHERE DATE_FORMAT(commande.date_commande, "%Y-%m") = "' . $Myear . '"';
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    En SQL, les valeurs textuelles s'entourent d'apostrophes, pas de guillemets !

    La bonne manière de faire était donc celle que j'avais donnée dans ma requête, au formatage de la colonne de date près :
    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
    <?php
    $Myear = date("Y/m");
     
    $sql = "
    	SELECT COUNT(produit_commande_accessoire.id_accessoire) AS nbrcommandemois
    	FROM produit_commande_accessoire
    	INNER JOIN commande ON commande.id_commande = produit_commande_accessoire.id_commande
    	WHERE DATE_FORMAT(commande.date_commande, '%Y-%m') = '$Myear'
    ";
     
    $reponsenbrcommandemois = $gbdd->query($sql);
    $countnbrcommandemois = $reponsenbrcommandemois->fetch();
    $nbrcommandemois = $countnbrcommandemois['nbrcommandemois'];
    ?>
    Vente du mois <?php echo $nbrcommandemois ?><br />
    <?php echo $Myear ?>
    Si on veut vraiment isoler la variable PHP du code SQL, on peut aussi faire comme ça :
    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
    <?php
    $Myear = date("Y/m");
     
    $sql = "
    	SELECT COUNT(produit_commande_accessoire.id_accessoire) AS nbrcommandemois
    	FROM produit_commande_accessoire
    	INNER JOIN commande ON commande.id_commande = produit_commande_accessoire.id_commande
    	WHERE DATE_FORMAT(commande.date_commande, '%Y-%m') = '".$Myear."'
    ";
     
    $reponsenbrcommandemois = $gbdd->query($sql);
    $countnbrcommandemois = $reponsenbrcommandemois->fetch();
    $nbrcommandemois = $countnbrcommandemois['nbrcommandemois'];
    ?>
    Vente du mois <?php echo $nbrcommandemois ?><br />
    <?php echo $Myear ?>
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    En SQL, les valeurs textuelles s'entourent d'apostrophes, pas de guillemets !
    La syntaxe Mysql permet les deux sans préférence.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    Merci énormement à vous trois !
    J'ai passé deux semaine à bouffer du code, faut croire que j'arrivais à saturation, ce n'est pas du tout ma compétences de bases l'informatique !

    Je m'obstinais à formater le champs date dans le select.... -_-'

    L'instruction est beaucoup plus logique comme çà, merci encore !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php							
    $Myear = date("Y-m");
    $reponsenbrcommandemois = $gbdd->query('
    SELECT COUNT(produit_commande_accessoire.id_accessoire) AS nbrcommandemois
    FROM produit_commande_accessoire 
    INNER JOIN commande 
    ON commande.id_commande = produit_commande_accessoire.id_commande
    WHERE DATE_FORMAT(commande.date_commande, "%Y-%m") =  \'' . $Myear . '\' ');
    $countnbrcommandemois = $reponsenbrcommandemois->fetch();
    $nbrcommandemois = $countnbrcommandemois['nbrcommandemois'];
    ?>
    Vente du mois <?php echo $nbrcommandemois ?><br />

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE DATE_FORMAT(commande.date_commande, "%Y-%m") =  \'' . $Myear . '\' ');
    Têtu hein ?

    Franchement, tu trouves ça plus lisible que ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE DATE_FORMAT(commande.date_commande, '%Y-%m') = '".$Myear."'
    Ou que ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE DATE_FORMAT(commande.date_commande, '%Y-%m') = '$Myear'
    Le jour où tu oublieras un échappement d'apostrophe ou de guillemet et que tu passeras des heures à chercher pourquoi ta requête ne fonctionne pas, tu te souviendras peut-être de mon message !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #12
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut
    Ventes du mois :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $t = 'SELECT COUNT(p.id_accessoire) nbrcommandemois 
          FROM produit_commande_accessoire p, commande c 
          WHERE c.id_commande = p.id_commande AND DATE_FORMAT(c.date_commande, "%Y-%m") = DATE_FORMAT(NOW(), "%Y-%m")';

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

Discussions similaires

  1. Récupérer le mois et l'année d'une chaine de caractere donnée
    Par parano dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 07/12/2009, 16h04
  2. Récupérer le mois et l'année en même temps et GROUP BY
    Par Chacha35 dans le forum Développement
    Réponses: 5
    Dernier message: 10/11/2009, 16h32
  3. Réponses: 2
    Dernier message: 13/10/2008, 14h37
  4. problème pour récupérer le mois et l'année dans ma requête SQL
    Par rob2-9 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 10/08/2006, 14h45
  5. Récupérer le mois et l'année d'une date
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 09h17

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