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 :

Recherche insensible aux accentuations


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Recherche insensible aux accentuations
    Bonjour,

    J'ai une différence de comportement entre un requête que je mets dans PhpMyAdmin et que j'envoie à ma base via mysql_query().

    En regardant dans les différents forum, je croyais avoir trouver la solution pour faire une requête dans mysql qui ne prenait pas en compte les accents.

    Mysql : latin1_general_cs

    Voilà ma requête qui fonctionne correctement dans PhpMyAdmin :

    SELECT DISTINCT `ville`
    FROM `villes`
    WHERE LOWER( `ville` ) LIKE CONVERT( _utf8 'marsé%'
    USING utf8 )
    COLLATE utf8_general_ci
    ORDER BY `ville` ASC

    Celà me renvoie bien le résultat "Marseille" par exemple.

    Cependant, en passant par Php et mysql_query, celà ne marche plus.

    Merci pour votre aide,

    Bonne journée, Tony.

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Points : 148
    Points
    148
    Par défaut
    Tu peux poster ta requete en php-mysql stp.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Je ne suis pas sur d'avoir compris ta demande peux tu préciser ?

    Je précise que lorsque dans ma requête ci-dessus, je remplace le "é" par un "e", celà fonctionne aussi bien dans mon code php que dans PhpMyAdmin.

    Merci

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Points : 148
    Points
    148
    Par défaut
    Cependant, en passant par Php et mysql_query, celà ne marche plus.
    Tu peux poster cette version la de ta requette stp.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Oki,

    Donc voici la requête telle qu'elle déclarée dans mon code php :

    $sql =
    "SELECT DISTINCT `ville` FROM `villes` WHERE LOWER(`ville`) LIKE CONVERT(_utf8 '".strtolower(utf8_decode($_POST['ville']))."%' USING utf8) COLLATE utf8_general_ci ORDER BY `ville` ASC";

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 199
    Points : 148
    Points
    148
    Par défaut
    Utilise les balise code stp, c´est vraiment plus facile pour voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $sql = 
    "SELECT DISTINCT `ville` FROM `villes` WHERE LOWER(`ville`) LIKE CONVERT(_utf8 '".strtolower(utf8_decode($_POST['ville']))."%' USING utf8) COLLATE utf8_general_ci ORDER BY `ville` ASC";
    Je suis pas un pro en BDD, mais pourquoi ce % avant de fermer tes '' ?
    Et ou est le mysqlquerry ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Désolé, je vais essayé les balises code.

    Le pourcent associé au mot clé LIKE permet de prendre en compte la recherche que sur le début du mot, le %, remplaçant tout autre caractère ou chaine de caractères.

    Mon code complet pour l'appel est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $db->connect();
    $req = $db->send_query($sql);
    $db->close();
    sachant que le connect correspond à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    $this->db_handler = @mysql_connect($this->SQL_server, $this->user_name, $this->password);
    if (!$this->db_handler) {
    	# Impossible to connect
    	$sql_erreur = mysql_error();
    	# Impossible to use the db
    	$this->functions->display_error_page($sql_erreur, 'Impossible de se connecter &agrave la base de donnée');
    } else {
    	$dbSelected = @mysql_select_db($this->db, $this->db_handler);
    	if (!$dbSelected) {
    		$sql_erreur = mysql_error();
    		# Impossible to use the db
    		$this->functions->display_error_page($sql_erreur, 'Impossible d\'utiliser la base');
    	}
    }
    et la fonction send_query :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # Send query
    $res = @mysql_query($query, $this->db_handler);
    # Test result
    if (!$res) {
    	  $sql_erreur = mysql_error($this->db_handler);
    	# Impossible to use the db
    	$this->functions->display_error_page($sql_erreur, 'Impossible d\'effectuer la requête');
    }
    # Return result
    return $res;
    et enfin la fonction close :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_close($this->db_handler);
    Voili.

  8. #8
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Salut,

    Tes pages sont-elles en UTF-8?
    Ta base de donnée fonctionne-t'elle en UTF-8?

    Je ne comprends à quoi sert ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CONVERT(_utf8 '".strtolower(utf8_decode($_POST['ville']))."%' USING utf8) COLLATE utf8_general_ci

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Ma base n'est pas en UTF-8 mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CHARSET=latin1 COLLATE=latin1_general_cs
    Mes pages sont en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    content="text/html; charset=ISO-8859-1"
    La portion de code que tu cites me permet de faire une recherche accent insensitive, c'est à dire, si je mets "cinema", les enregistrements "cinema", mais également "cinéma" vont m'être retournés.

    Ce que je ne comprends pas, c'est la différence de prise en charge de ma requête vi php ou directement dans PhpMyAdmin.

  10. #10
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Voilà ce que ta requête retourne à partir de php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT `ville` FROM `villes` WHERE LOWER(`ville`) LIKE CONVERT(_utf8 'mars?%' USING utf8) COLLATE utf8_general_ci ORDER BY `ville` ASC
    Donc pas de résultat!

    Je ne crois pas que cela soit la solution pour faire une recherche insensible aux accents.

    parse plutôt ta chaîne à l'aide du fonction qui les supprimera.

  11. #11
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Comment as-ti fait pour récupérer cette requête ? A quel niveau l'as-tu récupéré ?

    Quand j'imprime ma requête à l'écran avant de l'envoyer dans mysql_query, j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT `ville` FROM `villes` WHERE LOWER(`ville`) LIKE CONVERT(_utf8 'marsé%' USING utf8) COLLATE utf8_general_ci ORDER BY `ville` ASC
    Je n'ai pas de "?".

    Ensuite, j'ai des accents dans ma base, je ne peux pas modifier tous les enregistrements de ma base pour supprimer les accents et faire des requêtes ou je supprimerais les accents de la saisie de l'utilisateur ...

  12. #12
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Oui évidemment, tu ne peux pas faire cela.

    Pour le résultat de la requête, j'ai fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    $var = "marsé";
    $sql = "SELECT DISTINCT `ville` FROM `villes` WHERE LOWER(`ville`) LIKE CONVERT(_utf8 '".strtolower(utf8_decode($var))."%' USING utf8) COLLATE utf8_general_ci ORDER BY `ville` ASC";
    echo $sql;
    ?>
    Résultat :
    SELECT DISTINCT `ville` FROM `villes` WHERE LOWER(`ville`) LIKE CONVERT(_utf8 'mars?%' USING utf8) COLLATE utf8_general_ci ORDER BY `ville` ASC

  13. #13
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Ah oui! encore une chose... de mon côté si je fais une recherche dans une colonne de type text, le résultat est renvoyé indépendamment des accents.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    -- 
    -- Structure de la table `ttable`
    -- 
     
    CREATE TABLE `ttable` (
      `id_row` int(10) unsigned NOT NULL auto_increment,
      `description` text,
      PRIMARY KEY  (`id_row`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
     
    -- 
    -- Contenu de la table `ttable`
    -- 
     
    INSERT INTO `ttable` (`id_row`, `description`) VALUES 
    (1, 'L''évènement d''aujourd''hui');
    SELECT * FROM `ttable` WHERE description like '%éve%'
    renvoie la même chose que
    SELECT * FROM `ttable` WHERE description like '%eve%'

    J'espère que cela pourra t'aider?!

  14. #14
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    D'accord, je comprends mieux ... par contre, c'est plus complique que celà. J'ai fait un test ou j'envoie directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $query = "SELECT DISTINCT `hot_ville` FROM `hotel` WHERE LOWER(`hot_ville`) LIKE CONVERT(_utf8 'marsé%' USING utf8) COLLATE utf8_general_ci ORDER BY `hot_ville` ASC";
    dans le mysql_query. Je suis donc sûr d'envoyer un "é". Par contre, l'utilité du utf8-decode() dans mon code précédent et pour récupérer correctement de "é" qui me vient d'un formulaire et qui se retrouvait effectivement transformé en autre chose.

    Par contre, il est pour moi incompréhensible que ma query ci-dessus ne fonctionne pas ...

  15. #15
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Chez moi ca fonctionne dans une recherche sur une colonne dont le type est "text"

  16. #16
    Futur Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Mon champ est de type VARCHAR.
    Le comportement n'est pas le même.

  17. #17
    Membre habitué
    Avatar de savageman86
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 199
    Points
    199
    Par défaut
    En fait, tu as ceci :

    CHARSET=latin1 COLLATE=latin1_general_cs

    Le CS à la fin de latin1_general signifie Case sensitive (sensible à la casse).
    Utilise la version CI (case insensitive, insensible à la casse).

    @+

  18. #18
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Citation Envoyé par savageman86 Voir le message
    En fait, tu as ceci :

    CHARSET=latin1 COLLATE=latin1_general_cs

    Le CS à la fin de latin1_general signifie Case sensitive (sensible à la casse).
    Utilise la version CI (case insensitive, insensible à la casse).

    @+
    Est-ce que ceci va permettre d'être insensible aux accents????

  19. #19
    Membre habitué
    Avatar de savageman86
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Points : 199
    Points
    199
    Par défaut
    A priori, c'est le charset qui sait ça.

    En fait dans latin1_general_ci, tu as 3 choses :
    latin1 : l'encodage
    general : le charset
    ci ou cs : la sensitivité à la casse

    Le charset general est générique (il tente de prendre en compte un maximum de spécificités), mais tu as french, swedish (en gros un pour chaque langue). C'est lui qui défini que le caractère "e" est équivalent à "E", mais aussi à "è" et "é" en français.

    Amuses-toi avec ça pour faire tes tests.

  20. #20
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Euh non... moi je préfère l'UTF-8

Discussions similaires

  1. Recherche insensible aux accents
    Par Warluck dans le forum Administration
    Réponses: 4
    Dernier message: 24/09/2013, 14h25
  2. Recherche insensible aux accents avec REGEXP
    Par khasyt dans le forum Requêtes
    Réponses: 7
    Dernier message: 10/08/2009, 03h17
  3. [SELECT] recherche de majuscules accentuées
    Par Huntress dans le forum Langage SQL
    Réponses: 17
    Dernier message: 11/09/2005, 16h39
  4. Recherche insensible à la casse ET insensible aux accents.
    Par Bernard Grosdoy dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 10/07/2005, 03h32
  5. [W3C] Police d'écriture insensible aux modifs
    Par Gribouille26 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/09/2004, 12h36

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