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

AJAX Discussion :

Récupérer une valeur à partir d'une requête SQL


Sujet :

AJAX

  1. #21
    Invité
    Invité(e)
    Par défaut
    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" ?

  2. #22
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par Zebulon777 Voir le message
    C'est le $(document).ready(async function () { qu'il n'aime pas,
    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.
    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;
    };
    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.

    … 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
        // l’instruction await dit au script « d’attendre » l’arrivé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 !

  3. #23
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    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
        // l’instruction await dit au script « d’attendre » l’arrivé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'...

  4. #24
    Invité
    Invité(e)
    Par défaut
    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.

  5. #25
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    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'...

  6. #26
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par Zebulon777 Voir le message
    - 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 ?
    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.

    Citation Envoyé par Zebulon777 Voir le message
    - 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) ?
    Citation Envoyé par Zebulon777 Voir le message
    - Donc, si j'ai bien compris, c'est tout le code qui est assujettis au mode asynchrone ?
    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 :
    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";
    })()
    Sous Firefox 64, j’ai ce résultat :
    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A
    B
    D
    << "ok"
    C

    Le déroulement de l’exécution peut être schématisé comme ça :
    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")
    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.

    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.

    Citation Envoyé par Zebulon777 Voir le message
    PS : c'est cool et pratique de pouvoir mettre de la couleur dans le console.log, je ne connaissais pas
    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 !

  7. #27
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    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'...

  8. #28
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par Zebulon777 Voir le message
    Edit : une dernière question : pourquoi est-ce qu'il y a () à la fin de la fonction ?
    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 !

  9. #29
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Ha ok.
    Va falloir que je m'en souvienne de celui-là.

    Encore merci beaucoup pour ton aide et ta patience.
    Zeb'...

  10. #30
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    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 :

    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
    Or je voudrai bien avoir une fichier différent pour chaque plateforme.

    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'...

  11. #31
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    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 :
    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) { ... });
    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
    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) { ... }
    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.

    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 !

  12. #32
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Citation Envoyé par Watilin Voir le message
    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.
    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.

    Citation Envoyé par Watilin Voir le message
    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
    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.

    Citation Envoyé par Watilin Voir le message
    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 :
    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) { ... });
    Le deferred.done de jQuery a le même effet que l’instruction await : il « met en attente » la fonction que tu lui passes.
    Je ne savais pas pour le deferred.done, c'est bon à savoir.

    Citation Envoyé par Watilin Voir le message
    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) { ... }
    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.

    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.
    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'...

  13. #33
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par Zebulon777 Voir le message
    Qu'est-ce que tu veux dire ? Les requêtes sont bien exécutées ?
    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.
    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();
    Citation Envoyé par Zebulon777 Voir le message
    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 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é.

    Citation Envoyé par Zebulon777 Voir le message
    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.
    Oui

    Citation Envoyé par Zebulon777 Voir le message
    Merci, merci.
    De rien
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  14. #34
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    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'...

  15. #35
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par Zebulon777 Voir le message
    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 !!!
    C’est-à-dire ? Tu ne sais pas à quel endroit sont faites les vraies requêtes SQL ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  16. #36
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    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'...

  17. #37
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par Zebulon777 Voir le message
    Bah si, elles sont dans le fichier TraficJournalier.php.
    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 !

  18. #38
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    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'...

Discussions similaires

  1. Réponses: 19
    Dernier message: 19/03/2018, 09h05
  2. [MySQL] Récupérer une valeur à partir d'une liste select
    Par xymagic dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 15/11/2011, 11h22
  3. ecrire à partir d'une macro sous excel une valeur dans une base sql server
    Par Guena5635 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/04/2008, 08h53
  4. Réponses: 10
    Dernier message: 30/11/2006, 23h06
  5. Réponses: 3
    Dernier message: 22/01/2005, 22h06

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