Caractères spéciaux, accents dans mysql

Mammouth du PHP | 19672 Messages

23 juil. 2005, 18:13

Génial, j'avais pourtant cherché pas mal,mais je n'ai pas eu l'assiduité de faire un tour détaillé et complet du fichier de configuration de phpMyAdmin.

Merci pour le tuyau, ça resservira sûrement à d'autres :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 9 Messages

08 août 2005, 23:35

bonsoir,

je suis tombé sur votre post sur les accents et php/mysql.
J'ai lu attentivement mais un problème subsiste toujours me concernant.

Je suis hébergé chez free, et ils ont fait une montée de version de mysql et de php.
depuis, les connexions à ma base de données ne fonctionnent plus comme avant. Je m'explique :

c'est une base de données d'anciens élèves. les prénoms et les noms contiennent des accents.
Avant, je pouvais me connecter facilement avec "sebastien.chabanel", alors que dans la base le prénom est indiqué avec un accent.

depuis quelques semaines, je suis obligé de me connecter en mettant les accents de partout, sinon il ne reconnait pas le login.

Comment pourrais-je continuer à fonctionner comme avant ?
Que dois-je modifier (dans mes scripts php, dans le header de mes pages, dans phpmyadmin...)

Si quelqu'un a la réponse, ou au moins un début de piste je suis preneur

Merci par avance...

Seb

Mammouth du PHP | 19672 Messages

09 août 2005, 10:17

Je ne comprends pas bien ton problème: les caractères accentués concernent aussi les noms de tables et de champ de ta base ? Si c'est ça, tu as un problème, on n'utilise en principa jamais de caractères spéciaux pour nommer une base, une table ou un champ quelconque dans une base de données.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 9 Messages

09 août 2005, 19:03

non je ne parle pas des noms de tables, qui sont sans accents évidemment, mais je parle des champs.

Je ne sais pas quelle montée de version a fait free, mais en tout cas actuellement c'est la version MySQL 4.1.13 qui me pose problème.

cela ne concerne pas la connexion à la base, je me suis mal expliqué, mais les champs de cette dernière.

Voici le code de vérification du login, une fois le formulaire posté :
 <? session_start();

include("config.inc.php");
include("functions.inc.php");

// nettoyage des données en entrée

$loginm = clean_input($_POST['loginm']);
$password = clean_input($_POST['password']);

// Récupérer le prénom et le nom du login "prenom.nom"

$champs = explode(".",$loginm);

$prenom = $champs[0];
$nom = $champs[1];

// connection à la BDD

$db = mysql_connect($dbhost,$dbuser,$dbpass)
	or die("Impossible de se connecter à la base de données !");

mysql_select_db($dbname,$db)
	or die ("Impossible de sélectionner la base de données !");

// verification de l'utilisateur en fonction du login et du mot de passe

$sql = "SELECT id, first_name, last_name FROM members WHERE first_name='".$prenom."' AND last_name='".$nom."' AND password='".$password."'";
$result = mysql_query($sql)
	or die ("Impossible de récupérer vos informations !");

if (mysql_num_rows($result) != 1) {
	session_unset();
	session_destroy();

	setcookie("check_email", "", time()-1800, "/", "", 0);
	setcookie("check_hash", "", time()-1800, "/", "", 0);
	setcookie(session_name(), "", time()-1800, "/", "", 0);
// message d'erreur de connexion
	die("L'autentification a échoué !<br>Retournez sur la page de <a href=index.php>Connexion</a> et connectez-vous à nouveau !");

} else {

	$_SESSION['IDtag'] = mysql_fetch_row($result);

// Créer un cookie valable 30 minutes
	setcookie("check_email", $email, time()+1800, "/", "", 0);
	setcookie("check_hash", md5($email.$hash_password), time()+1800, "/", "", 0);

// Remplacer le champ "first login" à '0' pour indiquer que l'utilisateur s'est déjà connecté au moins une fois au site
	$sql = "UPDATE members SET first_login=0 WHERE id='".$_SESSION['IDtag'][0]."'";
	$result = mysql_query($sql)
		or die ("Impossible de mettre à jour le tag de session !");

	header("Location:members/index.php");
	exit;
}

?>
avant, mon script se foutait que dans la base le prénom et le nom soit accentué ou pas, et maintenant si je mets pas les caractères accentués, ça marche pas, j'arrive sur le message d'erreur de connexion
Si tu as une piste ganesh je suis preneur...

Mammouth du PHP | 19672 Messages

09 août 2005, 19:27

La solution consisterait à remplacer tous les caractères accentués des valeurs envoyées avec un str_replace. On a déjà vu plusieurs fois sur le forum des formules complètes, mais voici une base:
<?php
function sansaccent($chaine)
{
    $accents = array("à","ä","é","è","ë","ï","ö","ù");
    $sans    = array("a","e","e","e","e","i","o","u");
    $retour = str_replace($accents, $sans, $chaine);
    return $retour;
}
?>
Applique ça aux valeurs envoyées vers la base de données.

Si les valeurs contenues dans la base comportent des accents, récupères-les sur la base du mot de passe, traite-les avec la même fonction et fais ensuite ta comparaison.

J'ajouterai pour l'avenir: traite toute nouvelle entrée avec la fonction pour n'enregistrer que des données non accentuées et le problème sera réglé.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 9 Messages

18 sept. 2005, 21:37

Merci ganesh pour ta réponse mais je ne souhaite pas modifier le contenu de ma base de données, tout simplement parce qu'en français, les accents change la prononciation, d'ou leur importance.

