Bonjour,
Je vais essayer d'être le plus claire possible car j'ai des questions qui me chagrine.
J'ai fait un exercice en php/Mysql. j'ai un fichier header.php connexion.php et footer.php.
header.php
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Document sans nom</title>
</head>
<body>
connexion.php
<?php include ("header.php"); ?>
<?php
try
{
// On se connecte à MySQL
$bdd = new PDO ('mysql:host=localhost;dbname=test', 'root', '');
mysql_query('SET NAMES "UTF8"');
}
catch (Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : ' . $e->getMessage());
//;charset=utf8
//$good = strtr($bad, get_html_translation_table(HTML_ENTITIES, ENT_QUOTES));
// Une fois connecté à la bdd utf8
// mysql_query("SET NAMES 'utf8'");
}
// Si tout va bien, on peut continuer
// On récupère tout le contenu de la table jeux_video
$reponse = $bdd->query('SELECT * FROM jeux_video');
//On affiche chaque entrée une à une
while ($donnees = $reponse->fetch())
{
?>
<p>
<strong>Jeu</strong> : <?php echo $donnees 'nom']; ?><br />
Le possesseur de ce jeu est : <?php echo $donnees 'possesseur']; ?>, et il le vend à <?php echo $donnees 'prix']; ?> euros !<br />
Ce jeu fonctionne sur <?php echo $donnees 'console']; ?> et on peut y jouer à <?php echo $donnees 'nbre_joueurs_max']; ?> au maximum<br />
<?php echo $donnees 'possesseur']; ?> à laissé ces commentaires sur <?php echo $donnees 'nom']; ?> : <em><?php echo $donnees 'commentaires']; ?></em>
</p>
<?php
}
$reponse->closeCursor() ; // Termine le traitement de la requête
?>
<?php include ("footer.php"); ?>
Pour que l'utf8 fonction j'ai voulu mettre ceci
mysql_query('SET NAMES "UTF8"');
mais çà ne fonctionne pas. J'avais trouvé une autre façon d'écrire ma connexion à la bdd comme ceci
$bdd = new PDO ('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
et la ça tourne bien j'ai tout les accents des données de ma bdd utf8_general_ci je précise. Mais on me dit que c'est pas une bonne façon de l'écrire.
On m'a aidé à refaire entièrement mon code et je dirais l'obtimisé en fin je pense le voici ci-dessous
<?php include ("header.php"); ?>
<?php
$cnx = mysql_connect( "localhost", "root", "" ) ;
$db = mysql_select_db( "test" ) ;
mysql_query('SET NAMES "UTF8"');
$req= "SELECT * FROM jeux_video";
$rep = mysql_query($req, $cnx) or die( mysql_error() ) ;
while($row=mysql_fetch_row($rep))
{
$nom=$row[1];
$possesseur=$row[2];
$console=$row[3];
$prix=$row[4];
$nbre_joueurs_max=$row[5];
$commentaires=$row[6];
echo '<p>
<strong>Jeu</strong> : ' . $nom . '<br />
Le possesseur de ce jeu est : ' . $possesseur . ', et il le vend à ' . $prix . ' euros ! <br />
Ce jeu fonctionne sur ' . $console . ' et on peut y jouer à ' . $nbre_joueurs_max . 'max.' . $possesseur . ' à laissé ces commentaires sur ' . $nom . ': <em>' . $commentaires . '</em>
</p>';
}
$req->closeCursor() ; // Termine le traitement de la requête
?>
<?php include ("footer.php"); ?>
De cette façon mes accents fonctionnent bien, mais et oui il y a un mais ça serait trop beau sinon ;-D
La ligne de code suivante me provoque une erreur, car je pense que je ne suis plus en PDO comme le premier fichier.
$req->closeCursor() ; // Termine le traitement de la requête
erreur :
Fatal error: Call to a member function closeCursor() on a non-object in D:\Sites\wamp\www\Exercices\12-connexion-base\connexion-1.php on line 40
Quel est la meilleur des deux de coder ce fichier ?
Pourquoi le premier fichier connexion.php ne prend pas en compte de l'utf8 et que l'autre oui ?
Pour l'erreur closeCursor dois-je seulement l'enlever ou mettre autre chose ?
Merci pour toute votre aide. Tout ceci pour savoir le pourquoi du comment.
Bruno
Je ne sais pas si il y a une meilleure façon de faire, pour ma part je préfère utiliser PDO car c'est plus orienté objet.
Essayes ceci pour gérer l'utf8
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
Avec l'autre méthode tu as mysql_close() pour terminer ta connexion
Oula xD
Le charset doit être dans la balise <head> et pas au dessus du doctype.
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <!-- ou <meta charset="utf-8"> -->
<title>Titre de mon site</title>
</head>
<body>
Bonjour
Et merci pour toutes les réponses entre temps au ma donnée cette solution pour généré l'utf8 des résultats de ma bdd.
$options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',);
$bdd = new PDO ('mysql:host=localhost;dbname=test', 'root', '', $options);
Merci à tous
Bruno
la bonne méthode est celle que tu as donné
$bdd = new PDO ('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
celle avec SET NAMES utf8 nécessite 2 appels à la bd, pas top