L'encodage au format JSOn ne fonctionne pas

Fermé
elonaenjy Messages postés 17 Date d'inscription samedi 7 mars 2020 Statut Membre Dernière intervention 11 janvier 2021 - Modifié le 15 nov. 2020 à 15:31
elonaenjy Messages postés 17 Date d'inscription samedi 7 mars 2020 Statut Membre Dernière intervention 11 janvier 2021 - 15 nov. 2020 à 16:29
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 38175 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 13 mai 2024 4 667
15 nov. 2020 à 15:42
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 samedi 7 mars 2020 Statut Membre Dernière intervention 11 janvier 2021
15 nov. 2020 à 15:51
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 38175 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 13 mai 2024 4 667
15 nov. 2020 à 16:01
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 samedi 7 mars 2020 Statut Membre Dernière intervention 11 janvier 2021
15 nov. 2020 à 16:29
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