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

jQuery Discussion :

Traitement erreur accès base de données


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut Traitement erreur accès base de données
    Bonjour à tous,

    Bon cette fois-ci, c’est un vrai florilège de questions sur le comportement AJAX + PHP + JSON + Accès à une base de données

    Je ne sais pas enfin de compte si le traitement d’erreur provient :
    1. Du type d’erreur suite à l'accès à une base de données
    2. De l’existence d’un caractère spécial dans la chaine JSON avec un ô


    Ca parait un peu obscure mais après lecture de la suite, je suis certain que cela va s'éclaircir!

    Avant de commencer, je dois préciser que j'ai ajouté dans fichier de configuration d'Apache httpd.conf. de mon WampServer en local la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddDefaultCharset UTF-8
    Maintenant rentrons dans le cœur du sujet qui fait débat:

    Sur l’événement Onclick d’un bouton d’une form HTML, la fonction JavaScript est lancée:
    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
     function logIn(){
       alert("connexion debut");
        try{
          var serialData = $( "#frmLogIn" ).serialize();
                $.ajax
                (   {   type: "POST",
                        url: "logInTest.php",
                        data: serialData,
                        dataType: "json",
                        success: function(dataSQL, statut)
                        {   alert("msg" + dataSQL["msg"]);
                        },
                        error: function(dataSQL, statut)
                        {   alert("msg " + dataSQL["msg"]);
                        }
                    }
                );
        }
        catch (e)
        {   alert ('An error has occurred: '+ e.message);
        }
    }
    Le code de la page PHP est:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     <?php
    session_start();
     
    error_reporting(E_ALL);
    ini_set( 'display_errors','1');
     
    require "dbConnect.php";
     
    header('Content-Type: application/json; charset=utf-8');
    $user = urldecode($_POST["txtUser"]);
    $pwd = urldecode($_POST["txtpwd"]);
     
    $sqlSelect = " SELECT * FROM participant WHERE USER = '$user' AND PWD = '$pwd'";
     
    try
    {   $dbConnect = dbConnection();
        $dataSet = $dbConnect->query($sqlSelect);
        $rowsArray = $dataSet->fetchAll();
        $returnData =  json_encode($rowsArray);    
        if (count($rowsArray)>0)
        {   $_SESSION["userID"] = $rowsArray[0]["IDPARTICIPANT"];  
        }
     
    }catch (PDOException $e)
    {  $stringVar = utf8_encode($e->getMessage());
       $msg =  array("msg" =>  $stringVar);
       $returnData = preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($msg));
       //die();
    }
     
    $dbConnect = null;// Fermeture connexion
    echo $returnData;
    ?>

    L’auteur de la fonction preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($Varaible)); : est à cette adresse http://benjion.wordpress.com/2013/01...s/#comment-489


    Et le code de la page de connexion php est :
    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
     <?php
    function dbConnection()
    {   $options = array( 
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
        );
     
        $host = "localhost1";
        $dbname = "questionnaire1";    
        $dsn = "mysql:host=". $host.";dbname=".$dbname; //$dsn = 'mysql:dbname=xoccaslite;host=127.0.0.1';
        $username = 'root';
        $password = '';
            $dbConnect = new PDO($dsn, $username, $password, $options);
     
        return $dbConnect;
     }
    ?>


    Bon coté codage a priori pas de problème

    Maintenant ça se corse quand
    1. l’erreur sur la base de données est sur la connexion - $dbConnect = new PDO($dsn, $username, $password, $options) -- ou sur l’exécution de la la requête
    2. Sur l’encode JSON


    Reprenons gentiment l’un après l’autre les problèmes :
    1. l’erreur sur la base de données est sur la connexion - $dbConnect = new PDO($dsn, $username, $password, $options) -- ou sur l’exécution de la la requête


    Si c’est une erreur sur $dbConnect = new PDO($dsn, $username, $password, $options) en raison d’un host = localhost1 inexistant alors
    C’est bien trappé comme erreur et après traitement , ce message est renvoyé à AJAX sous forme d’une chaine au format JSON = "{"msg":"SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte inconnu. "}"
    Nom : php1.jpg
