Bonjour,

Je n'ai jamais été très fort sur les tampons de saisie... et j'ai un problème parce que je fais saisir plusieurs informations de suite:

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
 
    char Host[20+1];
    char User[20+1];
    char Pwd[20+1];
    char Base[20+1];
 
    int  NbBoites;
    int i;
 
 
    std::cout<<"Nom du serveur Mysql ? ";
    std::cin.getline(Host,sizeof(Host));
    std::cout<<"User sur le serveur Mysql ? ";
    std::cin.getline(User,sizeof(User));
    std::cout<<"Pwd sur le serveur Mysql ? ";
    std::cin.getline(Pwd,sizeof(Pwd));
    std::cout<<"Nom de la base ? ";
    std::cin.getline(Base,sizeof(Base));
 
    std::cout<<"Nombre de boîtes ? ";
 
    std::cin>>NbBoites;
    std::cin.clear();
    std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
 
    //Récupération des Eléments dans un tableau de chaînes
    char (*Elts)[20+1]= new char[NbBoites*3][20+1];
    for(i=0;i<NbBoites;i++)
       {
       std::cout<<"Boîte de Liste "<<i+1<<" : Nom de Table liée ? ";
       std::cin>>Elts[(4*i)-4+0];
       std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de sélection ? ";
       std::cin>>Elts[(4*i)-4+1];
       std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de liaison ? ";
       std::cin>>Elts[(4*i)-4+2];
       std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ à afficher comme valeur ? ";
       std::cin>>Elts[(4*i)-4+3];
       }
Je précise que le programme génère ensuite du code php permettant l'exécution d'une requête Mysql, grâce à:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
    for(i=0;i<NbBoites;i++)
      {
      FichierSortie<<"/*Requête pour la boîte "<<i+1<<"*/\n\r";
      if(i==0)
         FichierSortie<<"$sql=\"SELECT "<< Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+3] << " FROM "<< Elts[(4*i)-4+0] << " Order by " << Elts[(4*i)-4+3] << "\";\n\r";
      else
         FichierSortie<<"$sql=\"SELECT "<< Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+2] << "," << Elts[(4*i)-4+3] << " FROM "<< Elts[(4*i)-4+0] << " Order by " << Elts[(4*i)-4+3] << "\";\n\r";
      ...
      }
Seulement voilà, la première requête créée est toujours défectueuse; elle donne (avec les éléments saisis Champ Sélection= IdDeathType, Champ Liaison = IdDeathType, Champ Valeur = LibDeathType, Table liée = deathtypes) dans le fichier texte produit:

$sql="SELECT IdDeathÜü",IdDeathÜü",LibDeathType FROM deathtypes Order by LibDeathType";

au lieu de

$sql="SELECT IdDeathType,IdDeathType,LibDeathType FROM deathtypes Order by LibDeathType";

A noter que la deuxième requête est toujours bonne; en l'occurence:

$sql="SELECT IdDeathSType,IdDeathType,LibDeathSType FROM deathstypes Order by LibDeathSType";

J'ai essayé de nettoyer le tampon après chaque saisie, mais sans succès.. Je suis donc obligé de rectifier la requête à la main... ce qui est gênant pour un programme que j'aimerais bien distribuer librement... Mais à part ça tout fonctionne !

Pour ceux que ça intéresse, il s'agit d'un programme créant automatiquement un fichier texte Index.php contenant le code php et javascript permettant d'avoir le squelette d'une page html avec des boîtes de liste liées...

Voici le code intégral, pour code::Blocks sous Windows Vista.

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
 
