Salut à tous,

J'ai créé un script php qui récupère des informations de ma base de donnée et les affiche ensuite en json pour que je puisse les récupérer et les afficher après avec javascript.

Le problème c'est que si jamais j’insère un accent dans l'un des champs de la table en question alors la fonction json_encode retourne false. Après avoir fait des recherches la dessus j'ai compris qu'apparemment cette fonction n'accepte que l'UTF-8, j'ai du coup converti en UTF-8 tous les champs ainsi que la table et meme la base de donnée, mais ca ne marche toujours pas. J'ai vraiment besoin de pouvoir mettre des accents dans certains champs. Comment faire ?

<?php
if(isset($_GET['html_id']))
{
    $pdo = new PDO("mysql:dbname=test;host=localhost", 'root','');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

    $result= $pdo->prepare('SELECT * FROM plats WHERE html_id = ?');
    $result->execute([$_GET['html_id']]);
    $data= $result->fetch();

    $json = json_encode($data);
    echo $json;
}
?>

Merci infiniment pour votre aide

5 réponses


Salut,

Il te faut encoder toutes les datas en utf8 via la fonction PHP utf8_encode() :

    $data = array_walk_recursive($data, function(&$item, $key){
        if(!mb_detect_encoding($item, 'utf-8', true)){
                $item = utf8_encode($item);
        }
    });

Merci énormément betaWeb, effecitvement ca marche super bien.
Par contre petite question, pour ma culture personnelle, en 1er parametre de la function de callback tu as mis "&$item", j'ia cru que cétait une erreur au début mais en fait non. A quoi sert le "&" exactement ?

Merci beaucoup en tout cas :)

Le "&" devant un paramètre permet de spécifier que celui-ci sera passé par référence et non par recopie comme c'est le cas par défaut. Comme ceci, tu modifie bien l'instance de '$item' que tu passe à ta fonction, et non pas une nouvelle instance de celui-ci, créée à l'intérieur de la fonction.

Je pense que Graf a du faire un point là-dessus dans sa formation sur PHP : lien par ici !

Ah d'accord je savais pas merci batondsky !

Sinon pour en revenir à la solution, le plus simple finalement était de tout simplement rajouter le charset UTF8 dans le DSN!

Pas de quoi ;)
Penses à passer ton sujet en résolu ;)