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