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 :

Incrémenter un where dans plusieurs requêtes successives [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 25
    Par défaut Incrémenter un where dans plusieurs requêtes successives
    Bonjour,

    A l'aide d'une requête je dois remplir un tableau en HTML avec en colonne tous les mois de l'année et en ligne des paramètres.

    Par exemple pour le premier paramètre au mois de janvier, j'ai cette requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $req="SELECT moox as indice
    FROM chiffre
    INNER JOIN station ON code_station_cg = nom_point
    WHERE X='".$_GET['x']."' AND Y='".$_GET['y']."' AND annee='".$annee."' AND mois='1'";
    $res_requete=mysql_query($req,$base);
    $res = mysql_fetch_array($res_requete);
    echo $res['indice'];
    Pour le mois de février j'aurai mois='2', en mars mois='3' etc...

    Les requêtes fonctionnent bien mais sachant que j'ai 8 paramètres différents j'aimerai éviter de faire un fichier php avec 8X12 = 96 requêtes qui ne varient finalement que très peu.

    D'autant plus que je dois écrire un peu de code HTML avec chaque requête.

    Il faudrait sûrement faire une boucle avec incrémentation du where dans plusieurs requêtes successives (la valeur du select ne change quant à elle que tous les 12 mois, ce qui complique un peu plus la chose). bref j'ai un peu de mal à conceptualiser comment je pourrai faire.

    Est-ce possible déjà ?

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 815
    Billets dans le blog
    14
    Par défaut
    Récupère tout en une seule requête et parcoure le résultat de la requête en PHP pour constituer ton tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $req = "
    	SELECT moox as indice, mois
    	FROM chiffre
    	INNER JOIN station ON code_station_cg = nom_point
    	WHERE X = '".mysql_real_escape_string($_GET['x'])."'
    		AND Y ='".mysql_real_escape_string($_GET['y'])."'
    		AND annee ='".$annee."'
    ";
    $res_requete = mysql_query($req,$base);
    while ($row = mysql_fetch_array($res_requete))
    {
    	$data["{$row['mois']}"]['indice'] = $row['indice'];
    }
    La requête donne un indice par mois mais que sont tes paramètres ? X et Y ?

    Au passage :
    - aère et indente ton code comme je l'ai fait ci-dessus ; il sera plus facile à lire et à déboguer ;
    - ne fait jamais confiance au contenu de $_GET ; utilise mysql_real_escape_string ou intval pour être sûr d'avoir la donnée du type requis sans injection d'un morceau de requête qui peut pirater tes données, ou passe à PDO.
    -
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 25
    Par défaut
    Arf, ta réponse me fait découvrir un autre problème: je dois afficher obligatoirement tous les mois de l'année, alors qu'en base j'ai uniquement ceux qui contiennent des résultats. Or certaines années j'ai seulement des résultats pour les mois 3,6,7,8,9 et 11. Du coup il faudrait également que j'arrive à programmer l'affichage des mois où je n'ai rien (ça peut sembler bizarre mais mon tableau HTMl doit aussi montrer là où il n'y a pas de résultats).

    Mes paramètres X et y sont des coordonnées géographiques, elles me servent à récupérer d'autres infos, j'aurai pu ne pas les mettre dans l'exemple pour simplifier vu qu'elles n'impactent pas mon pb.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 815
    Billets dans le blog
    14
    Par défaut
    Pour avoir tous les mois :
    - soit tu crées une table des mois et tu fais une jointure externe à partir de celle-ci ;
    - soit tu crées un tableau PHP des mois que tu parcours pour afficher les résultats.

    Ceci fait, tu n'auras toujours qu'une seule ligne de résultats dans ton tableau. Quels sont les différents paramètres qu'il faut afficher sur les différentes lignes ?
    Indice en est un ? Les autres sont d'autres colonnes de la table ? D'autres tables ?

    Autant que possible, récupère tous les résultats voulus en une seule requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Membre averti
    Inscrit en
    Décembre 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 25
    Par défaut
    Les autres paramètres sont d'autres colonnes de la table. Je les ai appelé dans la requête pour tout récupérer dans la même. Indice n'est pas un paramètre, c'est juste le nom du paramètre sélectionné que j'appelle comme ça pour ne pas avoir à les appeler différemment lors de l'écriture des résultats.

    J'ai créé un tableau des mois en PHP, ainsi qu'un tableau des paramètres. Je les parcours sous la forme de deux boucles for imbriquées pour que la requête passe en revue tous les mois pour un paramètre, puis à nouveau tous les mois pour un second paramètre, etc...

    Au final ça donne ça (j'ai légèrement simplifié la requête pour qu'elle soit plus compréhensible aux novices comme moi):

    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
    $param = array ('moox', 'azote', 'nitrate');
     
    		for ($num = 0; $num < 3; $num++) {
     
    			echo "<tr><th>".$param[$num]."</th>";
     
    			$mois = array ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12');
     
    			for ($numero = 0; $numero < 12; $numero++) {
     
    				$req="SELECT ".$param[$num]." as indice
    					 FROM chiffre
    					 INNER JOIN station ON code_station_CG = nom_point
    					 WHERE X='".mysql_real_escape_string($_GET['x'])."' 
                                             AND Y='".mysql_real_escape_string($_GET['y'])."' 
                                             AND annee='".$annee."' 
                                             AND mois='".$mois[$numero]."'";
     
    				$res_requete=mysql_query($req,$base);
    				$res = mysql_fetch_array($res_requete);
     
    				if ($res['indice']>0) echo "<td>".$res['indice']."</td>";
    				else echo "<td>rien</td>";
     
    			}
     
    			echo "</tr>";
     
    		}
    Merci pour ton aide, qui m'a permit de faire avancer mon Schmilblick

    Je me doutais qu'on pouvait faire autrement (et mieux) que d'écrire 96 requêtes...

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 815
    Billets dans le blog
    14
    Par défaut
    Mais là tu fais 36 requêtes alors que tu pourrais tout ramener en une seule !

    Vite fait :
    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
    55
    56
    57
    58
    59
    60
    61
    62
    <?php
    // ne pas oublier l'initialisation de la connexion à la BDD
     
    $req = "
    	SELECT c.mois, c.moox, c.azote, c.nitrate
    	FROM chiffre c
    	INNER JOIN stations s ON s.code_station_CG = c.nom_point
    	WHERE X = '".mysql_real_escape_string($_GET['x'])."'
    		AND Y = '".mysql_real_escape_string($_GET['y'])."'
    		AND annee='".$annee."'
    	ORDER BY c.mois
    ";
     
    $result = mysql_query ($req);
     
    while ($row = mysql_fetch_array($result))
    {
    	$data["{$row['mois']}"]['moox'] = $row['moox'];
    	$data["{$row['mois']}"]['azote'] = $row['azote'];
    	$data["{$row['mois']}"]['nitrate'] = $row['nitrate'];
    }
     
    $param = array ('moox', 'azote', 'nitrate')
    $mois = array ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12');
    ?>
    <table>
    	<th>
    		<td>Parametre</td>
    <?php
    foreach($mois as $m)
    {
    ?>
    		<td><?php echo $m; ?></td>
    <?php
    }
    ?>
    	</th>
    <?php
    foreach($param as $p)
    {
    	<tr>
    		<td>$p</td>
    <?php
    	foreach($mois as $m)
    	{
    ?>
    		<td>
    <?php
    		if($data["{$m}"]["{$p}"] != '')
    		{
    			echo $data["{$m}"]["{$p}"];
    		}
    ?>
    		</td>
    <?php
    	} // Fin foreach($mois as $m)
    ?>
    	</tr>
    <?php
    } // Fin foreach($param as $p)
    ?>
    </table>
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

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

Discussions similaires

  1. Utilisation de SUBSTR avec WHERE dans une requête SQL
    Par thipyt dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/10/2016, 15h54
  2. [DeskI V5-V6] Récupérer une plage de date dans plusieurs requêtes
    Par dufrane dans le forum Débuter
    Réponses: 1
    Dernier message: 08/10/2010, 11h17
  3. [RegEx] remplacer AND par WHERE dans une requête SQL
    Par Kyaan dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2008, 14h42
  4. Plusieurs WHERE dans une requête
    Par Djludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/03/2008, 13h03
  5. Réponses: 8
    Dernier message: 09/01/2007, 16h30

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