IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Encodage UTF-8 [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    GYK
    GYK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Par défaut Encodage UTF-8
    Bonjour,

    Je pense que tout ceux qui vont lire ce message vont se dire : "il n'as qu'a chercher un peu". Le problème c'est que je cherche depuis des mois et des mois, et je n'ai jamais rien trouvé qui solutionne mon problème.
    Comme je le dis dans l'intitulé j'ai un problème d'encodage entre ma BDD MYSQL et mes PHP.

    Cette BDD à un interclassement : utf8_general_ci,
    Mes tables ont un interclassement : utf8_general_ci,
    Mes champs sont en inteclassement : utf8_general_ci,
    Mes PHP ont comme encodage : UTF-8 (sans BOM) avec un header : header( 'content-type: text/html; charset=utf-8' );.

    A partir de cette BDD je veux faire des listes sélectives et lorsque je sélectionne un champ d'une table dont les valeurs paraissent bien accentuées dans celle-ci, et avec comme valeur de recherche une valeur accentuée, je ne trouve rien.
    Mais si je fais la recherche avec la même valeur mais sans accent, ma liste est correct.

    Je me fais des nœuds au cerveau pour une bêtise que je n’arrive pas seul à trouver.

    SVP, pouvez vous m'aider.

    D'avance Merci.

    Cordialement

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    un bout de code à se mettre sous la dent ?

  3. #3
    GYK
    GYK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Par défaut
    Bonjour rawsrc,

    Le seul bout de code que je vois que je peux te mettre est le select de la requete:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from `ma_table` WHERE Nom LIKE '%$nom%' ORDER BY Nationalite ASC, Nom ASC,  Prenom ASC
    J'ai testé sans les % pour le like et sans plus de succès.
    Si tu vois quel autre code peut être utile, dis le moi.

    Merci

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    tu injectes la valeur de $nom dans le SQL comme ça sans aucune protection ?
    Poste voir tout le bout de code avec le mécanisme de requêtage

  5. #5
    GYK
    GYK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Par défaut
    Merci,
    Qu'entend tu par protection ?
    Si tu as peur que la variable soit vide, ce n'est pas possible. Celle-ci est renseignée par la valeur sélectionnée dans une liste déroulante.
    Cette liste déroulante est générée avec le contenu d'une table.
    Bien sur avant de poster ma discussion j'ai naturellement contrôlé par "écho" avant la requête la valeur de cette variable et celle-ci est bonne avec un é dans le nom par exemple, et pas des signes qui viendrait d'un autre encodage.
    Je précise que ma variable $Nom fonctionne très bien s'il n'y à pas d'accent, cédille, etc
    J'ai également fait un "écho" de ma requête qui elle même utilise une variable car celle-ci peut-être différente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql_marequette = "SELECT * from `ma_table` WHERE Nom LIKE '%$nom%' ORDER BY Nationalite ASC, Nom ASC,  Prenom ASC";
     
    $qry_matable =  mysqli_query($connection, $sql_marequette) or die ('Echec de la requete '.$sql_marequette' : '.mysqli_error($connection)); 
    $matable_row = mysqli_fetch_array($qry_matable);
    $num__matable = mysqli_num_rows($qry_matable);

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 513
    Par défaut
    Salut,

    La protection de la variable $nom contre les injections SQL est très importante (tu dois le savoir même si la valeur du nom est renvoyée depuis une liste déroulante), il faut utiliser mysqli_real_escape_string ou BIEN MIEUX en préparant correctement la requête avec le style orienté objet.

    En ce qui concerne l'api Mysqli, l'encodage des caractères spéciaux c'est vraiment la galère, parce que tu es obliger de modifier le jeu de caractère en utf8 avec mysqli_set_charset() et sécuriser la variable $nom avec mysqli_real_escape_string.

    Si on veut convertir le code

    • Mysqli avec le style procédural :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $connection= mysqli_connect('localhost', 'utilisateur', 'motdepass', 'base_de_donnée');
    $nom=$_POST["nom"];
    mysqli_set_charset($connection,"utf8");//modification de jeu de caractère en utf8.
    $sql_marequette = "SELECT * from `ma_table` WHERE Nom LIKE '%".mysqli_real_escape_string($connection,$nom)."%' ORDER BY Nationalite ASC, Nom ASC,  Prenom ASC";
    $qry_matable =  mysqli_query($connection, $sql_marequette) or die ('Echec de la requete '.$sql_marequette' : '.mysqli_error($connection)); 
    $matable_row = mysqli_fetch_array($qry_matable);
    $num__matable = mysqli_num_rows($qry_matable);
    mysqli_free_result($qry_matable );
    mysqli_close($connection);
    • Mysqli avec le style orienté objet et en préparant la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $nom="%".$_POST["nom"]."%";
    $connection= new mysqli("localhost", 'utilisateur', 'mot_de_passe',"base_de_donnée");
    $connection->set_charset('utf8');
    $sql_marequette="SELECT * from `ma_table` WHERE Nom LIKE ? ORDER BY Nationalite ASC, Nom ASC,  Prenom ASC";
    $qry_matable =$connection->prepare($sql_marequette);
    $qry_matable ->bind_param("s",$nom);
    $qry_matable ->execute();
    $matable_row=$qry_matable ->get_result();
    $num_matable=$connection->affected_rows;
    $connection->close();
    • PDO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    $connection= new PDO('mysql:host=localhost;dbname=nom_de_base;charset=UTF8'
                           , 'utilisateur', 'mot_de_passe'
    			,array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)
                      );
    $nom=$_POST["nom"];
    $sql_marequette="SELECT * from `ma_table` WHERE Nom LIKE ? ORDER BY Nationalite ASC, Nom ASC,  Prenom ASC";
    $qry_matable =$connection->prepare($sql_marequette);
    $qry_matable->execute(["%".$nom."%"]);
    $matable_row=$qry_matable->fetchAll(PDO::FETCH_ASSOC);
    $num_matable=$qry_matable->rowCount();
    unset($connection);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Encodage UTF-8 dans fichier XML et PHP
    Par norkius dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 03/01/2007, 15h44
  2. Problème d'affichage avec encodage utf-8
    Par t-die dans le forum Zend
    Réponses: 3
    Dernier message: 04/12/2006, 14h55
  3. [C# 2.0] Comment réaliser un encodage UTF-8 ?
    Par StormimOn dans le forum C#
    Réponses: 2
    Dernier message: 18/10/2006, 10h35
  4. Pb Encodage UTF-8 pour Ooo
    Par Sylvain James dans le forum XMLRAD
    Réponses: 10
    Dernier message: 08/03/2006, 22h28
  5. [WebForms] Encodage, UTF-8 et accents
    Par alexischmit dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 28/04/2004, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo