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

5 réponses


Gregory
Réponse acceptée

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>
$req->closeCursor()

Hum c'est pas juste pour PDO?

Sinon

mysql_close($req);
Bruno
Auteur

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