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 :

Objet XMLHttpRequest ne se crée pas


Sujet :

AJAX

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Objet XMLHttpRequest ne se crée pas
    Bonjour,

    Je voudrais accéder à un fichier php via un XMLHttpRequest, mais celui-ci ne se crée pas...

    Y-a-t'il une bibliothèque à charger avant ? Ou quelque chose de mal fait ?

    Voici le code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     function AfficheCoordonnees(idClient, idAgent){
     
                       xhr = new XMLHttpRequest(); 
                    // Ici on va voir comment faire du post
                    xhr.open("GET","../php/ajax-coord.php",true);
                    // ne pas oublier ça pour le post
                    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                    // ne pas oublier de poster les arguments
                    xhr.send("idClient="+idClient+"&idAgent="+idAgent);
     alert(xhr.status);
                }
    Aucune consultation du fichier ajax-coord.php, et l'alerte me renvoie sans cesse "0"....

    Pouvez-vous m'aider svp ?

    Merci d'avance

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 413
    Points : 4 856
    Points
    4 856
    Par défaut
    Salut,

    Le retour de l'objet XMLHttpRequest doit être géré dans le callback readystatechange et pas ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    xhr.onreadystatechange = function () {
      if(xhr.readyState === 4 && xhr.status === 200) {
        console.log(xhr.responseText);
      }
    }
    xhr.send("idClient="+idClient+"&idAgent="+idAgent);

  3. #3
    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 yves51 Voir le message
    Y-a-t'il une bibliothèque à charger avant ?
    Non, XMLHttpRequest est pris en charge nativement par tous les navigateurs.

    Ou quelque chose de mal fait ?
    À tout hasard, si ton script est en mode strict, alors ton instruction xhr = ... échoue car la variable n’est pas déclarée. Dans tous les cas, je te conseille de passer en mode strict, surtout si du débutes, ça ne coûte pas grand chose et ça fait prendre de bonnes habitudes
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci pour les conseils

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    J'ai pu avancer, le fichier ajax-coord.php est effectivement ouvert avec les paramètres, mais j'ai toujours un pb : à aucun moment je ne me retrouve dans la condition
    if(xhr.readyState == 4 && xhr.status == 200)

    Quand je lance la fonction, j'obtiens une alerte (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(xhr.readyState + " - " + xhr.status
    )) avec "4 - 0" - mais jamais je n'obtiens le 'ok'.

    D'où cela peut venir ?

    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
    function AfficheCoordonnees(idClient, idAgent){
     
    var xhr = getXhr();
     
    xhr.open("POST","../php/ajax-coord.php",true);
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    xhr.send("idClient="+idClient+"&idAgent="+idAgent);
     
     
    xhr.onreadystatechange = function()
        {
         alert(xhr.readyState + " - " + xhr.status);
         if(xhr.readyState == 4 && xhr.status == 200)
         {
         alert('ok');
         }
        }
    }

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    D'autre part, même si la requête d'enregistrement d'une nouvelle ligne fonctionne dans le fichier php, je renvoie ensuite un texte à l'aide d'un echo.

    Cependant aucune valeur ne ressort de xhr.responseText...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           if(xhr.readyState == 4 )
         {
         alert(xhr.responseText);
         }
    L'alerte fonctionne, mais elle est vide...

  7. #7
    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
    Quand status = 0, ça signifie que la requête n’est pas partie, sinon tu aurais un code serveur, même en cas d’erreur (par exemple 404). Souvent c’est le signe que la requête a été bloquée par la politique de même origine (same origin policy), et dans ce cas tu aurais un message d’erreur dans la console.

    Au risque d’enfoncer des portes ouvertes, vérifie également que tu es bien en http: (ou https:) sur un serveur local. Si tu es en file:, ne cherche pas plus loin, le problème est là

    Sinon, je m’écarte un peu du sujet mais j’ai remarqué que tu as modifié les triple-égal (===) de Toufik83. Il faut savoir que le double-égal en JavaScript est traître : il fait de la conversion implicite de type, et peut causer des résultats inattendus. Pour éviter de futurs maux de tête, prends l’habitude d’utiliser le triple-égal, c’est ton ami (Plus de détails : Opérateurs de comparaison)
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci pour tout, je regarde cela !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Effectivement j'avais réduit à == pour me laisser plus de chances, et surtout enlevé le xhr.status === 200. Ca a fonctionné pendant un moment, puis non.

    Je vois par endroits que cela pourrait venir des mots de passe et login utilisateurs...

    La page initale est accessible par un session avec login et mdp, mais pas la page ajax-coord.php. Dois-je néanmoins passer les paramètres ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Je précise qu'à chaque fois que le script ne fonctionne pas, le fichier ajax-coord.php est pourtant bien ouvert, la requête créant un nouvel enregistrement est bien lancée à chaque fois...
    Cependant je ne me retrouve pas dans la condition xhr.readyState === 4 && xhr.status === 200, et le code de validation n'est pas lancé...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    j'ai bien essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xhr.open("POST","https://www.coupefile-immobilier.pro/js/ajax-coord.php",false,"user", "mdp");
    mais pas plus de résultat...

  12. #12
    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 yves51 Voir le message
    Effectivement j'avais réduit à == pour me laisser plus de chances, et surtout enlevé le xhr.status === 200. Ca a fonctionné pendant un moment, puis non.

    Je vois par endroits que cela pourrait venir des mots de passe et login utilisateurs...

    La page initale est accessible par un session avec login et mdp, mais pas la page ajax-coord.php. Dois-je néanmoins passer les paramètres ?
    Ça dépend s’il s’agit d’une authentification HTTP (le genre où le navigateur ouvre une fenêtre spéciale pour demander les identifiants, et le genre qui renvoie des erreurs 401) ou si c’est une session gérée par PHP.

    Citation Envoyé par yves51 Voir le message
    j'ai bien essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xhr.open("POST","https://www.coupefile-immobilier.pro/js/ajax-coord.php",false,"user", "mdp");
    mais pas plus de résultat...
    Cette syntaxe est prévue pour l’authentification HTTP.

    Dans le cas d’une session PHP, c’est toi (ou plutôt ton code serveur) qui gère l’authentification « à la main », et les identifiants sont passés comme des paramètres GET ou POST ordinaires.

    Je suis en train de me dire que peut-être le problème vient d’alert. Je n’utilise plus cette fonction depuis un moment et je ne sais pas comment les navigateurs gèrent ça aujourd’hui. Il n’y a encore pas si longtemps, un appel à alert interrompait le script jusqu’à ce que tu cliques sur « OK ». Aujourd’hui, peut-être que ton script, en particulier la requête ajax, continue en arrière-plan, et donc quand l’alerte indique que status est 0, en fait sa valeur a changé entre temps.
    (Je ne sais pas si je suis très clair.)
    Il faut savoir aussi que le readyState est susceptible de changer plusieurs fois et donc de provoquer plusieurs appels à onreadystatechange. Tu trouveras peut-être plus pratique d’utiliser onload à la place.

    Dans tous les cas, remplace alert() par console.log() et ouvre la console pour voir les messages
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci, c'est vrai que je suis peu habitué à utiliser la console....

    Voilà ce qu'elle m'indique :
    Access to XMLHttpRequest at 'ajax-coord.php' from origin 'site.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
    J'ai recherché sur les forums mais je ne vois pas exactement comment intégrer le 'Access-Control-Allow-Origin' dans mon code... Dois-je indiquer l'adresse globale du site ou la page php, ou la page d'origine ?

    Est-ce que cela passe par xhr.setRequestHeader ?

    Je précise que les 2 fichiers sont pourtant bien sur le même site...

    Merci pour les retours en tout cas

  14. #14
    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 yves51 Voir le message
    Je précise que les 2 fichiers sont pourtant bien sur le même site...
    Il doit y avoir une différence, sinon la requête n’aurait pas été bloquée. Vérifie entre autres qu’il n’y a pas un mélange de tantôt http:, tantôt https:, et si la partie www. est toujours présente ou pas.
    Les règles qui définissent si deux sites sont différents ou pas sont résumées ici : origine.

    L’ajout de l’en-tête Access-Control-Allow-Origin se fait côté serveur. On ne peut pas faire ça côté client, ça fait partie du mécanisme de sécurité. En PHP, on utilise la fonction header(). Si tu prévois de faire une API publique, utilise l’origine joker * ; sinon, mets l’origine de la page depuis laquelle la requête ajax est faite.
    Par exemple, si la page qui fait la requête ajax est sous l’origine https://www.coupefile-immobilier.pro, ton code PHP contiendra ceci :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    header('Access-Control-Allow-Origin: https://www.coupefile-immobilier.pro');
    header('Vary: Origin');
    L’en-tête Vary est là pour éviter des problèmes de cache, comme expliqué sur le MDN : Access-Control-Allow-Origin.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/03/2017, 15h05
  2. Problème de connexion au cloud via la VM créée sur Azure
    Par Cedric53000 dans le forum Microsoft Azure
    Réponses: 6
    Dernier message: 03/11/2016, 10h05
  3. Objet Connection ne se crée pas
    Par Dynamic dans le forum JDBC
    Réponses: 1
    Dernier message: 16/12/2009, 12h24
  4. Réponses: 11
    Dernier message: 13/10/2003, 14h48
  5. problème de connexion 2 PC
    Par guitalca dans le forum Développement
    Réponses: 3
    Dernier message: 22/09/2003, 14h04

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