Je chercherai plutot le moyen d'effectuer une requete mysql où lorsque je cherche "sebastien", il m'affiche à la fois les résultats "sébastien" ET sebastien".
De plus, je vais avoir ce problème sur tous les autres champs de ma base, pour le nom de la ville, des commentaires, ...

J'ai vu qu'une fonction d'indexation (Fulltext) permettai de rechercher directement dans les champs indéxés, mais ça ne marche pas sous mon hébergeur (free). Les requetes restent sensibles à la casse.

Merci d'avance de votre réponse.

Mammouth du PHP | 19672 Messages

18 sept. 2005, 21:55

Alors rajoute des clauses dans la clause WHERE : sommairrement WHERE (clauses sans accents) OR (clauses avec accents)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 9 Messages

18 sept. 2005, 22:22

Merci pour cett réponse rapide, mais je ne peut pas rajouter ceci.
car je ne sais pas à l'avance lorsque quelqu'un va se connecter si "etienne" correspond à "étienne" étiénne" ou "etiénne"...

Je sais pas si tu vois ce que je veux dire. Ce champ est important car c'est le login pour le site...

Je pensais qu'il était possible de faire une requete sql sans tenir compte des accents, si c'est pas possible je dirais aux membres de faire attention lors de leur connection !

Mammouth du PHP | 19672 Messages

18 sept. 2005, 22:26

C'est vrai qu'en temps normal, une authentification est sensible aux accents et égaslement à la casse : login != Login != lOgIn etc...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mobman02
Invité n'ayant pas de compte PHPfrance

27 sept. 2005, 18:38

Moi aussi j'aurais un gros probléme avec des accent sous MySQL.

Je change d'hebergeur en ce moment,
l'ancien est sous MySQL 4.1.13, je veut l'exporter chez un autre hebergeur qui lui est en 4.0....

Lorsque j'exporte mes données du 1er hebergeur, les fichiers SQL que je télécharge sont plein de é (J'ouvre les fichier SQL avec plusieurs éditeur de texte, mais rien n'y fait, et je fait ça sous Windows 98, cela joue t'il ? )

Pourtant toutes les tables du 1er hebergeur sont en interclassement "latin1_swedish_ci"...

J'ai essayer d'importer les fichier de backup (je me suis dit que peut etre mes accents serais normaux lol) mais il s'affiche alors aussi en é dans PHPmyAdmin, ainsi que lors d'une requete en PHP (site en ISO ^^).

Alors voila il semble que mon probleme vien de l'export, mais, avec de nombreux test, je ne parvient toujour pas a recuperer ma BDD en un format ISO.

Pour info l'hebergeur dont j'essaye de me separer est Infomaniak.

Voila merci de votre aide :P
(je vais p'tre m'inscrire moua :) )

Invité
Invité n'ayant pas de compte PHPfrance

30 sept. 2005, 12:25

salut à tous,
J'avais le même soucis. Pas d'accent dans ma requête SQL. Solution simple (pour moi) : j'ai ouvert le fichier avec notepad et je l'ai enregistré en ANSI.
Du coup, je récupère tous mes accents dans ma requête SQL que je passe dans MySQL Control Center...

Invité
Invité n'ayant pas de compte PHPfrance

12 oct. 2005, 15:28

Grâce à vos réponses, j'ai mis "AllowAnywhereRecoding" à TRUE et j'ai chargé l'extension apache iconv.

Résultat, ma base est
- correctement exporté en iso-8859-1 SANS COMPRESSION
- pas exporté (elle n'apparait meme pas ds le fichier zip) en iso-8859-1 AVEC COMPRESSION (zip ou gzip)
-correctement exporté en utf-8 avec et sans compression (malheureusement l'utf8 convertis mes caractères accentués en "é" :roll:)

Y a-t-il une extension spéciale à activer pour que l'exportation en iso-8859-1 AVEC COMPRESSION fonctionne ?

Merci pour votre aide ;)

Petit nouveau ! | 2 Messages

12 oct. 2005, 15:38

Oups, j'avais pas vu que j'avais posté en tant qu'invité. Désolé :oops:

Je n'en reste pas moins curieux de savoir comment exporter une base compressée codée en iso :D

Invité
Invité n'ayant pas de compte PHPfrance

13 oct. 2005, 17:10

Salut a vous,

J'ai un probleme de la meme veine, mais un peu plus complexe.
Je suis en cours de migration d'un serveur MS SQL Server vers un serveur MySQL 5.0.
J'ai utilisé un programme qui génère les instructions INSERT pour reinsérer mes données dans MySQL. Jusqu'ici OK...
La ou vient le probleme : dans une table j'ai un index PRIMARY et UNIQUE pour le login de l'utilisateur. Or dans le fichier exporté j'ai, par exemple, "René" et "Rene" comme noms tout a fait valide sous MS SQL Server (qui avait egalement les memes contraintes d'index). Lors de l'import j'obtient un message :
ERROR 1062 : Duplicate entry 'Rene' for key 1
Qqn aurait une explication et une solution? J'ai des milliers d'utilisateurs, donc pas question de supprimer ou de changer leurs données...
MySQL est supposé utiliser UTF8 pour les chaines, mais apparement... soit ca marche pas, soit il faut changer qqchose...
Global Variables

character_set_server = latin1
character_set_system = utf8
Le probleme se pose sur MyISAM et InnoDB indifferement...

Invité
Invité n'ayant pas de compte PHPfrance

17 oct. 2005, 13:19

Allez voir ca: http://dev.mysql.com/doc/refman/4.1/en/ ... ading.html
Ca explique bien vos problemes et comment les resoudres :)

JB