Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/01/2012, 01h13   #1
Invité régulier
 
Homme Mickael Outhier
Employé de SAV en TV HiFiVideo et Webmaster en Freelance
Inscription : septembre 2011
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme Mickael Outhier
Âge : 27
Localisation : France, Jura (Franche Comté)

Informations professionnelles :
Activité : Employé de SAV en TV HiFiVideo et Webmaster en Freelance
Secteur : Conseil

Informations forums :
Inscription : septembre 2011
Messages : 25
Points : 5
Points : 5
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 :
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
Soundboy39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 10h21   #2
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 728
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 728
Points : 3 295
Points : 3 295
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]
RunCodePhp est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 11h12   #3
Invité régulier
 
Homme Mickael Outhier
Employé de SAV en TV HiFiVideo et Webmaster en Freelance
Inscription : septembre 2011
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme Mickael Outhier
Âge : 27
Localisation : France, Jura (Franche Comté)

Informations professionnelles :
Activité : Employé de SAV en TV HiFiVideo et Webmaster en Freelance
Secteur : Conseil

Informations forums :
Inscription : septembre 2011
Messages : 25
Points : 5
Points : 5
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 :
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 ??
Soundboy39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 12h14   #4
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 728
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 728
Points : 3 295
Points : 3 295
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 :
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 :
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 :
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 :
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 :
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]
RunCodePhp est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 14h34   #5
Invité régulier
 
Homme Mickael Outhier
Employé de SAV en TV HiFiVideo et Webmaster en Freelance
Inscription : septembre 2011
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme Mickael Outhier
Âge : 27
Localisation : France, Jura (Franche Comté)

Informations professionnelles :
Activité : Employé de SAV en TV HiFiVideo et Webmaster en Freelance
Secteur : Conseil

Informations forums :
Inscription : septembre 2011
Messages : 25
Points : 5
Points : 5
J'ai tenté les différentes options proposées,
aucune ne règle mon problème,
je me suis arrêté à :

Code :
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 :
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' ??
Soundboy39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 16h52   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 728
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 728
Points : 3 295
Points : 3 295
Citation:
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 :
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 :
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]
RunCodePhp est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 18h20   #7
Invité régulier
 
Homme Mickael Outhier
Employé de SAV en TV HiFiVideo et Webmaster en Freelance
Inscription : septembre 2011
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme Mickael Outhier
Âge : 27
Localisation : France, Jura (Franche Comté)

Informations professionnelles :
Activité : Employé de SAV en TV HiFiVideo et Webmaster en Freelance
Secteur : Conseil

Informations forums :
Inscription : septembre 2011
Messages : 25
Points : 5
Points : 5
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
Soundboy39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 07h04   #8
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 728
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 728
Points : 3 295
Points : 3 295
Citation:
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]
RunCodePhp est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h53.


 
 
 
 
Partenaires

Hébergement Web