Bonjour,
En affichant du texte stocké en bdd les caractères spéciaux ne fonctionnent pas et affiche à la place losange avec un point d'interrogation dedans.

Pourtant ma bdd et les tables en question ont l'interclassement sur: utf8_general_ci

Je ne comprend donc pas pourquoi cela n'affiche pas correctement le texte. Que se passe-t-il ?

7 réponses


Faut faire un SET NAMES UTF8 (google ça) pour dire à mysql que tu va communiquer en UTF8

Archetyp
Auteur

Yop je sais mon message faisait pas très sérieux, j'avoue l'avoir posté un peu à la va vite.. ^^'
Alors en fait oui j'avais vu cette technique via ce post :
http://www.grafikart.fr/forum/topic/2341
Le problème c'est qu'utilisant l'extension PDO le code n'est pas le même.
J'ai donc trouvé cela :
http://www.siteduzero.com/forum-83-736473-p1-encodage-utf-8-site-fichier-bdd-comment-faire.html

J'ai alors modifié mon code mais cela n'a rien donné de concluant..
J'ai donc tous remis en question et j'ai remarqué que mon code n'était pas valable du tout.
Le problème est que j'utilise le système de template ( fonction ob_start ) et que je n'avais pas su où positionner mon code de connexion à la bdd avec le système d'exception pour récupérer d'eventuelles erreurs, dans l'index avec la fonction ob_start. Et donc à mon avis mon code de connexion à la bdd avec PDO est un mélange du système sans exception et avec...

Donc en fait il suffirait peut être de bien écrire le code et ma question est la suivante :
Où placer ce code :

<?php
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
?>

dans celui ci :

<?php
// Connexion bdd
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=mabdd', 'root', '', $pdo_options); // chemin du site / bdd / login / mdp
// On vérifie si une variable est passée
if (!isset($_GET"p"])) // Si aucune variable n'est passée
{
    $_GET"p"]="accueil"; // On affiche la page par défaut
}
// On vérifie que le fichier existe
if (!file_exists("include/".$_GET"p"].".php")) // Si le fichier n'existe pas
{
    $_GET"p"]="infos/404"; // On affiche l'erreur
}
// On précharge le contenu des pages
ob_start();
include "include/".$_GET"p"].".php";
$content = ob_get_contents();
ob_end_clean();
// On affiche tout
include "template.php";
// Fermer connexion bdd ?
?>

Car là il y a seulement :

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=mabdd', 'root', '', $pdo_options); // chemin du site / bdd / login / mdp

et à mon avis ce n'est pas bon..

A la limite je crois que ceci serait correct :

$bdd = new PDO('mysql:host=localhost;dbname=mabdd', 'root', '');

J'aimerais aussi savoir si il faut comment fermer la connexion à la bdd ?
Car je crois qu'il faut le faire comme le montre mon commentaire en fin de code.
Par contre je ne sais pas pourquoi doit-on fermer une connexion à une bdd ?
Ni comment, est-ce en utilisant :

->closeCursor();

Genre :

$bdd->closeCursor();
Archetyp
Auteur

De plus, en ayant parler vaguement il y a peu avec un webdev on m'a dit que si les caractères spéciaux ne s'affichait pas c'était à cause de la fonction ob_start, est-ce vrai ? Si oui pourquoi ?

Archetyp
Auteur

Je me permet un petit up ^^'
Si jamais quelqu'un veut bien m'aider ce serait vraimetn sympa =P

est-ce que tu as bien
"<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />" ?
dans l'entête de ta page html ?

sinon il peut être utile de préciser à ton script de connexion que les transactions ( échange entre php et la base ) doivent se faire en utf8

si tu utilises mysqli par exemple :

$mysqli = new mysqli( $host , $user , $passwd , $bdd );
$mysqli->set_charset('utf8');

le rajout de cette simple deuxième ligne m'a changé la vie :-))

Archetyp
Auteur

Merci Xenondeele de t'êtres penché sur mon problème mais comme j'avais dis plus haut : " Le problème c'est qu'utilisant l'extension PDO le code n'est pas le même. " donc pas de mysqli.

J'ai trouvé un code qui marche mais est-il correct :

// Connexion bdd
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=vagmari', 'root', ''); // chemin du site / bdd / login / mdp ||| mysql:host=db418677739.db.1and1.com;dbname=db418677739', 'dbo418677739', 'longbow7'); ||| mysql:host=localhost;dbname=vagmari', 'root', '');
    $bdd->exec('SET NAMES utf8');
}
catch (Exception $e)
{
    die('Erreur : ' . $e->getMessage());
}

Merci pour le partage!