Bonjour,
1- Le réflexe à avoir avant de dire "ça ne fonctionne pas" : on recherche et on LIT la DOC.
2- Watilin a posé une question : "quelle est la version de jQuery" ?
Bonjour,
1- Le réflexe à avoir avant de dire "ça ne fonctionne pas" : on recherche et on LIT la DOC.
2- Watilin a posé une question : "quelle est la version de jQuery" ?
Justement, je n’étais pas sûr de ce point alors j’ai testé, chez moi ça marche. J’ai également examiné le code source de jQuery et je n’ai pas trouvé de traitement de cas particulier.
Ce simple .then( fn ) garantit, normalement, que la fonction fn (la tienne) est toujours appelée quand le DOM est prêt, et ce qu’elle soit async ou non.
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 // The deferred used on DOM ready var readyList = jQuery.Deferred(); jQuery.fn.ready = function( fn ) { readyList .then( fn ) // Wrap jQuery.readyException in a function so that the lookup // happens at the time of error handling instead of callback // registration. .catch( function( error ) { jQuery.readyException( error ); } ); return this; };
… Mais il est toujours possible qu’un détail m’ait échappé. C’est pourquoi je te propose une nouvelle solution : encadrer avec une fonction async seulement le passage qui a besoin d’être asynchrone. Comme ceci :
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 $(document).ready(function () { let day = new Date(); day.setDate(day.getDate() - 1); // On sélectionne le jour précédent let mm = ((day.getMonth() + 1) < 10) ? '0' + (day.getMonth() + 1) : (day.getMonth() + 1); let dd = (day.getDate() < 10) ? '0' + day.getDate() : day.getDate(); let yy = day.getFullYear(); let dayInit = yy + mm + dd; let WAnnee = $('#Liste_Annee').val(yy); // Sélection de l'année en cours. (async function () { console.log("%cdébut fonction async", "color: magenta"); // récupération de la plus vieille année disponible dans la table let WAN = 0; // requête asynchrone // linstruction await dit au script « dattendre » larrivée de la réponse let textData = await $.get("./scripts/PHP/TraficJournalier_PLTF_PlusVielleAnnee2.php"); WAN = parseInt(textData); console.log("WAN="+WAN); ... ... ... console.log("%cfin fonction async", "color: magenta"); })(); });
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Bonjour et encore merci pour le coup de main.
@jreaux62 : j'ai fait des recherches sur ces fonctions, même si je n'ai pas trouvé les même liens que toi et si je demande de l'aide, c'est que je n'y arrive pas. Je ne suis pas informaticien, j'aide seulement mon équipe et je n'ai pas eu de formation, j'apprends sur le tas et j'essaye (vraiment) de faire de mon mieux
Par contre, il est vrai que j'ai oublié de donner la version de jQuery qui est donc la v1.11 (C'est celle que l'on m'a fourni).
@Watilin : Ca fonctionne, merci, merci beaucoup.
J'ai quelques question pour bien comprendre :
- pourquoi avoir remplacé les "var" par des "let", je comprends bien la différences, mais je ne vois pas l'intérêt dans ce cas ?
- pour que ça fonctionne, j'ai été obligé de mettre tout mon code en remplacement des "...", j'ai bien compris le pourquoi, mais est-ce qu'il n'aurait pas été possible de seulement "ressortir" l'année et de garder le reste (même si ce n'est pas très important) ?
- Donc, si j'ai bien compris, c'est tout le code qui est assujettis au mode asynchrone ?
Pour simplifier, j'ai fait ça :
Code javascript : 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 (async function () { console.log("%cdébut fonction async", "color: magenta"); // récupération de la plus vieille année disponible dans la table let WAN = 0; // requête asynchrone // linstruction await dit au script « dattendre » larrivée de la réponse let textData = await $.get("./scripts/PHP/TraficJournalier_PLTF_PlusVielleAnnee2.php"); WAN = parseInt(textData); // console.log("WAN="+WAN); console.log("%cfin fonction async", "color: magenta"); SuiteDeLaFonction(WAN, WAnnee); })();
PS : c'est cool et pratique de pouvoir mettre de la couleur dans le console.log, je ne connaissais pas
Zeb'...
Bonjour,
ce n'était qu'un conseil :
1- Faire une recherche systématique (sur les fonctions proposées, et tout ce que tu ne connait pas) te permet de comprendre la syntaxe, le fonctionnement,... (et de trouver des exemples d'utilisation)
2- Ensuite, sur le forum, ça te permet de profiter pleinement de l'expérience des autres, des conseils et codes qu'on te donne, en toute connaissance de cause.
Concernant ta version de jQuery, elle ne date pas d'hier...
Dernière modification par Invité ; 19/12/2018 à 11h46.
Oui, t'inquiète, je l'avais pris comme un conseil, je ne me suis pas vexé.
Pour la version de JQuery, je vais voir s'il y a moyen de prendre plus "neuf", je ne sais pas.
Tu me conseilles une version en particulier ou la dernière tout bêtement ? Et en minified, slim ou slim minified ?
Zeb'...
Comme tu le sais peut-être déjà, let et var n’ont pas tout à fait le même effet : var crée une variable dans la portée d’une fonction, alors que let crée une variable dans la portée d’un bloc.
Pendant quelques temps, j’ai pensé que c’était une bonne chose de mélanger les deux selon les besoins, et puis je me suis rendu compte que ça compliquait la maintenance. Quand il arrive qu’on ait besoin de transformer un bloc en fonction (comme on l’a fait) ou l’inverse, on est alors obligé de changer les var par des let et réciproquement, et c’est facile d’en oublier et ainsi d’introduire des erreurs. Du coup, maintenant je me limite au let qui est plus restrictif dans sa portée.
Si le reste du code n’a pas besoin de l’année, tu peux le laisser dans la fonction synchrone.
Pour bien voir dans quel ordre les choses se passent, faisons un petit test :
Sous Firefox 64, j’ai ce résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 (function exterieure() { console.log("A"); (async function interieure() { console.log("B"); await null; console.log("C"); })(); console.log("D"); return "ok"; })()
Code console : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5A B D << "ok" C
Le déroulement de l’exécution peut être schématisé comme ça :
C’est comme si le await créait un second « thread », sauf que JavaScript est monothread (si on oublie les workers). Du coup, le bout de la fonction interieure qui suit le await est mis en attente, et il est seulement exécuté à la fin de la fonction exterieure. C’est un peu comme un setTimeout.
Code schema : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 x console.log("A") | x console.log("B") | x await ------------- | \ x console.log("D") \ | \ x return "ok" | | x console.log("C")
Pour comparer avec ta situation, la partie C est la partie réellement asynchrone, celle qui reçoit la réponse ajax et récupère l’année. Si tu as du code dans la fonction exterieure après la fonction interieure, ça correspond à la partie D. Ce code sera exécuté avant la partie C, il ne peut donc pas utiliser l’année car elle n’existe pas à ce moment.
Oui, on peut trouver quelques exemples sur le MDN.
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Ho punaise !
Ca, c'est de la pédagogie.
Non seulement, c'est bien expliqué, mais en plus adapté à mes besoins.
Et pour couronné le tout, j'ai tout compris, ce qui ne gâche rien
Bravo et merci beaucoup.
Je vais essayer de suivre ton conseil pour les let.
Edit : une dernière question : pourquoi est-ce qu'il y a () à la fin de la fonction ?
Zeb'...
Pour l’appeler immédiatement, sinon elle est juste déclarée. On appelle ça parfois une IIFE.
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Ha ok.
Va falloir que je m'en souvienne de celui-là.
Encore merci beaucoup pour ton aide et ta patience.
Zeb'...
Si j'ai tout bien compris, j'ai le même problème avec cette partie du code :
Code javascript : 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 ... ... ... P_Pltf = "LFPG"; var WRqt = "SELECT * FROM stattot2 WHERE ST_PLTF = '" + P_Pltf + "' and ST_ANNEE_REF = " + P_date + " ORDER BY ST_DATE_MOUV_N"; var deferred = $.get("./scripts/PHP/TraficJournalier_PLTF.php?date=".concat(P_date) + "&pltf=".concat(P_Pltf)); // Retour du serveur (traitement des données JSON) deferred.done(function (jsonData) { EcritureLOG("OK", P_Pltf, "StatSNARP_SAI", WRqt, "Requête exécutée. "); // Ecriture du fichier LOG var update = false; if (jsonData[0].length > 0) { update = true; if ($("#LIG_TJ_LFPG").children().length == 0) { addHTML("LIG_TJ_LFPG", ["lfpg_tj"], ["12"]); // Graph de gauche=LFPB / Graph de droite=LFOB } createGraph_TJ("LFPG", Annee, jsonData[0]); $("#lfpg_tj").removeClass("no-data"); // pour supprimer la classe } else { EcritureLOG("Err", P_Pltf, "LOG_StatSNARP_SAI", WRqt, "Requête vide. "); // Ecriture du fichier LOG // $("#LIG_TJ_LFPG").empty(); if (jsonData[0].length == 0) { if ($("#lfpg_tj").size() != 1) { // si la div #lfpg_hg existe déjà, pas la peine de la recréer. addHTML("LIG_TJ_LFPG", ["lfpg_tj"], ["12"]); } createGraph_TJ("LFPG", Annee, jsonData[0]); $("#lfpg_tj").addClass("no-data"); // pour ajouter la classe } } if (update) { $(".graph-loading").hide(); $("#btn-save-pdf").attr("disabled", false); $("#div-info").children('.message-p-info').html(''); $("#div-info").children('.icon-p-info').html(''); } else { $(".graph-loading").hide(); $("#div-info").children('.message-p-info').html('<strong>Certaines données sont indisponibles...</strong>'); $("#div-info").children('.icon-p-info').html('<i class="fa fa-exclamation-triangle fa-lg"></i>'); } }); P_Pltf = "LFPO"; var WRqt = "SELECT * FROM stattot2 WHERE ST_PLTF = '" + P_Pltf + "' and ST_ANNEE_REF = " + P_date + " ORDER BY ST_DATE_MOUV_N"; var deferred = $.get("./scripts/PHP/TraficJournalier_PLTF.php?date=".concat(P_date) + "&pltf=".concat(P_Pltf)); // Retour du serveur (traitement des données JSON) deferred.done(function (jsonData) { EcritureLOG("OK", P_Pltf, "StatSNARP_SAI", WRqt, "Requête exécutée. "); // Ecriture du fichier LOG var update = false; if (jsonData[0].length > 0) { update = true; if ($("#LIG_TJ_LFPO").children().length == 0) { // addHTML("lfob", ["lfob_hg"], ["12"]); // on se place dans le div row ID="lfob", on crée une div lfob_hg col-md-12 addHTML("LIG_TJ_LFPO", ["lfpo_tj"], ["12"]); // Graph de gauche=LFPB / Graph de droite=LFOB } createGraph_TJ("LFPO", Annee, jsonData[0]); $("#lfpo_tj").removeClass("no-data"); // pour supprimer la classe } else { EcritureLOG("Err", P_Pltf, "LOG_StatSNARP_SAI", WRqt, "Requête vide. "); // Ecriture du fichier LOG // $("#LIG_TJ_LFPO").empty(); if (jsonData[0].length == 0) { if ($("#lfpo_tj").size() != 1) { // si la div #lfpg_hg existe déjà, pas la peine de la recréer. addHTML("LIG_TJ_LFPO", ["lfpo_tj"], ["12"]); } createGraph_TJ("LFPO", Annee, jsonData[0]); $("#lfpo_tj").addClass("no-data"); // pour ajouter la classe } } if (update) { $(".graph-loading").hide(); $("#btn-save-pdf").attr("disabled", false); $("#div-info").children('.message-p-info').html(''); $("#div-info").children('.icon-p-info').html(''); } else { $(".graph-loading").hide(); $("#div-info").children('.message-p-info').html('<strong>Certaines données sont indisponibles...</strong>'); $("#div-info").children('.icon-p-info').html('<i class="fa fa-exclamation-triangle fa-lg"></i>'); } }); P_Pltf = "LFPB"; var WRqt = "SELECT * FROM stattot2 WHERE ST_PLTF = '" + P_Pltf + "' and ST_ANNEE_REF = " + P_date + " ORDER BY ST_DATE_MOUV_N"; var deferred = $.get("./scripts/PHP/TraficJournalier_PLTF.php?date=".concat(P_date) + "&pltf=".concat(P_Pltf)); // Retour du serveur (traitement des données JSON) deferred.done(function (jsonData) { EcritureLOG("OK", P_Pltf, "StatSNARP_SAI", WRqt, "Requête exécutée. "); // Ecriture du fichier LOG var update = false; if (jsonData[0].length > 0) { update = true; if ($("#LIG_TJ_LFPB_LFOB").children().length == 0) { // addHTML("lfob", ["lfob_hg"], ["12"]); // on se place dans le div row ID="lfob", on crée une div lfob_hg col-md-12 addHTML("LIG_TJ_LFPB_LFOB", ["lfpb_tj_left", "lfob_tj_right"], ["6", "6"]); // Graph de gauche=LFPB / Graph de droite=LFOB } createGraph_TJ("LFPB", Annee, jsonData[0]); } else { EcritureLOG("Err", P_Pltf, "LOG_StatSNARP_SAI", WRqt, "Requête vide. "); // Ecriture du fichier LOG // $("#LIG_TJ_LFPB_LFOB").empty(); if (jsonData[0].length == 0) { if ($("#lfpb_tj_left").size() != 1) { // si la div #lfpg_hg existe déjà, pas la peine de la recréer. addHTML("LIG_TJ_LFPB_LFOB", ["lfpb_tj_left", "lfob_tj_right"], ["6", "6"]); // Graph de gauche=LFPB / Graph de droite=LFOB } createGraph_TJ("LFPB", Annee, jsonData[0]); $("#lfpb_tj_left").addClass("no-data"); // pour ajouter la classe } } if (update) { $(".graph-loading").hide(); $("#btn-save-pdf").attr("disabled", false); $("#div-info").children('.message-p-info').html(''); $("#div-info").children('.icon-p-info').html(''); } else { $(".graph-loading").hide(); $("#div-info").children('.message-p-info').html('<strong>Certaines données sont indisponibles...</strong>'); $("#div-info").children('.icon-p-info').html('<i class="fa fa-exclamation-triangle fa-lg"></i>'); } }); P_Pltf = "LFOB"; var WRqt = "SELECT * FROM stattot2 WHERE ST_PLTF = '" + P_Pltf + "' and ST_ANNEE_REF = " + P_date + " ORDER BY ST_DATE_MOUV_N"; var deferred = $.get("./scripts/PHP/TraficJournalier_PLTF.php?date=".concat(P_date) + "&pltf=".concat(P_Pltf)); // Retour du serveur (traitement des données JSON) deferred.done(function (jsonData) { EcritureLOG("OK", P_Pltf, "StatSNARP_SAI", WRqt, "Requête exécutée. "); // Ecriture du fichier LOG var update = false; if (jsonData[0].length > 0) { update = true; if ($("#LIG_TJ_LFPB_LFOB").children().length == 0) { // addHTML("lfob", ["lfob_hg"], ["12"]); // on se place dans le div row ID="lfob", on crée une div lfob_hg col-md-12 addHTML("LIG_TJ_LFPB_LFOB", ["lfpb_tj_left", "lfob_tj_right"], ["6", "6"]); // Graph de gauche=LFPB / Graph de droite=LFOB } createGraph_TJ("LFOB", Annee, jsonData[0]); } else { EcritureLOG("Err", P_Pltf, "LOG_StatSNARP_SAI", WRqt, "Requête vide. "); // Ecriture du fichier LOG // $("#LIG_TJ_LFPB_LFOB").empty(); if (jsonData[0].length == 0) { if ($("#lfob_tj_right").size() != 1) { // si la div #lfpg_hg existe déjà, pas la peine de la recréer. addHTML("LIG_TJ_LFPB_LFOB", ["lfpb_tj_left", "lfob_tj_right"], ["6", "6"]); // Graph de gauche=LFPB / Graph de droite=LFOB } createGraph_TJ("LFOB", Annee, jsonData[0]); $("#lfob_tj_right").addClass("no-data"); // pour ajouter la classe } } if (update) { $(".graph-loading").hide(); $("#btn-save-pdf").attr("disabled", false); $("#div-info").children('.message-p-info').html(''); $("#div-info").children('.icon-p-info').html(''); } else { $(".graph-loading").hide(); $("#div-info").children('.message-p-info').html('<strong>Certaines données sont indisponibles...</strong>'); $("#div-info").children('.icon-p-info').html('<i class="fa fa-exclamation-triangle fa-lg"></i>'); } }); } ... ... ... function EcritureLOG(P_Type, P_Pltf, P_Fichier, P_Rqt, P_Message) { //var WNomFichier = "m_sg_to_log_heures_glissantes_TEST.txt"; var WChemin = "../../LOG/"; // Ecriture dans la BLADE 2500 var WNomFichierLog = WChemin + P_Fichier + "_" + P_Pltf + ".log"; var WMessage = P_Message + "\r\n"; var WRqt = P_Rqt + "\r\n"; var EcritureLog = $.get("./scripts/PHP/EcritureLog2.php?nomfic=".concat(WNomFichierLog) + "&message=".concat(WMessage) + "&rqt=".concat(WRqt)); } ... ... ...
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 <?php header('Content-Type: application/json; charset=UTF-8'); $chemin0 = '..\\..\\LOG\\'; $chemin1 = '//mnt//blade//vista//exe//vistaGuichet//demandes_in_out//'; // Ecriture dans la BLADE 2500 $nomfic = (isset($_GET['nomfic'])) ? $_GET['nomfic'] : NULL; $message = (isset($_GET['message'])) ? $_GET['message'] : NULL; $rqt = (isset($_GET['rqt'])) ? $_GET['rqt'] : NULL; //Récupération de la Date et Heure $date = date("d-m-Y"); $heure = date("H:i"); // $ip_Svr = $_SERVER["SERVER_ADDR"]; // ip du serveur // $ip_clt = $_SERVER["REMOTE_ADDR"]; // ip client // Enregistrement dans un fichier TXT $WNomFichier = "$nomfic"; // $fp =fopen("d:\ips.txt","a+"); $fp =fopen($WNomFichier,"a+"); // Ouvre le fichier en R & W. Si le fichier n'existe pas, il est automatiquement créé. fwrite ($fp, " $date $heure (TU) || $message || $rqt \r\n"); fclose($fp); ?>
Lorsque j'écris le fichier log, j'ai toujours la même chose dedans :
Or je voudrai bien avoir une fichier différent pour chaque plateforme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 19-12-2018 14:57 (TU) || Requête exécutée. || SELECT * FROM stattot2 WHERE ST_PLTF = 'LFOB' and ST_ANNEE_REF = 2018 ORDER BY ST_DATE_MOUV_N 19-12-2018 14:57 (TU) || Requête exécutée. || SELECT * FROM stattot2 WHERE ST_PLTF = 'LFOB' and ST_ANNEE_REF = 2018 ORDER BY ST_DATE_MOUV_N 19-12-2018 14:57 (TU) || Requête exécutée. || SELECT * FROM stattot2 WHERE ST_PLTF = 'LFOB' and ST_ANNEE_REF = 2018 ORDER BY ST_DATE_MOUV_N 19-12-2018 14:57 (TU) || Requête exécutée. || SELECT * FROM stattot2 WHERE ST_PLTF = 'LFOB' and ST_ANNEE_REF = 2018 ORDER BY ST_DATE_MOUV_N
Sauf que je ne vois pas comment insérer la fonction asynchrone pour écrire le fichier log à chaque fois que je l'appelle vu que je veux juste écrire dans le fichier log pour le traçage et continuer l'exécution normalement ?
Zeb'...
Oulà, y’a beaucoup de code. Et beaucoup de répétitions aussi, j’ai pas regardé en détail mais il doit y avoir moyen d’écrire une fonction pour éviter de répéter du code.
Il y a un truc qui m’inquiète : ces requêtes SQL qui apparaissent dans le code JavaScript. Est-ce que tu les exécutes vraiment sur ta base de données après ? Si oui, c’est une grosse vulnérabilité. Toute personne qui lit ton code JavaScript peut voir comment fabriquer une requête ajax pour envoyer une requête SQL de son choix — une commande DROP, un SELECT infini qui met ton serveur en DoS, etc. Bref une bonne vieille injection SQL.
Et même si tes requêtes ne sont pas exécutées telles quelles, il vaut mieux en montrer le moins possible par principe de précaution. Laisse le SQL côté serveur
Pour répondre à ta question, le problème est simple : tu utilises les mêmes variables P_Pltf et WRqt pour toutes tes écritures de log. En gros, ton code fait ça :
Le deferred.done de jQuery a le même effet que l’instruction await : il « met en attente » la fonction que tu lui passes.
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 P_Pltf = " ... "; var WRqt = " ... "; var deferred = ... ; deferred.done(function (jsonData) { ... }); P_Pltf = " ... "; var WRqt = " ... "; var deferred = ... ; deferred.done(function (jsonData) { ... }); P_Pltf = " ... "; var WRqt = " ... "; var deferred = ... ; deferred.done(function (jsonData) { ... }); P_Pltf = " ... "; var WRqt = " ... "; var deferred = ... ; deferred.done(function (jsonData) { ... });
Les fonctions passées à deferred.done() sont traitées de manière asynchrone. En plus de ça, tu ne peux pas savoir dans quelle ordre elles seront appelées : ça dépend du temps de réponse des requêtes, et ça peut aussi dépendre de détails d’implémentation du moteur JS qu’on n’est pas censés connaître.
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 x P_Pltf = " ... "; x var WRqt = " ... "; x var deferred = ... ; | x deferred.done ----------------- | \ x P_Pltf = " ... "; \ x var WRqt = " ... "; \ x var deferred = ... ; \ | | x deferred.done ---------------- | | \ | x P_Pltf = " ... "; \ | x var WRqt = " ... "; \ | x var deferred = ... ; | | | | | x deferred.done --------------- | | | \ | | x P_Pltf = " ... "; \ | | x var WRqt = " ... "; | | | x var deferred = ... ; | | | | | | | x deferred.done -------------- | | | \ | | | | | | | \ \ / / ? / / \ \ | | | | | | | x function (jsonData) { ... } | | x function (jsonData) { ... } | x function (jsonData) { ... } x function (jsonData) { ... }
Dans le fil principal tu as donc les dernières valeurs de P_Pltf et WRqt qui écrasent les valeurs précédentes (les mots-clés var n’y changent rien), et ce sont ces dernières valeurs qui sont utilisées dans chaque appel à EcritureLOG. C’est pour ça que tu vois quatre fois la même chose dans ton log.
Ce problème ressemble à celui décrit dans la FAQ Comment attribuer à des objets un onclick faisant appel à une variable de boucle ?
Pour régler le problème, donne des noms différents à tes variables, ou bien encapsule chaque partie dans une fonction pour créer une nouvelle portée.
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Oui, je me doutais que quelqu'un me ferait la remarque
J'ai été au plus simple, mais je vais surement reprendre cette partie dés que j'aurai plus de temps.
Alors là, je débarque.
Qu'est-ce que tu veux dire ? Les requêtes sont bien exécutées ?
Par contre, c'est de l'intranet et "on" me dit que ça ne risque rien, que la sécurité est suffisante en amont.
Je ne savais pas pour le deferred.done, c'est bon à savoir.
Donc, si j'ai bien compris : la solution la plus simple sera d'utiliser des variables différentes pour chaque "bloc", si je laisse comme ça ou alors d'éviter la répétition en utilisant une fonction.
Super, yapuka
Merci, merci.
Zeb'...
C’est la question que je pose. Tout ce que je vois dans le code que tu as donné, c’est que les chaînes contenant les requêtes SQL sont envoyées dans un fichier de log.
Mais si, à un moment ou un autre, ces requêtes en provenance du client sont bel et bien exécutées sur la base de données, alors faille il y a.
Je ne suis pas expert en injection SQL, mais voici un exemple simple d’attaque utilisant une requête ajax fabriquée sur ton site au moyen de la console. Exécute-la (je te promets qu’elle ne fait rien de destructeur) et vois ce qui apparaît dans ton log.
Je ne remets pas ça en doute. Mais le risque zéro n’existe pas. Si, à un moment, un attaquant ou une attaquante parvient à s’introduire dans l’intranet, alors ta vulnérabilité devient un vecteur d’attaque vers la base de données. Il faut éviter d’être le maillon faible de la chaîne de sécurité.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 let req = new XMLHttpRequest(); req.open("GET", "./scripts/PHP/TraficJournalier_PLTF.php?pltf=1&date=" + encodeURIComponent("'1970-01-01' OR TRUE --")); req.send();
Oui
De rien
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Alors oui... et non : les requêtes de TraficJournaliers.php sont bien exécutées, mais pas celle du LOG qui n'est qu'un très simple traçage.
Par contre, le souci (mon souci ? ) est qu'on ne m'a montré que cette manière d'exécuter du SQL !!!
Oulala, je sens que l'année 2019 va commencer sur les chapeaux de roues
Zeb'...
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Bah si, elles sont dans le fichier TraficJournalier.php.
Ce que je disais, c'est que la fonction EcritureLOG ne fait qu'écrire un fichier TXT contenant les requêtes exécutées sous forme de texte.
Ou alors, je n'ai pas compris ce que tu voulais dire ?
Zeb'...
Est-ce qu’il s’agit du code PHP que tu donnes dans ton message #15 ?
Actuellement, ce que je comprends c’est qu’il y a un script PHP qui communique vraiment avec la base de données, et qu’à un autre endroit tu as aussi des requêtes ajax envoyant au serveur du code SQL qui est journalisé mais jamais exécuté. Du coup je ne comprends pas l’intérêt.
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Bonjour et bonne année
Désolé de répondre si tardivement, mais vacances de fin d'année oblige
Alors au message 15, c'est la requête qui permet de récupérer la plus petite année présente dans la table.
Ensuite, à d'autres endroits, nous gardons dans un fichier LOG, les accès aux différentes tables ; c'est un tout bête fichier texte qui contient une simple copie de la requête exécutée.
Zeb'...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager