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 :

Requête mysql lancée par ajax comportement bizarre


Sujet :

AJAX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 107
    Points : 73
    Points
    73
    Par défaut Requête mysql lancée par ajax comportement bizarre
    Bonjour,

    J'ai un problème que je ne parviens pas à résoudre. je ne sais pas si il vient d'ajax (via $.getJSON) ou de mysql... j'ai donc choisi de poster dans le forum ajax.

    Donc :
    J'envoie des données à inserer dans une base mysql en utilisant $.getJSON. Les données sont envoyées à ajax_nature_ajouter.php.

    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
     
    $.getJSON(
    	"ajax_nature_ajouter.php",
    	{
    	"nat_denomination" : $("#nat_denomination").val(),
    	"nat_montant" : $("#nat_montant").val(),
    	"id_client" : $("#id_client").val(),
    	"id_dossier" : $("#id_dossier").val(),
    	"id_formalite" : $("#id_formalite").val(),
    	"id_participant" : $("#id_participant").val()
    	},
    	function(data) {
     
    		if(data['nature_ajoute']){
     
    			//MISE A JOUR DE L'AFFICHAGE DE LA LISTE DES APPORTS NATURE
    			lnat=data['liste_apports_nature'];
     
    			//String a afficher de la liste des apports natures
    			var stnat="";
     
    			for (var i=0;i<lnat.length;i++){
    				//Génération de la string 'liste des apports nature' à afficher ensuite
    				stnat=stnat+"<div class=\"col-md-4\">"+lnat[i]['nat_denomination']+"</div><div class=\"col-md-4 text-right\">"+lnat[i]['nat_montant']+" euros</div><br>";
    				//Génération des nouvelles options pour le menu select de suppression des apports
    				opt=opt+"<option value=\""+lnat[i]['id']+"\">"+lnat[i]['nat_denomination']+"</option>";
    			}
     
    			$("#liste_nature").empty("");
    			$("#liste_nature").html("<br>"+stripslashes(stnat));
    			$("#nat_denomination").val('');
    			$("#nat_montant").val('');					
    		}
     
    	}
    );
    Et le fichier ajax_nature_ajouter.php de traitement côté serveur :

    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
     
    //données récupérées
    $nat_denomination=trim($_GET['nat_denomination']);
    $nat_montant=(int)trim($_GET['nat_montant']);
    $id_client=(int)trim($_GET['id_client']);
    $id_dossier=(int)trim($_GET['id_dossier']);
    $id_formalite=(int)trim($_GET['id_formalite']);
    $id_participant=(int)trim($_GET['id_participant']);
     
    $nature_ajoute=false;
     
    if(
    	mysql_query("INSERT INTO `participants_apports_nature` (
    		id_client,
    		id_dossier,
    		id_formalite,
    		id_participant,
    		nat_denomination,
    		nat_montant
    		) VALUES (
    		'".$id_client."',
    		'".$id_dossier."',
    		'".$id_formalite."',
    		'".$id_participant."',
    		'".protect_mysql($nat_denomination)."',
    		'".$nat_montant."'
    		)")
    ){
    	$nature_ajoute=true;
     
    	//Nouvelle liste des apports en nature
    	$req_nature=mysql_query("SELECT * FROM `participants_apports_nature` WHERE `id_participant`='".$id_participant."'");
    	$liste_apports_nature=array();
    	while($line=mysql_fetch_assoc($req_nature)){
    		$liste_apports_nature[]=$line;
    	}
     
    }
     
    //Tableau du résultat
    $resultat=array(
    'nature_ajoute'=>$nature_ajoute,
    'liste_apports_nature'=>$liste_apports_nature
    );
     
    //envoi des résultat à la page
    print(json_encode($resultat));
    le but est d'enregistrer dans la base une dénomination (nat_denomination) et une valeur en euro (nat_montant).
    Quand on déclenche l'appel ajax en cliquant sur un bouton, les champs d'id nat_denomination et nat_montant sont lu et leurs valeurs passée en ajax à ajax_nature_ajouter.php avec d'autres valeurs (ces autres valeurs ne changent jamais, seuls nat_denomination et nat_montant peuvent être modifiées).

    côté serveur ajax_nature_ajouter.php insert donc ces données dans la base. Puis il fait un SELECT pour trouver les autres entrées déjà faite par le même utilisateur. ajax_nature_ajouter.php renvoie alors true ou false pour savoir si l'insert à fonctionné. Il renvoit également un tableau qui contient les autres entrées faite par le même utilisateur.

    je constate ce comportement bizarre :

    - Quand j'execute une première fois tout ce bazar, tout marche super. Je rentre mes données dans nat_denomination (disons "un camion") et nat_montant (disons "40000") , je clique sur le bouton et je constate que dans la base de donnée une ligne a bien été insérée.

    - Une autre ligne avec d'autres valeurs : tout est ok.

    - par contre si j'essaye d'entrer une nouvelle fois des valeurs déjà entrée et bien ça ne marche pas... Autrement dit, si je rentre une deuxième fois "un camion" dans nat_denomination et "40000" dans nat_montant, rien ne s'insert dans la base... Une seule ligne avec "un camion" et "40000" apparait.

    - le plus étrange c'est que si je le fait d'une autre machine avec les mêmes valeurs, là ca marche... Par contre si sur cette dernière machine je tente le coup une fois de plus et bin ça marche plus.

    - encore plus étrange : si je supprime manuellement de la base la ligne qui contient "un camion" et "40000" (des fois que ) et bien ça ne change rien du tout. Impossible d'entrer une seconde fois ces valeurs même à 2 heures d'interval (oui... j'ai émis les hypothèses les plus farfelues).

    j'ai testé plein de trucs : récupérer les données dans ajax_nature_ajouter.php avec un $_GET, un $_REQUEST, un $_POST. Désactiver explicitement le cache mysql et d'autres trucs les plus tordus (vu que je n'ai plus d'idées...).

    Il y a forcément quelque-chose qui ne va pas mais quoi ça...

    Je penche plus pour un problème ajax car lorsque j'exécute ajax_nature_ajouter.php sans l'appeler par ajax, cela marche sans problèmes.

    J'ai plein d'autres requêtes de ce type qui marchent parfaitement sur d'autre page de mon site et c'est la première fois que je rencontre ce problème.

    Voilà... Si quelqu'un a une idée...

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 107
    Points : 73
    Points
    73
    Par défaut
    Bon j'ai trouvé une solution pour contourner le problème.

    j'ai pu vérifier qu'en fait ma fonction $.getJSON n'arrive pas à traiter deux fois d'affilée des données identiques... Pourquoi ça... D'autant plus que j'utilise ce principe à plein d'autres endroit sur mon site et eux marchent... bref.

    Pour que les données ne soient jamais les mêmes, j'ai simplement ajouter une donnée avec une valeur aléatoire au moment de l'envoi et ça marche super. Cette donnée ne sert strictement à rien et n'est même pas stockée dans la base... Elle garantie simplement que les données get envoyées au serveur soient toujours différentes d'un envoi à l'autre.

    par exemple au lieu d'envoyer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $.getJSON(
    	"ajax_nature_ajouter.php",
    					{
    	"nat_denomination" : "camion",
    	"nat_montant" : "40000",
    	"id_client" : "1236",
    	"id_dossier" : "1278",
    	"id_formalite" : "7895",
    	"id_participant" : "4563"
    	},
    	function(data) { etc... etc...
    j'envoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $.getJSON(
    	"ajax_nature_ajouter.php",
    					{
    	"nat_denomination" : "camion",
    	"nat_montant" : "40000",
    	"id_client" : "1236",
    	"id_dossier" : "1278",
    	"id_formalite" : "7895",
    	"id_participant" : "4563",
            "nombre_aleatoire" : (Math.random()*(100-1)+1)
    	},
    	function(data) { etc... etc...
    j'ai ajouté une variable nombre_aleatoire entre 1 et 100. Cette valeur change à chaque tentative et fait que ça marche...

    je ne sais que ce sont des données identiques 2 fois d'affilée qui plantent, je ne sais pas pourquoi, mais j'ai pu le contourner...

    N'empêche que si quelqu'un peu m'expliquer, je serais heureux d'être moins bête ce soir

  3. #3
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    c'est visiblement bien un problème de cache auquel tu as affaire et la méthode utilisé est correcte.

    [EDIT]

    Je complète un peu ma réponse.

    Tu pourrais également utiliser directement la méthode $.ajax, $.getJSON n'en étant qu'un raccourci.
    Dans ce cas tu pourras mettre l'option cache à false
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $.ajax({
        dataType: "json",
        url: url,
        data: data,
        cache: false,
        success: success
    }
    );

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 107
    Points : 73
    Points
    73
    Par défaut
    Super ! Je n'était vraiment pas loin de la réponse... j'avais bien testé aussi avec $.ajax mais l'option cache m'est complètement passée à côté... Donc ça marche et c'était bien là le problème. Par contre j'aimerai bien savoir pourquoi le navigateur met en cache cette transaction ajax et pas les autres... Car j'ai plein d'exemples sur mon site où des requêtes ajax identiques sont envoyées d'une même page et je n'ai pas ce problème...

    Merci pou l'éclaircissement, maintenant je connais le truc

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Par contre j'aimerai bien savoir pourquoi le navigateur met en cache cette transaction ajax et pas les autres...
    il est des mystères qui appartiennent aux navigateurs. (Il doit bien exister de la littérature sur la gestion des caches, mais bon il faut d'abord la chercher avant ... de la lire)

    Pense au résolu !

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

Discussions similaires

  1. [AJAX] Comportement bizarre d’IE avec les requêtes AJAX
    Par yassinbean dans le forum jQuery
    Réponses: 2
    Dernier message: 26/04/2013, 17h52
  2. [AC-2007] Comportement bizarre d'un bat lancé par un shell
    Par tibofo dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/01/2010, 21h45
  3. [AJAX] Affichage de requête PHP dans un div créé par Ajax
    Par will89 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/12/2007, 19h00
  4. Requête mysql (rechercher tout ce qui commence par).
    Par toffff dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/03/2007, 09h44

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