L'encodage au format JSOn ne fonctionne pas

elonaenjy Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   -  
elonaenjy Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,



Configuration: Windows / Chrome 86.0.4240.198


J'essaie de mettre en place une requête asynchrone AJAX, avec Javascript côté front end, et PHP/mysql côté serveur.

Voici le code javascript lançant la requête
function detailLecon($idLecon) {
/* Instanciation d'un objet de type XMLHttpRequest
/* NB : XMLHttpRequest est un objet ActiveX ou JavaScript qui permet d'obtenir des données
 au format XML, JSON, mais aussi HTML ou encore texte simple à l'aide de requêtes HTTP. */
/* Assoctation de la variable resultat à la division
 d'affichage divisionResultat */

 var resultat = document.getElementById("listeEns");

 if (window.XMLHttpRequest) {
  // Code pour IE7+, Firefox, Chrome, Opera, Safari
  httpRequest = new XMLHttpRequest();
 } else {
  // Code pour IE6, IE5
  httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
 }

/* Ouverture du fichier voitures.json via le script PHP serveurJSON.php*/
/* true : mode asynchrone -> le flux doit être disponible entièrement avant son traitement */
 $url = "detailLecon.php?code="+$idLecon;
 httpRequest.open("GET", $url, true);

 /* Définition du type de flux */
 httpRequest.setRequestHeader("Content-type", "application/json");
 /* Traitement effectué dès que le flux est disponible */
 httpRequest.onreadystatechange = function(){
  /* Test si requête terminée et test status OK */
  if (httpRequest.readyState == 4 && httpRequest.status == 200) {
   /* Affichages de contrôle */
   alert("responseText : " + httpRequest.responseText);
   /* Conversion du flux JSON en objets Javascript */
//   var donneesJSON = JSON.parse(httpRequest.responseText);
   
   /* Initialisation de la variable resultat */
   resultat.innerHTML = httpRequest.responseText;
//   /* Parcours des objets Javascript */ 
//   for (var objet in donneesJSON) {
//   /*  Concaténation du résultat */
//     resultat.innerHTML += "Identifiant Lecon : " + donneesJSON[objet].noLecon + "<br />";
//     resultat.innerHTML += "Libelle Lecon : " + donneesJSON[objet].lbLecon + "<br />";
//     resultat.innerHTML += "no sequence : " + donneesJSON[objet].no_seq + "<br />";
//     resultat.innerHTML += "Identifiant video: " + donneesJSON[objet].id_ens + "<br />";
//     resultat.innerHTML += "Titre video :" + donneesJSON[objet].tit_video + "<br />";   
//   }
  }
 }
 $parametre = "code="+$idLecon
 console.log($parametre);
 /* envoi de l'identifiant leçon sélectionné à la requête XMLHttpRequest */
 httpRequest.send($parametre);
 
 /* Message affiché en attente du traitement */
 /* (récupération des données depuis le serveur) */
 resultat.innerHTML = "Attente de traitement JSON ...";

}


Voici le code présent sur le serveur :

<?php
 // Définition du header  
 header("Content-Type: application/json");
 $idLecon = $_GET["code"]; 
  
    // Définition de la requête SQL à soumettre
    // à la Base De Données MySQL
 $requete_sql = "select cat_lecon.id_lecon as noLecon, cat_lecon.lb_lecon as lbLecon, no_seq , id_ens, tit_video \n"
 . "from cat_lecon, lien_lecon_ens, cat_video\n"
    . "where cat_lecon.id_lecon = lien_lecon_ens.id_lecon\n"
    . "AND cat_lecon.id_lecon = \"$idLecon\" \n"
    . "AND lien_lecon_ens.id_ens = cat_video.id_video\n"
        . "order by cat_lecon.id_lecon, lien_lecon_ens.no_seq ASC";

        // return "Requête SQL : $requete_sql";

 $link = mysqli_connect("localhost", "root", "", "ida");
 /* Vérification de la connexion */
 if (mysqli_connect_errno()) {
     echo ("erreur de connexion".mysqli_connect_error());
     printf("Échec de la connexion : %s\n", mysqli_connect_error());
     exit();
    }
 else 
  /* Requête "Select" retourne un jeu de résultats */
 $resultat_sql = mysqli_query($link, $requete_sql);
  // Test du nombre d'enregistrements sélectionnés
    if (mysqli_num_rows($resultat_sql) < 1)
    {
    // Message d'erreur envoyé au client
    // si pas d'enregistrement
    echo ("Aucun enseignement trouvé");
     }
  else
    { 
    while
    ($enregistrement = mysqli_fetch_assoc($resultat_sql))
    {
                // dans le tableau $lignes (qui contiendra au final l'intégralité des données) 
                    $lignes[] = $enregistrement;
                   print_r ($enregistrement); 
     }
    // Encodage en format JSON du tableau $lignes
     
    $donneesJSON = json_encode($lignes); 
    print_r($donneesJSON);
    if (!json_encode($lignes))
        {
            echo ("pb encodage");
            echo ($lignes); 
        }
    else  // Envoi du résultat au client
        { 
            echo ($donneesJSON);
        }
   }

?>


La connexion à la base de données et la récupération des données se passent bien. Mais l'encodage ne fonctionne pas.
Voici en le résultat que j'obtiens :


Merci d'avance pour l'aide que vous pourrez m'apporter
A voir également:

3 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

Lignes 46 à 55 à supprimer de ton code
et à remplacer par
echo  $donneesJSON ;
exit;


Lignes 32 et 41 à retirer de ton code également.


En gros, ton script php ne dois rien afficher ( pas de echo, print_r, sprint... ) SAUF des données encodées en JSON
Sinon ça te génère une erreur

0
elonaenjy Messages postés 17 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour Jordan

J'ai progressé dans mon debuggage. Mon problème vient du fait que dans la chaîne de caractère que je souhaite encoder il y a des caractères qui ne sont pas en utf-8 et c'est ce qui génère l'erreur : dans $donneesJSON il n'y a rien...
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
JordanE ( avec un E s'il te plait ).
  • bref


Donc NON... ton message d'erreur ne concerne que ce que je t'ai indiqué ..

et pour ce qui est des caractères accentués
https://forums.commentcamarche.net/forum/affich-37584944-php-html-caracteres-accentues-et-l-utf8
0
elonaenjy Messages postés 17 Date d'inscription   Statut Membre Dernière intervention  
 
Toutes mes excuses jordanE....

Voilà comment j'ai modifié mon code php
				
while
				($enregistrement = mysqli_fetch_assoc($resultat_sql))
				{
                // dans le tableau $lignes (qui contiendra au final l'intégralité des données)	
				    $enregistrement = mb_convert_encoding($enregistrement, "UTF-8", "auto");
				    $lignes[] = $enregistrement;
				}
				// Encodage en format JSON du tableau $lignes
				$lignes = mb_convert_encoding($lignes, "UTF-8", "auto");
				$donneesJSON = json_encode($lignes);	
				
				if (!json_encode($lignes))
				    {
				        $error = json_last_error();
				        var_dump($donneesJSON, $error === JSON_ERROR_UTF8);
				    }
				else 	// Envoi du résultat au client
				    { 
				        echo $donneesJSON;
				    }
			}


J'ai donc avancé car lorsque j'ai des caractères accentués, maintenant ça marche. Par contre quand il n'y a pas de caractères accentués, j'ai un message d'erreur...

Sais tu si il existe un moyen d'intervenir uniquement en cas de besoin ?

Merci d'avance
0