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

Langage PHP Discussion :

fonction sprintf avec PDO ? [PHP 5.5]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut fonction sprintf avec PDO ?
    Bonjour,

    Voici ma BDD mySql :
    id..+...whenDate ..+...howPrice+
    1 ...|...2007-04-14 ...|...125
    2 ...|...2007-06-16 ...|...16
    3 ...|...2008-10-18 ...|...15
    4 ...|...2008-10-24 ...|...13
    5 ...|...2008-12-22 ...|...125
    6 ...|...2009-07-09 ...|...238
    7 ...|...2009-07-26 ...|...234
    8 ...|...2009-10-01 ...|...317
    9 ...|...2009-10-03 ...|...430
    10..|...2009-12-13 ...|...43
    11..|...2009-12-14 ...|...52
    12..|...2010-01-04 ...|...63
    13..|...2010-01-22 ...|...749
    +...|........................|.........+

    J'aimerais bien afficher les chiffres d'affaires de chaque année, sous un tableau (array)

    Il faut donc grouper les années où il y a eu les ventes
    Ensuite, il faut regrouper les ventes par chaque mois de la même année

    Voici ce que je veux obtenir :

    array (size=4)
    2007 =>
    array (size=12)
    0 => int 0
    1 => int 0
    2 => int 0
    3 => string '125' (length=3)
    4 => int 0
    5 => string '16' (length=2)
    6 => int 0
    7 => int 0
    8 => int 0
    9 => int 0
    10 => int 0
    11 => int 0
    2008 =>
    array (size=12)
    0 => int 0
    1 => int 0
    2 => int 0
    3 => int 0
    4 => int 0
    5 => int 0
    6 => int 0
    7 => int 0
    8 => int 0
    9 => string '28' (length=2)
    10 => int 0
    11 => string '125' (length=3)
    2009 =>
    array (size=12)
    0 => int 0
    1 => int 0
    2 => int 0
    3 => int 0
    4 => int 0
    5 => int 0
    6 => string '472' (length=3)
    7 => int 0
    8 => int 0
    9 => string '747' (length=3)
    10 => int 0
    11 => string '95' (length=2)
    2010 =>
    array (size=12)
    0 => string '812' (length=3)
    1 => int 0
    2 => int 0
    3 => int 0
    4 => int 0
    5 => int 0
    6 => int 0
    7 => int 0
    8 => int 0
    9 => int 0
    10 => int 0
    11 => int 0


    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE YEAR(' . $champ_date . ') IS NOT NULL
    J'obtiens pour chaque année :
    array (size=4)
    2007 =>
    array (size=12)
    0 => string '812' (length=3)
    1 => int 0
    2 => int 0
    3 => string '125' (length=3)
    4 => int 0
    5 => string '16' (length=2)
    6 => string '472' (length=3)
    7 => int 0
    8 => int 0
    9 => string '775' (length=3)
    10 => int 0
    11 => string '220' (length=3)
    2008 =>
    array (size=12)
    0 => string '812' (length=3)
    1 => int 0
    2 => int 0
    3 => string '125' (length=3)
    4 => int 0
    5 => string '16' (length=2)
    6 => string '472' (length=3)
    7 => int 0
    8 => int 0
    9 => string '775' (length=3)
    10 => int 0
    11 => string '220' (length=3)

    etc...
    Donc en fait, c'est la totale de même mois de toutes les années.

    Alors je pense d'utiliser :%s
    Alors je fais ma requête comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE YEAR(' . $champ_date . ') = %s
    mais j'ai le message d'erreur suivant :
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 [ligne 24 voir plus bas]
    Du coûp, je mets la fonction : sprintf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req_ventes_mois->execute(sprintf($req_ventes_mois, $donnees_annees['an']));
    Évidement, cette fois-ci j'ai une autre erreur (puisque je veux transformer mon objet en string):
    Catchable fatal error: Object of class PDOStatement could not be converted to string in [ligne 43 voir plus bas]

    Donc du coup je ne sais plus comment je peux obtenir ce que je veux.

    Voici mes codes en totalité :
    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
    try
    {
    	$bdd = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }
    catch (Exception $e)
    {
            die('Erreur connection mysql : ' . $e->getMessage());
    }
     
    // trouver les années actives
    $req_annees = $bdd->prepare(	'SELECT 
    									YEAR(' . $champ_date . ') AS an
    							  	FROM '. $tableData . ' 
    							  	GROUP BY an');
     
     
    // trouver les ventes pour chaque année active
    // %s – l'argument est traité et présenté comme une chaîne de caractères.
    $req_ventes_mois = $bdd->prepare('SELECT 
    											MONTH(' . $champ_date . ') AS parMois,
    											COUNT(' . $champ_id . ') AS combienVente,
    											SUM(' . $champ_prix . ') AS prixCout 
    									  FROM '. $tableData . ' 
    									  WHERE YEAR(' . $champ_date . ') = %s  -- WHERE YEAR(' . $champ_date . ') IS NOT NULL
    									  GROUP BY parMois');
     
     
     
     
    $req_annees->execute();
     
     
     
    // années actives
    while ($donnees_annees = $req_annees->fetch(PDO::FETCH_ASSOC))
    {
    	// Initialiser le array pour chaque mois 
    	$arrayPrixCoutAns[$donnees_annees['an']] = array(0,0,0,0,0,0,0,0,0,0,0,0); 
     
    	// trouver les ventes par mois de l'année en cours
    	//$req_ventes_mois->execute();
    	//$req_ventes_mois->execute(sprintf($req_ventes_mois, $donnees_annees['an']));
    	$req_ventes_mois->execute(vsprintf($req_ventes_mois, $donnees_annees['an']));
     
    	while ($donnees_mois = $req_ventes_mois->fetch(PDO::FETCH_ASSOC))
    	{
    		$arrayPrixCoutAns[$donnees_annees['an']][$donnees_mois['parMois']-1] = $donnees_mois['prixCout']; 
    	}
    }
     
    die(var_dump($arrayPrixCoutAns));
    Est-ce que vous pouvez m'aider ?

    Merci

  2. #2
    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
    Par défaut
    Il manque simplement l'année dans ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $req_ventes_mois = $bdd->prepare('SELECT 
    									YEAR(' . $champ_date . ') AS parAn,
    									MONTH(' . $champ_date . ') AS parMois,
    									COUNT(' . $champ_id . ') AS combienVente,
    									SUM(' . $champ_prix . ') AS prixCout 
    									FROM '. $tableData . ' 
    									GROUP BY parAn, parMois');
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    Merci Sabotage,

    J'ai ajouté YEAR/parAn mais cela ne change pas le résultat.

    Citation Envoyé par sabotage Voir le message
    Il manque simplement l'année dans ta requête :
    J'ai encore obtenu la totale de même mois de toutes les années :

    array (size=4)
    2007 =>
    array (size=12)
    0 => string '812' (length=3)
    1 => int 0
    2 => int 0
    3 => string '125' (length=3)
    4 => int 0
    5 => string '16' (length=2)
    6 => string '472' (length=3)
    7 => int 0
    8 => int 0
    9 => string '747' (length=3)
    10 => int 0
    11 => string '95' (length=2)
    2008 =>
    array (size=12)
    0 => string '812' (length=3)
    1 => int 0
    2 => int 0
    3 => string '125' (length=3)
    4 => int 0
    5 => string '16' (length=2)
    6 => string '472' (length=3)
    7 => int 0
    8 => int 0
    9 => string '747' (length=3)
    10 => int 0
    11 => string '95' (length=2)
    2009 =>
    array (size=12)
    0 => string '812' (length=3)
    1 => int 0
    2 => int 0
    3 => string '125' (length=3)
    4 => int 0
    5 => string '16' (length=2)
    6 => string '472' (length=3)
    7 => int 0
    8 => int 0
    9 => string '747' (length=3)
    10 => int 0
    11 => string '95' (length=2)
    2010 =>
    array (size=12)
    0 => string '812' (length=3)
    1 => int 0
    2 => int 0
    3 => string '125' (length=3)
    4 => int 0
    5 => string '16' (length=2)
    6 => string '472' (length=3)
    7 => int 0
    8 => int 0
    9 => string '747' (length=3)
    10 => int 0
    11 => string '95' (length=2)


    et voici ce que je fais :

    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
    $req_ventes_mois = $bdd->prepare('SELECT 
    											YEAR(' . $champ_date . ') AS parAn,
    											MONTH(' . $champ_date . ') AS parMois,
    											COUNT(' . $champ_id . ') AS combienVente,
    											SUM(' . $champ_prix . ') AS prixCout 
    									  FROM '. $tableData . ' 
    									  -- WHERE YEAR(' . $champ_date . ') = %s  -- WHERE YEAR(' . $champ_date . ') IS NOT NULL
    									  GROUP BY parAn, parMois');
     
     
     
    $req_annees->execute();
     
     
     
    // années actives
    while ($donnees_annees = $req_annees->fetch(PDO::FETCH_ASSOC))
    {
    	// Initialiser le array pour chaque mois 
    	$arrayPrixCoutAns[$donnees_annees['an']] = array(0,0,0,0,0,0,0,0,0,0,0,0); 
     
    	// trouver les ventes par mois de l'année en cours
    	$req_ventes_mois->execute();
    	//$req_ventes_mois->execute(sprintf($req_ventes_mois, $donnees_annees['an']));
    	//$req_ventes_mois->execute(vsprintf($req_ventes_mois, $donnees_annees['an']));
     
    	while ($donnees_mois = $req_ventes_mois->fetch(PDO::FETCH_ASSOC))
    	{
    		$arrayPrixCoutAns[$donnees_annees['an']][$donnees_mois['parMois']-1] = $donnees_mois['prixCout']; 
    	}
    }
     
    die(var_dump($arrayPrixCoutAns));

  4. #4
    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
    Par défaut
    Plus simplement :
    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
    <?php
    $sth = $bdd->query('SELECT 
    		YEAR(' . $champ_date . ') AS annee,
    		MONTH(' . $champ_date . ') AS mois,
    		COUNT(' . $champ_id . ') AS combien_vente,
    		SUM(' . $champ_prix . ') AS prix_cout 
    		FROM '. $tableData . ' 
    		GROUP BY parAn, parMois');
     
    // on met les données existantes dans un tableau
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
    	$data[$row['annee']][$row['mois']] = array('prix_cout'=>$row['prix_cout']);
    }
     
    // si tu veux vraiment compléter avec des zéros pour les valeurs non renseignées :
    foreach ($data as $annee=>$values_mois) {
    	for ($mois = 1, $mois < 13; $mois++) {
    		if (!isset($data[$annee][$mois])) {
    			$data[$annee][$mois]['prix_cout'] = 0;	
    		}
    	}
    }
    Au passage, tu n'as pas besoin de faire une préparation pour toutes les requêtes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    Merci Sabotage,

    J'ai rectifié un peu ton code pour appliquer dans mon contexte :
    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
    $sth = $bdd->query('SELECT 
    		YEAR(' . $champ_date . ') AS annee,
    		MONTH(' . $champ_date . ') AS mois,
    		COUNT(' . $champ_id . ') AS combien_vente,
    		SUM(' . $champ_prix . ') AS prix_cout 
    		FROM '. $tableData . ' 
    		GROUP BY annee, mois');
     
     
     
    //$sth->execute();		
     
    	// on met les données existantes dans un tableau
    while ($row = $sth->fetch(PDO::FETCH_ASSOC)) 
    {
    	//$data[$row['annee']][$row['mois']] = array('prix_cout'=>$row['prix_cout']);
    	$data[$row['annee']][$row['mois']] = $row['prix_cout'];
    }
     
     
    // si tu veux vraiment compléter avec des zéros pour les valeurs non renseignées :
    foreach ($data as $annee=>$values_mois) 
    {
    	for ($mois = 1; $mois < 13; $mois++) 
    	{
    		if (!isset($data[$annee][$mois])) 
    		{
    			//$data[$annee][$mois]['prix_cout'] = 0;	
    			$data[$annee][$mois] = 0;	
    		}
    	}
    }	
     
    die(var_dump($data));
    array (size=4)
    2007 =>
    array (size=12)
    4 => string '125' (length=3)
    6 => string '16' (length=2)
    1 => int 0
    2 => int 0
    3 => int 0
    5 => int 0
    7 => int 0
    8 => int 0
    9 => int 0
    10 => int 0
    11 => int 0
    12 => int 0
    2008 =>
    array (size=12)
    10 => string '28' (length=2)
    12 => string '125' (length=3)
    1 => int 0
    2 => int 0
    3 => int 0
    4 => int 0
    5 => int 0
    6 => int 0
    7 => int 0
    8 => int 0
    9 => int 0
    11 => int 0
    2009 =>
    array (size=12)
    7 => string '472' (length=3)
    10 => string '747' (length=3)
    12 => string '95' (length=2)
    1 => int 0
    2 => int 0
    3 => int 0
    4 => int 0
    5 => int 0
    6 => int 0
    8 => int 0
    9 => int 0
    11 => int 0
    2010 =>
    array (size=12)
    1 => string '812' (length=3)
    2 => int 0
    3 => int 0
    4 => int 0
    5 => int 0
    6 => int 0
    7 => int 0
    8 => int 0
    9 => int 0
    10 => int 0
    11 => int 0
    12 => int 0


    C'est presque ce que je voulais, un grand merci,


    Comment puis-je faire pour que cela commence à partir de zéro ?
    Comment je peux mettre en ordre selon le mois :
    0 c'est pour 1er mois [2000-01-00](donc janvier)
    1 c'est pour 2e mois [2000-02-00](donc février)

    bonne soirée

  6. #6
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    Citation Envoyé par tonton.odilon Voir le message
    Merci Sabotage,


    Comment puis-je faire pour que cela commence à partir de zéro ?
    Comment je peux mettre en ordre selon le mois :
    0 c'est pour 1er mois [2000-01-00](donc janvier)
    1 c'est pour 2e mois [2000-02-00](donc février)

    bonne soirée
    J'ai trouvé la réponse de la 1er question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($mois = 0; $mois < 12; $mois++)
    Donc cela commence par 0 (zéro)

    alors
    Comment je peux mettre en ordre selon le mois :
    0 c'est pour 1er mois [2000-01-00](donc janvier)
    1 c'est pour 2e mois [2000-02-00](donc février)

    bonne soirée

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

Discussions similaires

  1. [PostgreSQL] PDO et fonction postgresql avec curseur
    Par thecanea dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 07/10/2011, 13h48
  2. [PDO] fonction date du jour avec pdo
    Par chris0938 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/07/2010, 15h27
  3. probleme avec fonction sprintf
    Par sousoi dans le forum C
    Réponses: 8
    Dernier message: 30/06/2010, 22h06
  4. Majorer avec la fonction sprintf
    Par hicham285 dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2008, 18h39
  5. Réponses: 1
    Dernier message: 15/12/2006, 14h53

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