L'encodage au format JSOn ne fonctionne pas
elonaenjy
Messages postés
17
Statut
Membre
-
elonaenjy Messages postés 17 Statut Membre -
elonaenjy Messages postés 17 Statut Membre -
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
A voir également:
- L'encodage au format JSOn ne fonctionne pas
- Format epub - Guide
- Format factory - Télécharger - Conversion & Codecs
- Hp usb disk storage format tool - Télécharger - Stockage
- Format apfs - Guide
- Format bin - Guide
3 réponses
Bonjour,
Lignes 46 à 55 à supprimer de ton code
et à remplacer par
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
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
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...
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 ).
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
- 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 php
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
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