Forums Développement Multimédia

Aller au contenu

Problème d'ordre avec un ORDER BY et des accents.

ORDER BY

26 réponses à ce sujet

#1 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 08 January 2015 - 18:39 PM

Bonjour,
J'ai cherché partout une solution à ce problème mais je sèche.

J'ai une base de donnée en utf8_general_ci, mais quand je fais un

PHP un SELECT ma_valeur FROM ma_table ORDER BY ma_valeur ASC

Le résultat est bien une liste par ordre alphabétique, mais comme dans la base l'encodage d'un caractère accentué comme É est É, les noms commençant par É arrivent juste après les noms commençant par A dans ma liste, au lieu d'arriver après les E.

Si quelqu'un sait comment faire… j'ai bien essayé un ORDER BY ma_valeur COLLATE utf8_general_ci , mais ça n'a pas l'air de marcher.

Merci d'avance !

#2 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 09:32 AM

Bizarre, j'ai testé

ORDER BY ma_valeur COLLATE utf8_general_ci
 
et ça trie correctement la table

#3 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 11:52 AM

Salut !
Merci de ta réponse.
Faut-il mettre le COLLATE avant ou après le ASC ?

#4 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 11:55 AM

le ASC n'est pas nécessaire

#5 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 12:00 PM

Je viens de réessayer, ça ne marche toujours pas.
mon code :

 $reponse = $bdd->query('SELECT id, auteur  FROM boutique ORDER BY auteur COLLATE utf8_general_ci ');

Lors de leur envoi dans la base (en utf8_general_ci) , les é sont convertis en é
Est-ce normal ?

#6 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 12:21 PM

tu as ajouté

mysql_set_charset( 'utf8' );
 
avant la requête

#7 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 12:33 PM

Ah non (je suis débutant en php) :P

Je viens d'essayer mais je ne dois pas syntaxer ça correctement, ça me donne une erreur sur ma page.

Warning: mysql_set_charset() [function.mysql-set-charset]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in

J'ai écrit:
// Récupération des AUTEURS
mysql_set_charset( 'utf8' );
    $reponse = $bdd->query(' SELECT DISTINCT auteur FROM boutique ORDER BY auteur COLLATE utf8_general_ci ');


#8 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 15:55 PM

essaie

$bdd->set_charset("utf8")
 


#9 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 15:58 PM

Fatal error: Call to undefined method PDO::set_charset() in…

#10 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 17:34 PM

montre ton code php, tu utilises quoi comme hébergement ?

#11 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 17:38 PM

// Récupération des AUTEURS
    $reponse = $bdd->set_charset("utf8");
    query('SELECT DISTINCT auteur FROM boutique ORDER BY auteur ASC');

Je suis chez OVH

#12 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 17:46 PM

tu utilises mysqli, le code php pour te connecter à la bdd ?

#13 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 17:56 PM

euh, je fais un "pdo"

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=xxx ;dbname=xxx', 'xxx', 'xxx', $pdo_options);

#14 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 18:03 PM

essaye

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=xxx ;dbname=xxx', 'xxx', 'xxx', $pdo_options;charset=UTF-8);
 


#15 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 18:15 PM

Ça me met une erreur de code quand j'écris ça.

Image IPB

#16 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 18:34 PM


$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=xxx;dbname=xxx;charset=UTF-8', 'xxx', 'xxx', $pdo_options);
 


#17 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 18:57 PM

Ça me dit

Erreur : SQLSTATE[HY000] [2019] Can't initialize character set UTF-8 (path: /usr/share/mysql/charsets/)

#18 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 19:01 PM

autre solution

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=xxx;dbname=xxx', 'xxx', 'xxx', $pdo_options);
$bdd->exec("SET NAMES 'UTF8'");
 


#19 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 19:05 PM

Ca me dit

Fatal error: Call to undefined method PDO::set_charset() in

désolé ^_^'

#20 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 19:06 PM

laisse tomber PDO, utilise mysqli, le version d'ovh ne doit pas être très récente

#21 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 19:20 PM

Ah si pardon ta dernière proposition ne fait pas d'erreur, mais la seule chose que ça fait, c'est qu'au lieu de me récupérer les données converties de l'utf8 (donc les accents correctement affichés), ça me récupère les symboles encodés en UTF8 (ce qui est écrit littéralement dans la base

Image IPB

Et ça ne change pas le classement

É (censé être É) arrive toujours après les A (normal si son encodage en UTF8 est É

#22 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 19:28 PM

très bien, ta table est en utf-8, chez moi les caractères apparaissent correctement dans phpMyAdmin

#23 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 19:36 PM

Ah chez moi, dans ma table phpMyAdmin, les noms apparaissent avec les caractères accentués encodés.

Image IPB

Peut-être que c'est lors de l'envoi des données qu'il y a quelque chose que je fais mal. Pourtant j'envoie les données brutes dans des variables simples. J'ai enlevé tous les htmlspecialchars, et tous les htmlspecialentities

#24 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 20:34 PM

tu as utilisé utf8_encode ?

#25 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 20:37 PM

non je n'ai rien utilisé du tout dans mes pages d'envoi de donnée pour coder celles-ci.

J'ai un truc comme ça :



$auteur =$_POST['auteur'];

  $req = $bdd->prepare('INSERT INTO boutique (auteur,...) VALUES(?,...)');
    $req->execute(array($auteur, ...));
 


#26 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1749 messages

Posté 09 January 2015 - 20:47 PM

ta page d'où tu envoies tes données doit utiliser soit le codage utf-8, exemple pour une page html

<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8">
 

soit encoder les variables en utf-8

$auteur = utf8_encode($_POST['auteur']);
 


#27 raoul-douglas

    Ceinture Blanche

  • Members
  • Pip
  • 14 messages

Posté 09 January 2015 - 21:03 PM

Je viens d'essayer mais ça ne change pas grand chose. La base reçois le caractère é encodé en é au lieu de é donc ça me le classera de toute façon juste après les a, et pas après les e

Bon, c'est pas grave. Après tout le cas ne se présente que pour une seule entrée. Je vais me faire à l'idée qu'il y ait une petit coquille dans mon classement alphabétique. ^_^

Merci beaucoup en tout cas.



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP