L'encodage au format JSOn ne fonctionne pas
elonaenjy
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
elonaenjy Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
elonaenjy Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
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
Voici le code présent sur le serveur :
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
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
3 réponses
-
Bonjour,
Lignes 46 à 55 à supprimer de ton code
et à remplacer parecho $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
-
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...-
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
-
-
Toutes mes excuses jordanE....
Voilà comment j'ai modifié mon code phpwhile ($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