/*Nom:        PhpboitesListeLiees.cpp                                         */
/*Auteur:     Pierre-Jean Tuloup                                              */
/*Date Modif: 24 Mai 2008                                                     */
/*Objet     : Ce programme écrit en fonction des données entrées par l'utili- */
/*            sateur un fichier Index.php contenant tout le code php et       */
/*            Javascript nécessaire pour générer une page html dans laquelle  */
/*            figurent des boîtes de liste déroulante dont le contenu est     */
/*            tiré de champs de tables d'une base Mysql, boîtes liées entre   */
/*            elles de telle sorte que si l'on change la sélection d'une      */
/*            boîte maître exposant des catégories, la boîte asservie exposant*/
/*            des sous-catégories change ses items en conséquence (en limitant*/
/*            ceux-ci à la catégorie choisie dans la boîte maître).           */
/*Principe  : Au départ, les boites de listes sont chargées à partir des tab- */
/*            les Mysql avec tous les éléments possibles. Seulement, le tag   */
/*            <option value> est rempli de plusieurs éléments séparés par un  */
/*            point. Ces éléments sont l'index de l'élément figurant dans l'af*/
/*            fichage du tag option tel qu'il provient de la table Mysql, puis*/
/*            l'indice de la catégorie à laquelle il appartient dans la boîte */
/*            maître (champ qui sert de liaison entre les deux tables Mysql). */
/*            Lors d'une sélection dans une boîte maître, le contenu de la    */
/*            boîte asservie est automatiquement redéfini en fonction, par    */
/*            comparaison pour tous les éléments de la liste initiale de la   */
/*            boîte asservie entre ses Items de liaison et l'item sélectionné */
/*            dans la boîte maître.                                           */
 
#include <iostream>
#include <fstream.h>
#include <string.h>
 
