8721 sujets

Développement web côté serveur, CMS

Bonjour :

Dans un fichier ajax.php appelé par une fonction jQuery dans un fichier index.php, j'ai, grosso modo, les lignes suivantes :

<?php
header('Content-type: application/json') ;

...

$tablearray = $mydatabase->get_OneSubject($id) ; //lecture d'une table mysql
$tablestring = $tablearray['name'] . " " . $tablearray['title'] . " " . $tablearray['comments'] ;

...

$m = json_encode(array('tablestring'=>$tablestring)) ;
echo $m ;


Le code fonctionne parfaitement tant qu'il n'y a pas d'apostrophe dans la chaîne à encoder. Mais dès qu'il y a une apostrophe, rien n'est encodé. J'ai essayé d'utiliser addslashes() et même addcslashes(), et j'ai essayé plusieurs options dans la fonction json_encode() mais rien à faire. J'ai pas le droit d'utiliser des apostrophes.

Comment est-ce que je pourrais résoudre le problème ?
Bon ben, il suffisait que je poste sur alsacréations pour que je trouve la solution. J'ai beau mettre tout MySQL en utf-8, je dois oublier quelque chose. Pour le problème évoqué plus haut, j'ai enregistré des lignes directement dans phpMyAdmin, et pas enregistré à partir du script. Il suffisait donc d'utiliser la fonction utf8_encode() sur les données récupérées dans la base pour que json_encode() accepte la chaîne.

Soit dit en passant, quand mes scripts écrivent dans MySQL, les caractères accentués sont représentés par des caractères bizarres. Ce n'est pas grave, parce qu'il sont à nouveau normaux lorsque ils sont récupérés et affichés. Mais j'aurais bien aimé que les caractères accentués sont correctement représentés dans la base. Comment est-ce que je pourrait faire ?

Merci d'avance
Modifié par Reflexive (28 Oct 2014 - 14:33)
Décidément, encore et toujours des problèmes classiques d'encodages. Pour que tout soit affiché correctement partout et qu'il n'y ait pas de risque que ça explose au moment le plus innoportun, tu dois t'assurer que le même encodage est utilisé sur toute la chaîne.

1. La collation des champs, tables, bases de données
2. La connexion à la base de données (set names utf8)
3. Les autres ressources serveur que tu manipules (fichiers texte, XML, etc.)
4. Les utilitaires qui permettent de modifier les données côté serveur (faire gaffe à PhpMyAdmin et les autres usines à gaz similaires)
5. Les scripts côté serveur (php, python, etc.)
6. L'encodage indiqué dans les en-têtes HTTP (Content-Type)
7. L'encodage effectif des documents envoyés au navigateur
8. L'encodage des requêtes AJAX et des données de formulaire envoyés par le client
9. L'encodage indiqué dans les en-têtes HTTP lors de l'envoi de données (Content-Type)

Un seul de ces éléments qui n'est pas en symbiose avec les autres et boum, tu as des risques de voir à un endroit ou un autre, ou pire, introduire dans le système des caractères non reconnus.

D'expérience, je dirais que les points les plus souvent oubliés, sont, par ordre de fréquence: 2, 4, 3, 5, 1, 9, 8, 7, 6. J'ai l'impression que phpMyAdmin fait beaucoup de tort au schmilblick, en cas de doute essayez donc adminer.

A noter que utf8_encode/decode & cie ne sont pas magiques.... ce n'est pas en les utilisant au hasard que ça va vraiment tomber en marche.
Modifié par QuentinC (28 Oct 2014 - 19:11)