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

Langage PHP Discussion :

accent lors d'une requete SQL


Sujet :

Langage PHP

  1. #1
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut accent lors d'une requete SQL
    Bonjour,

    Bien voilà un peu tout est dans le titre : "problème d'accent lors d'une requete SQL" !

    Exemple : dans une table listant des catégories d'appareil, je veux retrouver l'ID du catégorie par le biais de son nom, en gros je peux donc faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Code : SQL
    SELECT id FROM categories WHERE name = "le nom"
    Si je recherche "Console", ça fonctionne, mais si je recherche "Téléviseur", ça ne fonctionne pas,
    cela viendrait donc d'un problème d'accents, donc d'encodage, mais je n'arrive pas à le résoudre,
    si quelqu'un à la soluc', merci de me renseigner

    J'ai déjà essayé de mettre ça :
    header('Content-Type: text/html; charset=utf-8'); ET
    mysql_query("SET NAMES 'utf8'", $conn); mais ça ne fonctionne pas mieux...

    MICKAEL
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Est-ce qu'au niveau de la Bdd (table/champ) c'est bien du utf-8 aussi ?
    Puis au niveau de la casse (Console et console), est du "case insensitive" ?
    Quelle type as tu mis en faite ?

    Essai de faire un var_dump() sur la variable dans $_POST ou $_GET contenant la valeur au moment où se fait la requête, peut être verra t-on l'erreur.

    Mettre ton code concernant cette partie de code (la requête entre autre) peu être utile, histoire de voir comment tu procèdes.

    Est-ce aussi du utf-8 pour la page HTML ?
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  3. #3
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    salut RunCodePhp,

    je te remercie pour ta réponse, j'avoue que je suis encore dans le flou...
    Pour corriger mon code j'ai mis ma requête SQL entre parenthèses
    et j'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    $_POST['parent_cat'] = "TV  – Vidéo – TNT – Satellite";
    print "encodage interne de la page :". mb_internal_encoding().'<br />';
     
    $parent_catname_utf8 = utf8_encode($_POST['parent_cat']);
    $encodage_parent_catname = mb_detect_encoding($parent_catname_utf8);
    print "l'encoage de ma chaine : " .$encodage_parent_catname.'<br />';
    print "ma chaine encodée en UTF8 : ".$parent_catname_utf8.'<br />';
    var_dump($parent_catname_utf8);
    $parent_catname = utf8_decode($parent_catname_utf8);
    print "ma chaine apres decodage UTF8 : ".$parent_catname;
    ce qui donne ça :

    encodage interne de la page :ISO-8859-1
    l'encoage de ma chaine : UTF-8
    ma chaine encodée en UTF8 : TV – Vidéo – TNT – Satellite

    string 'TV – Vidéo – TNT – Satellite' (length=47)

    ma chaine apres decodage UTF8 : TV – Vidéo – TNT – Satellite

    Que pensse tu de ça : €“ dans ma chaine encoder en utf8 ??
    Pas bon non ??
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Humm ... ça a l'air d'être flou effectivement.

    Un petit point s'impose.

    D'abord, la première difficulté il est vrai, c'est que parmi les outils qu'on utilise, ils ne sont pas tous encodés en UTF-8, mais l'avenir va dans ce sens là, donc il est bon d'adopter cet encodage.

    Donc admettons que tu veuille faire un site en tout UTF-8 (ce qui me semble être le cas), alors il faut que tout soit en UTF-8.

    1/ Son éditeur de code (de mon coté NetBean par exemple), tous les fichiers doivent être en UTF-8 sans BOM.

    2/ Php doit être en Php.
    Il y a plusieurs moyen de fixer ça.
    Le php.ini -> default_charset = "UTF-8"
    ou alors en Php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('default_charset', 'UTF-8');
    (rien n'empêche de faire les 2)

    3/ La Bdd.
    Il faut définir l'interclassement par défaut de la Base de donnée.
    De mon coté par exemple c'est : utf8_general_ci
    Tu peux le vérifier avec PhpMyAdmin -> Opération
    Puis à chaque création de table, définir comme charset par défaut UTF8.
    Un exemple quand je fais un export d'une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE IF NOT EXISTS `ps_customer` (
      `id_customer` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ... etc ...
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
    Et il faut bien sûr que les données soient elles aussi en UTF-8 lors des insertions/mise à jours, Pour ça les points 1, 2 et 4 doivent être correcte, sinon on obtient des truc bizarres.

    4/ Les pages HTML doivent être en UTF-8.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <html>
        <head>
            <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
        </head>
        <body>
    ... etc ...
        </body>
    </html>
    Coté Php, on peu aussi fixer en UTF-8 les fonctions mb_*.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ini_set('mbstring.internal_encoding', 'UTF-8');
    ini_set('mbstring.http_input', 'UTF-8');
    ini_set('mbstring.http_output', 'UTF-8');
    Mais ce dernier point est optionnel, c'est uniquement dans le cas où on en a besoin.
    Mais théoriquement, on a pas besoin, mais il est vrai que certaines fonctions Php n'exploite pas l'UTF-8 quand bien même qu'il soit bien fixé, utiliser les mb_* devient nécessaire.
    Faut voir.


    Toutjours est il que normalement tu n'as plus besoin de faire des utf8_encode() ou utf8_decode(), je dirais même surtout pas (sauf cas rare et bien déterminé).
    Grosso modo, si tout est bien fixé et cohérent, il n'y a plus rien à faire.


    Pour tester tout ça après avoir fait le point peut être quelques corrections, fais juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo 'default_charset : '.ini_get('default_charset').'<br />';
    echo 'parent_cat : '.$_POST['parent_cat'].'<br />';
    Et vérifie avec PhpMyAdmin que cette donnée (et les autres) soient correctes.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  5. #5
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    J'ai tenté les différentes options proposées,
    aucune ne règle mon problème,
    je me suis arrêté à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    ini_set('mbstring.internal_encoding', 'UTF-8');
    ini_set('mbstring.http_input', 'UTF-8');
    ini_set('mbstring.http_output', 'UTF-8');
    ?>
    Que j'ai collé tout au dessus de ma page de script...
    mais ça ne change rien...

    par contre lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    print "encodage interne de la page :". mb_internal_encoding().'<br />';
    print "valeur de la chaine de caractère soumise via la variable = ".$_POST['parent_cat'].'<br />';
    print "var_dump de la variable = " . var_dump($_POST['parent_cat']).'<br />';
    print "encodage de la variable = " . mb_detect_encoding($_POST['parent_cat']).'<br />';
    ?>
    J’obtiens ça :

    encodage interne de la page :UTF-8
    valeur de la chaine de caractère soumise via la variable = TV – Vidéo – TNT – Satellite

    string 'TV – Vidéo – TNT – Satellite' (length=36)

    var_dump de la variable =
    encodage de la variable = UTF-8
    TV – Vidéo – TNT – Satellite


    Ma variable est bien en utf8, l'interclassement de ma BDD aussi !
    Donc ça devra marcher, mais malgré ça non ça ne fonctionne pas...

    Par ailleur la ligne "default_charset" de mon
    fichier php.ini est la suivante = default_charset = "iso-8859-1",
    donc pas égale à UTF-8, mais bon je ne crois pas, au regard de ce
    que j'ai appris en quelques heures... que ça ne change grand chose...
    et dans le cas contraire est ce que ce n'est pas dangereux pour la centaine
    d'autres script (et les futurs script) qui tourne sur mon serveur d'éval' ??
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Par ailleur la ligne "default_charset" de mon
    fichier php.ini est la suivante = default_charset = "iso-8859-1",
    donc pas égale à UTF-8, mais bon je ne crois pas, au regard de ce
    que j'ai appris en quelques heures
    C'est pourtant le plus important, c'est ce default_charset qui défini le charset pour Php.
    Il faut donc modifier (redéfinir) sa valeur par UTF-8 si ce n'est pas le cas.

    C'est avec ce code que je t'ai mis précédemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('default_charset', 'UTF-8');
    Pour vérifier que cette valeur a bien changé ou alors pour savoir quelle valeur elle a, suffit d'afficher sa valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'default_charset : '.ini_set('default_charset').'<br />';

    Et comme je l'avais précisé, les fonctions mb_* c'est optionnel, c'est pour faire d'autres choses.
    Mets ça de coté pour le moment.


    Ensuite pour vérifier que l'encodage coté Bdd est correcte, suffit de faire une simple requête sur une table/champ comportant des caractères spéciaux, et les afficher dans une page.
    (avec le SET NAME -> UTF-8 effectué au préalable bien entendu).


    As tu essayé de faire cette requête dans PhpMyAdmin ?
    Trouve t-il la donnée ? (le -> Téléviseur)
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre actif
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Points : 246
    Points
    246
    Par défaut
    re,

    et ben nan... malgré le paramétrage du fichier php.ini, ça ne marche toujours pas ... j'ai essayé tous ce que l'ont ma dit de faire
    sur les différents forum mais sans succès...

    J’arrête là, j'ai trouvé une autre solution qui me permet d'utiliser l'ID de la
    catégorie plutôt que son nom pour faire la recherche... désolé mais il faut que j'avance, si tu veux essayer de trouver la solution pour faire une recherche dans une base de données avec le nom... ce sera grand honneur pour toi
    de trouver la solution,

    merci encore pour ton aide, et bonne semaine,

    MICKAEL
    Si vous avez besoin d'une librairie permettant de gérer facilement les fichiers et les dossiers en PHP... ou si vous êtes juste curieux(se) :
    https://github.com/moDevsome/moFilesManager

    N'hésitez pas à me faire un retour

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    et ben nan... malgré le paramétrage du fichier php.ini, ça ne marche toujours pas ... j'ai essayé tous ce que l'ont ma dit de faire
    sur les différents forum mais sans succès...
    Ca ne m'étonne pas

    Relis ce topic, tu remarqueras qu'à plusieurs reprises je te demandais de me fournir des informations.
    Cependant, tu fournis aucune des ces informations.

    En somme, tu fournis que les infos que toi tu juges utiles, et non celles que nous jugeons utiles.
    Forcément ...

    En procédant ainsi, et bien tu auras beau demander de l'aide dans 50 forums différents, aucune personne ne pourra savoir d'où vient le problème.
    A part le "petit bonheur la chance" bien sûr.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

Discussions similaires

  1. [PDO] Garder le type d'une variable lors d'une requete SQL
    Par p_oum dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/04/2012, 15h44
  2. Réponses: 7
    Dernier message: 11/06/2007, 20h39
  3. [SQL-Server] Internal Server Error lors d'une requete SQL
    Par eowene dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 26/04/2007, 14h18
  4. [MySQL 4.1] probleme d'accents sur une requete SQL
    Par tatayoyo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/11/2005, 16h06
  5. probleme lors d'une requete sql (controle non activé)
    Par junty dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/09/2005, 15h45

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