int main()
{   char Host[20+1];
    char User[20+1];
    char Pwd[20+1];
    char Base[20+1];
 
    int  NbBoites;
    int i;
 
 
    std::cout<<"Nom du serveur Mysql ? ";
    std::cin.getline(Host,sizeof(Host));
    std::cout<<"User sur le serveur Mysql ? ";
    std::cin.getline(User,sizeof(User));
    std::cout<<"Pwd sur le serveur Mysql ? ";
    std::cin.getline(Pwd,sizeof(Pwd));
    std::cout<<"Nom de la base ? ";
    std::cin.getline(Base,sizeof(Base));
 
    std::cout<<"Nombre de boîtes ? ";
 
    std::cin>>NbBoites;
    std::cin.clear();
    std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
 
    //Récupération des Eléments dans un tableau de chaînes
    char (*Elts)[20+1]= new char[NbBoites*3][20+1];
    for(i=0;i<NbBoites;i++)
       {
       std::cout<<"Boîte de Liste "<<i+1<<" : Nom de Table liée ? ";
       std::cin>>Elts[(4*i)-4+0];
       std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de sélection ? ";
       std::cin>>Elts[(4*i)-4+1];
       std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de liaison ? ";
       std::cin>>Elts[(4*i)-4+2];
       std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ à afficher comme valeur ? ";
       std::cin>>Elts[(4*i)-4+3];
       }
 
    //Ecriture de la page php
	std::cout << "Ecriture du fichier..." << std::endl;
	ofstream FichierSortie("Index.php");
	if(!FichierSortie)
	   {
       std::cout<<"Problème d'écriture";
       return 1;
	   }
    FichierSortie<<"<?\n\r";
    FichierSortie<<"echo\"<HTML lang=fr>\\n\";\n\r";
    FichierSortie<<"echo\"<!DOCTYPE HTML PUBLIC \'-//W3C//DTD HTML 4.0//EN\'>\\n\";\n\r";
    FichierSortie<<"echo\"<HEAD>\\n\";\n\r";
    FichierSortie<<"echo\"<TITLE>Mettez votre titre ici</TITLE>\\n\";\n\r";
    FichierSortie<<"echo\"<meta name=\'Description\' content=\'Mettez votre description ici\'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta name=\'Keywords\' content=\'Mettez vos mots clefs ici\'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta name=\'Distribution\' content=\'Global\'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta name=\'Rating\' content=\'General\'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta name=\'Publisher\' content=\'Mettez votre nom ici\'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta name=\'Author\' Lang=\'fr\' content=\'Pierre-Jean Tuloup\'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta name=\'Last Modified\' content='Mettez la date ici'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta name=\'Generator\' content=\'PhpGenerator de Pierre-Jean Tuloup (c)2008!\'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta http-equiv=\'Content-entryfield\' content=\'text/html; charset=windows-1252\'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta http-equiv=\'Content-language\' content=\'fr\'>\\n\";\n\r";
    FichierSortie<<"echo\"<meta http-equiv=\'Reply-to\' content=\'Mettez votre adresse mail ici\'>\\n\";\n\r";
 
    //Ecriture du code Javascript (Fonctions diverses)
       //Initialisation variables globales
    FichierSortie<<"echo\"<script language='Javascript1.1'>\\n\";\n\r";
    for(i=0;i<NbBoites;i++)
       {FichierSortie<<"echo \"var NbEltsListe"<<i+1<<"=0;\\n\";\n\r";}
       //Fonction RecupListes
    FichierSortie<<"echo \"function RecupListes()\\n\";\n\r";
    FichierSortie<<"echo \"\t{\\n\";\n\r";
    for(i=0;i<NbBoites;i++)
       {FichierSortie<<"echo \"\tRecupListe"<<i+1<<"();\\n\";\n\r";}
    FichierSortie<<"echo \"\t}\\n\";\n\r";
       //Fonctions de récupération des listes
    for(i=0;i<NbBoites;i++)
       {
       FichierSortie<<"echo \"function RecupListe"<<i+1<<"()\\n\";\n\r";
       FichierSortie<<"echo \"{\\n\";\n\r";
       FichierSortie<<"echo \"NbEltsListe"<<i+1<<"=document.Param.Sel"<<i+1<<".length;\\n\";\n\r";
       FichierSortie<<"echo \"NoSel"<<i+1<<"=new Array(NbEltsListe"<<i+1<<"-1);\\n\";\n\r";
       FichierSortie<<"echo \"NoLnk"<<i+1<<"=new Array(NbEltsListe"<<i+1<<"-1);\\n\";\n\r";
       FichierSortie<<"echo \"LibAff"<<i+1<<"=new Array(NbEltsListe"<<i+1<<"-1);\\n\";\n\r";
       FichierSortie<<"echo \"for(var i=0;i<NbEltsListe"<<i+1<<";i++)\\n\";\n\r";
       FichierSortie<<"echo \"\t{\\n\";\n\r";
       FichierSortie<<"echo \"\tvar valeur=document.Param.Sel"<<i+1<<".options[i].value;\\n\";\n\r";
       FichierSortie<<"echo \"\tvar pospt=valeur.indexOf('.');\\n\";\n\r";
       FichierSortie<<"echo \"\tNoSel"<<i+1<<"[i]=valeur.substring(0,pospt);\\n\";\n\r";
       FichierSortie<<"echo \"\tNoLnk"<<i+1<<"[i]=valeur.substring(pospt+1,(valeur.length));\\n\";\n\r";
       FichierSortie<<"echo \"\tLibAff"<<i+1<<"[i]=document.Param.Sel"<<i+1<<".options[i].text;\\n\";\n\r";
       FichierSortie<<"echo \"\t}\\n\";\n\r";
       FichierSortie<<"echo \"}\\n\";\n\r";
       }
       //Fonctions de changement de contenu
          //Nota: la denière boîte n'en modofie aucune: pas besoin de fonction change() pour elle
    for(i=0;i<NbBoites-1;i++)
       {
       FichierSortie<<"echo \"function Change"<<i+1<<"()\\n\";\n\r";
       FichierSortie<<"echo \"{\\n\";\n\r";
       FichierSortie<<"echo \"var NoIndexSel=document.Param.Sel"<<i+1<<".selectedIndex;\\n\";\n\r";
       FichierSortie<<"echo \"var NoItemSel=document.Param.Sel"<<i+1<<".options[NoIndexSel].value;\\n\";\n\r";
       FichierSortie<<"echo \"var LibItemSel=document.Param.Sel"<<i+1<<".options[NoIndexSel].text;\\n\";\n\r";
       FichierSortie<<"echo \"var pospt=NoItemSel.indexOf('.');\\n\";\n\r";
       FichierSortie<<"/*Si point existe: liste originale; sinon, liste redéfinie par sélection dans la boîte précédente*/\n\r";
       FichierSortie<<"echo \"if(pospt>-1)\\n\";\n\r";
       FichierSortie<<"echo \"\t{\\n\";\n\r";
       FichierSortie<<"echo \"\tNoItemSel=NoItemSel.substring(pospt+1,(NoItemSel.length));\\n\";\n\r";
       FichierSortie<<"echo \"\t}\\n\";\n\r";
       FichierSortie<<"echo \"for(var i=0;i<NbEltsListe"<<i+1<<";i++)\\n\";\n\r";
       FichierSortie<<"echo \"var j=0;\\n\";\n\r";
       FichierSortie<<"/*Mise à jour de la boîte de Liste Sélection +1*/\n\r";
       FichierSortie<<"/*Si pas d'élément choisi*/\n\r";
       FichierSortie<<"echo \"if(NoItemSel==0)\\n\";\n\r";
       FichierSortie<<"/*Restauration de la boîte de Liste +1 dans tous ses éléments*/\n\r";
       FichierSortie<<"echo \"\tfor(var i=0;i<NbEltsListe"<<i+2<<";i++)\\n\";\n\r";
       FichierSortie<<"echo \"\t\t{\\n\";\n\r";
       FichierSortie<<"echo \"\t\tdocument.Param.Sel"<<i+2<<".length=j+1;\\n\";\n\r";
       FichierSortie<<"echo \"\t\tdocument.Param.Sel"<<i+2<<".options[j].value=NoSel"<<i+2<<"[i];\\n\";\n\r";
       FichierSortie<<"echo \"\t\tdocument.Param.Sel"<<i+2<<".options[j++].text=LibAff"<<i+2<<"[i];\\n\";\n\r";
       FichierSortie<<"echo \"\t\t}\\n\";\n\r";
       FichierSortie<<"/*Si un élément a été choisi*/\n\r";
       FichierSortie<<"echo \"else\\n\";\n\r";
       FichierSortie<<"echo \"\t{\\n\";\n\r";
       FichierSortie<<"echo \"\tdocument.Param.Sel"<<i+2<<".length=j+1;\\n\";\n\r";
       FichierSortie<<"echo \"\tdocument.Param.Sel"<<i+2<<".options[j].value=NoSel"<<i+2<<"[0];\\n\";\n\r";
       FichierSortie<<"echo \"\tdocument.Param.Sel"<<i+2<<".options[j++].text=LibAff"<<i+2<<"[0];\\n\";\n\r";
       FichierSortie<<"/*Passer en revue tous les éléments originels de la boîte +1*/\n\r";
       FichierSortie<<"echo \"\tfor(var i=0;i<NbEltsListe"<<i+2<<";i++)\\n\";\n\r";
       FichierSortie<<"echo \"\t\t{\\n\";\n\r";
       FichierSortie<<"/*Si l'Item sélectionné dans la boîte 1 est l'élément de liaison[i] de la boîte +1*/\n\r";
       FichierSortie<<"echo \"\t\tif(NoItemSel==NoLnk"<<i+2<<"[i])\\n\";\n\r";
       FichierSortie<<"echo \"\t\t\t{\\n\";\n\r";
       FichierSortie<<"echo \"\t\t\tdocument.Param.Sel"<<i+2<<".length=j+1;\\n\";\n\r";
       FichierSortie<<"echo \"\t\t\tdocument.Param.Sel"<<i+2<<".options[j].value=NoSel"<<i+2<<"[i];\\n\";\n\r";
       FichierSortie<<"echo \"\t\t\tdocument.Param.Sel"<<i+2<<".options[j++].text=LibAff"<<i+2<<"[i];\\n\";\n\r";
       FichierSortie<<"echo \"\t\t\t}\\n\";\n\r";
       FichierSortie<<"echo \"\t\t}\\n\";\n\r";
       FichierSortie<<"echo \"\t}\\n\";\n\r";
       FichierSortie<<"echo \"}\\n\";\n\r";
       }
    FichierSortie<<"echo \"</script>\\n\";\n\r";
 
    FichierSortie<<"echo\"</HEAD>\\n\";\n\r";
 
    FichierSortie<<"echo\"<BODY onLoad='RecupListes();'>\\n\";\n\r";
 
    FichierSortie<<"if(!$hdle=mysql_connect(" << Host << "," << User << "," << Pwd << "))\n\r";
    FichierSortie<<"\t{\n\r";
    FichierSortie<<"\techo \"<SCRIPT LANGUAGE='Javascript1.1'>\\n\";\n\r";
    FichierSortie<<"\techo \"window.alert('Erreur dans la connexion au Serveur SGBD.\\nOpération annulée.');\\n\";\n\r";
    FichierSortie<<"\techo \"</SCRIPT>\\n\";\n\r";
    FichierSortie<<"\texit;\n\r";
    FichierSortie<<"\t}\n\r";
 
    //Récupération dans la Base des éléments de chaque boîte
    for(i=0;i<NbBoites;i++)
      {
      FichierSortie<<"/*Requête pour la boîte "<<i+1<<"*/\n\r";
      if(i==0)
         FichierSortie<<"$sql=\"SELECT "<< Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+3] << " FROM "<< Elts[(4*i)-4+0] << " Order by " << Elts[(4*i)-4+3] << "\";\n\r";
      else
         FichierSortie<<"$sql=\"SELECT "<< Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+2] << "," << Elts[(4*i)-4+3] << " FROM "<< Elts[(4*i)-4+0] << " Order by " << Elts[(4*i)-4+3] << "\";\n\r";
 
       FichierSortie<<"if(!$result=mysql_db_query(" << Base << ",$sql,$hdle))\n\r";
       FichierSortie<<"\t{\n\r";
       FichierSortie<<"\techo \"<SCRIPT LANGUAGE='Javascript1.1'>\\n\";\n\r";
       FichierSortie<<"\techo \"window.alert('Erreur dans la liaison boîte "<<i+1<<" avec le Serveur SGBD.\\nOpération annulée.');\\n\";\n\r";
       FichierSortie<<"\techo \"</SCRIPT>\\n\";\n\r";
       FichierSortie<<"\texit;\n\r";
       FichierSortie<<"\t}\n\r";
       FichierSortie<<"else\n\r";
       FichierSortie<<"\t{\n\r";
       FichierSortie<<"\t$i=0;\n\r";
       FichierSortie<<"\twhile ($ligne=mysql_fetch_array($result))\n\r";
       FichierSortie<<"\t\t{\n\r";
       FichierSortie<<"\t\t$No"<<i+1<<"[$i]=$ligne[0];\n\r";
       FichierSortie<<"\t\t$Lnk"<<i+1<<"[$i]=$ligne[1];\n\r";
       FichierSortie<<"\t\t$Lib"<<i+1<<"[$i++]=$ligne[2];\n\r";
 
       FichierSortie<<"\t\t}\n\r";
       FichierSortie<<"\t$NbElts"<<i+1<<"=--$i;\n\r";
       FichierSortie<<"\t}\n\r";
       }
 
    //Ecriture de la page
    FichierSortie<<"echo \"<form name='Param' Action='PageResultat.php' Method='post'>\\n\";\n\r";
    FichierSortie<<"echo \"<table border='0'>\\n\";\n\r";
    FichierSortie<<"echo \"<tr>\\n\";\n\r";
    for(i=1;i<=NbBoites;i++)
       {
       FichierSortie<<"/*Boîte de Liste "<<i<<"*/\n\r";
       FichierSortie<<"echo \"<td><select name='Sel"<<i<<"' onChange='Change"<<i<<"();'>\\n\";\n\r";
       FichierSortie<<"/*Alimentation de la Boite*/\n\r";
       FichierSortie<<"echo \"<option value=0>(Aucun)</option>\\n\";\n\r";
       FichierSortie<<"for($i=0;$i<=$NbElts"<<i<<";$i++)\n\r";
       FichierSortie<<"\techo \"<option value=$No"<<i<<"[$i].$Lnk"<<i<<"[$i]>$Lib"<<i<<"[$i]</option>\\n\";\n\r";
       FichierSortie<<"echo \"</select></td>\\n\";\n\r";
       }
    FichierSortie<<"echo \"<td><input type='submit' name='ChoixValider' value='Lancer'></input></td>\\n\";\n\r";
    FichierSortie<<"echo \"</tr>\\n\";\n\r";
    FichierSortie<<"echo \"</table>\\n\";\n\r";
    FichierSortie<<"echo \"</form>\\n\";\n\r";
 
    FichierSortie<<"?>\n\r";
    FichierSortie.close();
	return 0;
}
Merci d'avance !