Bonjour,
Je voudrais avoir un tableau sur des personnes garant leur voiture dans un parking. Avec pour chaque place, les informations sur la personne qui l'occupe (coordonnées, marque, modèle, immatriculation, etc...).
Ce que je voudrais réussir à faire, c'est pouvoir le faire en direct sur le site, c'est-à-dire avoir un bouton « modifier », qui me permettrait de modifier les infos présentes. Par exemple, passer la place N°1 de "occupée" à "libre", ou changer l'adresse mail de la N°3, et enregistrer les modifications.
J'ai trouvé le script InlineMod et un tuto, tout fonctionne, mais petit problème, lorsque j'actualise la page, les données ne sont pas enregistrées et sont donc remises par défaut... J'ai pourtant bien lié la base de données, je ne comprends pas d'où vient le problème...
Merci de votre aide,
Brice
INDEX.PHP
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
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 <?php //Connexion à la base de données $DB_HOST = "db596615742.db.1and1.com"; $DB_NAME = "db596615742"; $DB_USER = "dbo596615742"; $DB_PASSWORD = "********"; $DB_TABLE_NAME = "inlinemod"; $connexion = mysql_connect($DB_HOST, $DB_USER, $DB_PASSWORD) or die(mysql_error()); mysql_select_db($DB_NAME, $connexion) or die(mysql_error()); $sql = "SELECT * FROM `" . $DB_TABLE_NAME . "`"; $req = mysql_query($sql) or die(mysql_error()); mysql_close($connexion); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" /> <title>Modification "Inline" d'éléments dans une page web</title> <link rel="StyleSheet" type="text/css" href="index.css"/> <script type="text/javascript" src="inlinemod.js"></script> </head> <body> <h1>Liste d'utilisateurs</h1> <table id="table-utilisateurs"> <tr> <th>Nom</th> <th>Prénom</th> <th>Adresse</th> <th>Code Postal</th> <th>Ville</th> <th>Enfants</th> <th>Email</th> </tr> <?php while ($user = mysql_fetch_assoc($req)) { ?> <tr> <td id="nom-<?php echo $user['id']; ?>" class="cellule" ondblclick="inlineMod(<?php echo $user['id']; ?>, this, 'nom', 'texte')"><?php echo $user['nom']; ?></td> <td id="prenom-<?php echo $user['id']; ?>" class="cellule" ondblclick="inlineMod(<?php echo $user['id']; ?>, this, 'prenom', 'texte')"><?php echo $user['prenom']; ?></td> <td id="adresse-<?php echo $user['id']; ?>" class="cellule" ondblclick="inlineMod(<?php echo $user['id']; ?>, this, 'adresse', 'texte-multi')"><?php echo $user['adresse']; ?></td> <td id="cp-<?php echo $user['id']; ?>" class="cellule" ondblclick="inlineMod(<?php echo $user['id']; ?>, this, 'code_postal', 'texte')"><?php echo $user['code_postal']; ?></td> <td id="ville-<?php echo $user['id']; ?>" class="cellule" ondblclick="inlineMod(<?php echo $user['id']; ?>, this, 'ville', 'texte')"><?php echo $user['ville']; ?></td> <td id="enfants-<?php echo $user['id']; ?>" class="cellule" ondblclick="inlineMod(<?php echo $user['id']; ?>, this, 'enfants', 'nombre')"><?php echo $user['enfants']; ?></td> <td id="email-<?php echo $user['id']; ?>" class="cellule" ondblclick="inlineMod(<?php echo $user['id']; ?>, this, 'email', 'texte')"><?php echo $user['email']; ?></td> </tr> <?php } ?> </table> <div id="info">(les données de ce tableau sont fictives)</div> </body> </html>
sauverMod.php:
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 <?php //On sort en cas de paramètre manquant ou invalide if(empty($_GET['id']) or empty($_GET['type']) or empty($_GET['champ']) or empty($_GET['valeur']) or !is_numeric($_GET['id']) or !in_array( $_GET['champ'], array('nom', 'prenom', 'adresse', 'code_postal', 'ville', 'enfants', 'email') )) { exit; } //Connexion à la base de données $connexion = mysql_connect($DB_HOST, $DB_USER, $DB_PASSWORD) or die(mysql_error()); mysql_select_db($DB_NAME, $connexion) or die(mysql_error()); //Construction de la requête en fonction du type de valeur switch($_GET['type']) { case 'texte': case 'texte-multi': $sql = 'UPDATE `'.DB_TABLE_NAME; $sql .= '` SET ' . mysql_real_escape_string($_GET['champ']) . '="'; $sql .= mysql_real_escape_string($_GET['valeur']) . '" WHERE id=' . intval($_GET['id']); break; case 'nombre': $sql = 'UPDATE `'.DB_TABLE_NAME; $sql .= '` SET ' . mysql_real_escape_string($_GET['champ']) . '=' . intval($_GET['valeur']); $sql .= ' WHERE id=' . intval($_GET['id']); break; default: exit; } //Exécution de la requête mysql_query($sql) or die(mysql_error()); mysql_close($connexion); ?>
et inline.js
Code js : 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
239 // retourne un objet xmlHttpRequest. // méthode compatible entre tous les navigateurs (IE/Firefox/Opera) function getXMLHTTP() { var xhr = null; if(window.XMLHttpRequest) { // Firefox et autres xhr = new XMLHttpRequest(); } else if(window.ActiveXObject) { // Internet Explorer try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e1) { xhr = null; } } } else { // XMLHttpRequest non supporté par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); } return xhr; } //Fonction renvoyant le code de la touche appuyée lors d'un événement clavier function getKeyCode(evenement) { for (prop in evenement) { if(prop == 'which') { return evenement.which; } } return event.keyCode; } //Suppression des espaces/sauts de ligne inutiles (http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C0C0062AC78) function trim(value) { var temp = value; var obj = /^(\s*)([\W\w]*)(\b\s*$)/; if (obj.test(temp)) { temp = temp.replace(obj, '$2'); } var obj = / /g; while (temp.match(obj)) { temp = temp.replace(obj, " "); } return temp; } //Fonction donnant la largeur en pixels du texte donné (merci SpaceFrog !) function getTextWidth(texte) { //Valeur par défaut : 150 pixels var largeur = 150; if(trim(texte) == "") { return largeur; } //Création d'un span caché que l'on "mesurera" var span = document.createElement("span"); span.style.visibility = "hidden"; span.style.position = "absolute"; //Ajout du texte dans le span puis du span dans le corps de la page span.appendChild(document.createTextNode(texte)); document.getElementsByTagName("body")[0].appendChild(span); //Largeur du texte largeur = span.offsetWidth; //Suppression du span document.getElementsByTagName("body")[0].removeChild(span); span = null; return largeur; } //Fonction renvoyant une valeur "aléatoire" pour forcer le navigateur (ie...) //à envoyer la requête de mise à jour function ieTrick(sep) { d = new Date(); trick = d.getYear() + "ie" + d.getMonth() + "t" + d.getDate() + "r" + d.getHours() + "i" + d.getMinutes() + "c" + d.getSeconds() + "k" + d.getMilliseconds(); if (sep != "?") { sep = "&"; } return sep + "ietrick=" + trick; } //On ne pourra éditer qu'une valeur à la fois var editionEnCours = false; //variable évitant une seconde sauvegarde lors de la suppression de l'input var sauve = false; //Fonction de modification inline de l'élément double-cliqué function inlineMod(id, obj, nomValeur, type) { if(editionEnCours) { return false; } else { editionEnCours = true; sauve = false; } //Objet servant à l'édition de la valeur dans la page var input = null; //On crée un composant différent selon le type de la valeur à modifier switch(type) { //Valeur de type texte ou nombre case "texte": case "nombre": input = document.createElement("input"); break; //Valeur de type texte multilignes case "texte-multi": input = document.createElement("textarea"); break; } //Assignation de la valeur if (obj.innerText) input.value = obj.innerText; else input.value = obj.textContent; input.value = trim(input.value); //On lui donne une taille un peu plus large que le texte à modifier input.style.width = getTextWidth(input.value) + 30 + "px"; //Remplacement du texte par notre objet input obj.replaceChild(input, obj.firstChild); //On donne le focus à l'input et on sélectionne le texte qu'il contient input.focus(); input.select(); //Assignation des deux événements qui déclencheront la sauvegarde de la valeur //Sortie de l'input input.onblur = function sortir() { sauverMod(id, obj, nomValeur, input.value, type); delete input; }; //Appui sur la touche Entrée input.onkeydown = function keyDown(event) { if (!event&&window.event) { event = window.event; } if(getKeyCode(event) == 13) { sauverMod(id, obj, nomValeur, input.value, type); delete input; } }; } //Objet XMLHTTPRequest var XHR = null; //Fonction de sauvegarde des modifications apportées function sauverMod(id, obj, nomValeur, valeur, type) { //Si on a déjà sauvé la valeur en cours, on sort if(sauve) { return false; } else { sauve = true; } //Si l'objet existe déjà on abandonne la requête et on le supprime if(XHR && XHR.readyState != 0) { XHR.abort(); delete XHR; } //Création de l'objet XMLHTTPRequest XHR = getXMLHTTP(); if(!XHR) { return false; } //URL du script de sauvegarde auquel on passe la valeur à modifier XHR.open("GET", "sauverMod.php?id=" + id + "&champ=" + nomValeur + "&valeur=" + escape(valeur) + "&type=" + type + ieTrick(), true); //On se sert de l'événement OnReadyStateChange pour supprimer l'input et le replacer par son contenu XHR.onreadystatechange = function() { //Si le chargement est terminé if (XHR.readyState == 4) { //Réinitialisation de la variable d'état d'édition editionEnCours = false; //Remplacement de l'input par le texte qu'il contient obj.replaceChild(document.createTextNode(valeur), obj.firstChild); } } //Envoi de la requête XHR.send(null); }
Partager