Affichages : 234
Taille : 81,1 Ko

    Par contre l’erreur est traitée dans AJAX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error: function(dataSQL, statut)
        {   alert("msg " + dataSQL["msg"]);
    }

    1. ma variable dataSQL d’AJAX qui récupère les données envoyées par le server se transforme en Objet avec toute sa description cf ci-dessous
    2. alert("msg " + dataSQL["msg"] renvoie msg undefined
    Nom : error1.jpg
Affichages : 258
Taille : 192,5 Ko

    Alors que si c’est un problème de nom de table par exemple c’est traité coté AJAX par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    success: function(dataSQL, statut)
        {   alert("msg " + dataSQL["msg"]);
    }
    Et
    alert("msg " + dataSQL["msg"] renvoie bien msg SQLSTATE[HY000] [1049] Unknown database 'questionnaire1'. Cf. ci-dessous
    Nom : error2.jpg
Affichages : 269
Taille : 132,2 Ko


    Je m’arrache les cheveux sur ce problème même si maintenant je n’ai plus à la place de ô le signe cabalistique \fffutd.

    Merci à tous pour vos solutions

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je suis partagé entre
    - le genre de pensée chamane qu'il faut avoir pour présenter tout ça alors que tes observations prouvent très très clairement que le problème vient dans l'interprétation AJAX de la réponse reçue, et absolument pas dans la base de données ou le PHP (puisque la réponse envoyée à la requête AJAX est manifestement parfaite, preuve à l'appui), et,
    - le processus d'observation et recherche du problème très complet et parfaitement exécuté.

    Bon, bref.

    Comme l'indique la doc de jQuery, la fonction error ne reçoit pas les données reçues en paramètre. Le premier paramètre est l'objet XMLHttpRequest utilisé pour faire la requête. Et cet objet n'a pas de variable "msg".
    Le principe étant que s'il y a une erreur, alors en général il n'y a pas de données.
    Tu dois pouvoir faire un truc comme :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error: function(xhr, statut) {
      alert("msg " + JSON.parse(xhr.responseText)["msg"]);
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par thelvin
    la fonction error ne reçoit pas les données reçues en paramètre
    Et pour cause : error() n'est appelée que lorsque la requête renvoie une erreur HTTP (typiquement, 404), ce qui exclut la possibilité d'obtenir une réponse.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Et pour cause : error() n'est appelée que lorsque la requête renvoie une erreur HTTP (typiquement, 404), ce qui exclut la possibilité d'obtenir une réponse.
    T'as jamais vu une page 404 customisée, alors -_-° ?

    Il est commun, dans les webservices, de mettre un message d'erreur dans la réponse qui indique une erreur, pour que ce message donne une idée de pourquoi ça n'a pas marché.
    Il est plus rare, par contre, que ce message soit dans le même format que les données qui étaient attendues. D'où une nécessité de traitement particulier pour le cas d'erreur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Merci à vous 2 pour vos réponses.

    Mais plus prosaïquement, c'est normal ou pas ce traitement en error: coté client?

    Question
    On m'a également expliqué que l'erreur générée envoyait en plus de la ligne JSON, un header, que JQuery ne savait pas interpréter d'ou l'envoi sur ERROR: dans JQuery. Cela voudrait-il dire que si je passais par xhr sans la couche JQuery, cela serait traité différemment?

    Question
    De plus vous parlez d'une erreur 404, où peut-on identifié le numéro d'erreur 404 car les seuls codes que j'ai identifié sont

    • [2002] du message d'erreur PHP "message":"SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte inconnu."
    • [200] du Status JQuery
    • [4] readystate de JQuery


    Dernière question
    D'autre part coté client, j'ai codé pour récupérer le message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     var msg = dataSQL.responseText;
    var msg2 =  msg.match(/(msg.*u.)/);
    alert(msg2[0]);

    Mais pourquoi var msg2 = msg.match(/(msg.*u.)/); => msg2 en Array[2] avec dans chaque ligne le même texte "msg":"SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Hôte inconnu."

    Encore merci pour votre aide

Discussions similaires

  1. Accès base de données SGBD erreur.
    Par linuxien_62 dans le forum Développement Web en Java
    Réponses: 20
    Dernier message: 10/04/2013, 10h16
  2. Réponses: 2
    Dernier message: 31/05/2007, 16h36
  3. erreur acces base de donnée.
    Par Phiss dans le forum ASP
    Réponses: 8
    Dernier message: 08/11/2006, 10h49
  4. [Kylix] Kylix et accès Base de données
    Par Oyoboy dans le forum EDI
    Réponses: 16
    Dernier message: 22/06/2004, 16h41
  5. Réponses: 2
    Dernier message: 19/06/2003, 21h58

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