•  » Plugins
  •  » Insensible à la casse...

#301 2011-03-03 21:24:22

Whiler
Membre
Clichy
2004-12-24
189

Re: Insensible à la casse...

Eric a écrit:

Code:

SELECT username
FROM '.USERS_TABLE.'
WHERE '.LCAS_change_case(.'username'.).' LIKE '.$_post($username).';

Si on choisit l'option insensible aux accents... ça va générer une sacré matrice...

Exemple :
Mémé...
Meme, Méme, MeMé, Mêmé, Mèmë, .....

Ce serait plutôt un IN qu'un LIKE... mais il y aura un potentiel gros tableau...

Hors ligne

#302 2011-03-03 21:27:02

LucMorizur
Membre
Vienne (Isère, 38)
2009-03-01
1969

Re: Insensible à la casse...

Whiler a écrit:

Luc :

Pas testé dans notre contexte... mais une idée en passant (je ne sais pas s'il faut des libs spécifiques)
Un truc du genre :

Code:

<?php
$username = 'водка';
$a = preg_split('//u', $username, -1, PREG_SPLIT_NO_EMPTY);
print_r($a);
?>

Grâce au u, je renvoie bien 5 caractères...

Array ( [0] => в [1] => о [2] => д [3] => к [4] => а )

(sans le u, 10... ;o))

Array ( [0] => Ð [1] => ² [2] => Ð [3] => ¾ [4] => Ð [5] => ´ [6] => Ð [7] => º [8] => Ð [9] => ° )

Intéressant ! Et en désactivant l'extension mbstring ??... je vais tester ça ce soir. N'empêche, ça fait avancer le schmilblick. Si ça ne fonctionne pas, j'ajouterai un test avec extension_loaded('mbstring') , qu'on puisse au moins prévenir (sans affichage d'erreur) que l'hébergement n'est pas adapté pour LCAS :-/ ...

Hors ligne

#303 2011-03-03 21:30:34

LucMorizur
Membre
Vienne (Isère, 38)
2009-03-01
1969

Re: Insensible à la casse...

Whiler a écrit:

Eric a écrit:

Code:

SELECT username
FROM '.USERS_TABLE.'
WHERE '.LCAS_change_case(.'username'.).' LIKE '.$_post($username).';

Si on choisit l'option insensible aux accents... ça va générer une sacré matrice...

Exemple :
Mémé...
Meme, Méme, MeMé, Mêmé, Mèmë, .....

Ce serait plutôt un IN qu'un LIKE... mais il y aura un potentiel gros tableau...

??

Le SELECT est effectué sur username, donc ne peuvent sortir que les username inscrits dans la galerie ? S'il y a "Mémé" et "Mèmë", ils vont sortir tous les deux, mais pas "Meme", "Méme", "MeMé", et "Mêmé" (et tous les autres), non ? Me planté-je ?

Hors ligne

#304 2011-03-03 21:45:03

LucMorizur
Membre
Vienne (Isère, 38)
2009-03-01
1969

Re: Insensible à la casse...

LucMorizur a écrit:

Whiler a écrit:

Code:

<?php
$username = 'водка';
$a = preg_split('//u', $username, -1, PREG_SPLIT_NO_EMPTY);
print_r($a);
?>

Intéressant ! Et en désactivant l'extension mbstring ?

Génial !

Code:

<?php
  $a = extension_loaded('mbstring') ? 'true' : 'false';
  echo('extension_loaded("mbstring")&nbsp;: '.$a.'<br><br>');
  
  $username = 'водка';
  $a = preg_split('//u', $username, -1, PREG_SPLIT_NO_EMPTY);
  print_r($a);
?>

Renvoie :

Code:

extension_loaded("mbstring") : false

Array ( [0] => в [1] => о [2] => д [3] => к [4] => а )

On peut donc a priori faire fonctionner LCAS même avec l'extension mbstring non chargée !

Personnellement, je vais continuer là-dessus, OK ?

Hors ligne

#305 2011-03-03 22:11:48

LucMorizur
Membre
Vienne (Isère, 38)
2009-03-01
1969

Re: Insensible à la casse...

LucMorizur a écrit:

On peut donc a priori faire fonctionner LCAS même avec l'extension mbstring non chargée !

A priori, ce n'est plus a priori ;-) !

[Subversion] r9499

Hors ligne

#306 2011-03-03 22:14:29

Whiler
Membre
Clichy
2004-12-24
189

Re: Insensible à la casse...

LucMorizur a écrit:

Génial !

ne parle pas de moi comme ça.. ça me rend mal à l'aise ;o))


LucMorizur a écrit:

Le SELECT est effectué sur username, donc ne peuvent sortir que les username inscrits dans la galerie ? S'il y a "Mémé" et "Mèmë", ils vont sortir tous les deux, mais pas "Meme", "Méme", "MeMé", et "Mêmé" (et tous les autres), non ? Me planté-je ?

Je regarde seulement le WHERE d'Eric...

Je ne vois pas comment écrire une clause WHERE simple/courte...
Sans générer TOUS les cas possibles... (ou récupérer TOUS les users pour les convertir côté PHP...)

Dernière modification par Whiler (2011-03-03 22:15:22)

Hors ligne

#307 2011-03-03 22:26:42

LucMorizur
Membre
Vienne (Isère, 38)
2009-03-01
1969

Re: Insensible à la casse...

Whiler a écrit:

LucMorizur a écrit:

Génial !

ne parle pas de moi comme ça.. ça me rend mal à l'aise ;o))

Je te comprends : ça me fait pareil...........

Sauf que... moi, on ne me le dit jamais :'-(( .........

Whiler a écrit:

LucMorizur a écrit:

Le SELECT est effectué sur username, donc ne peuvent sortir que les username inscrits dans la galerie ? S'il y a "Mémé" et "Mèmë", ils vont sortir tous les deux, mais pas "Meme", "Méme", "MeMé", et "Mêmé" (et tous les autres), non ? Me planté-je ?

Je regarde seulement le WHERE d'Eric...

Je ne vois pas comment écrire une clause WHERE simple/courte...
Sans générer TOUS les cas possibles... (ou récupérer TOUS les users pour les convertir côté PHP...)

Si je comprends bien, tu veux dire que c'est dans "l'intérieur" de MySQL, que tous les cas sont générés ? Et ça, ça peut affecter le temps de réponse ?

Hors ligne

#308 2011-03-03 22:33:22

Whiler
Membre
Clichy
2004-12-24
189

Re: Insensible à la casse...

Je rephrase ce que j'ai compris... Eric pourra confirmer ou infirmer...

La question est comment tester si un nom d'utilisateur est déjà pris ou pas ?

Actuellement, on récupère tous les utilisateurs enregistrés, on les passe un par un à la moulinette LCAS pour obtenir la forme convertie en fonction de l'option LCAS choisie (Colonne comparaison dans le tableau du plugin)...
Une fois qu'ils sont tous passés, on sait que le nom est libre...

Comment simplifier pour ne pas charger tous les utilisateurs ?

Hors ligne

#309 2011-03-03 23:50:12

Eric
Former Piwigo Team
VALENCE (FR)
2005-03-25
4579

Re: Insensible à la casse...

Whiler a écrit:

Je rephrase ce que j'ai compris... Eric pourra confirmer ou infirmer...

La question est comment tester si un nom d'utilisateur est déjà pris ou pas ?

Actuellement, on récupère tous les utilisateurs enregistrés, on les passe un par un à la moulinette LCAS pour obtenir la forme convertie en fonction de l'option LCAS choisie (Colonne comparaison dans le tableau du plugin)...
Une fois qu'ils sont tous passés, on sait que le nom est libre...

Comment simplifier pour ne pas charger tous les utilisateurs ?

Oui, c'est çà. Pour l'instant, çà se passe bien avec le code actuel car on teste généralement sur des galeries quasi-vides d'utilisateurs.
L'exemple de requête que j'ai proposé, je l'ai sorti comme çà sans même réfléchir si c'était correct. C'est vrai que le LIKE n'est probablement pas le plus approprié. Mais l'idée reste de "requêter" d'un coup les usernames en bdd qui matchent le username saisi (soit par un nouvel inscrit, soit par l'admin quand il traite les conflits) sans avoir à charger tous les username dans un tableau à chaque fois.

Dans l'absolu, on n'a besoin que d'une seule correspondance pour arrêter le processus d'inscription ou de renommage. En effet, s'il n'existe qu'un seul username en bdd, il devient inutilisable.

Hors ligne

#310 2011-03-04 00:10:54

Whiler
Membre
Clichy
2004-12-24
189

Re: Insensible à la casse...

Eric a écrit:

Dans l'absolu, on n'a besoin que d'une seule correspondance pour arrêter le processus d'inscription ou de renommage.

On est parfaitement d'accord. (c'est pour ça que dans mon exemple, j'ai parlé d'un utilisateur qui ne poserait pas de problème et qui du coup oblige à tout parcourir pour s'en assurer... s'il existe, on quitte bien évidemment la boucle ;o))

Eric a écrit:

En effet, s'il n'existe qu'un seul username en bdd, il devient inutilisable.

J'comprends pas ce que tu veux dire ?

Hors ligne

#311 2011-03-04 13:31:31

Eric
Former Piwigo Team
VALENCE (FR)
2005-03-25
4579

Re: Insensible à la casse...

Whiler a écrit:

Eric a écrit:

En effet, s'il n'existe qu'un seul username en bdd, il devient inutilisable.

J'comprends pas ce que tu veux dire ?

Rien, laisses tomber :o)
Il commençait à se faire tard quand j'ai écrit çà et la journée avait été plus fatigante, et bla-bla-bla... Bref, je me suis embrouillé. ;-)

Hors ligne

#312 2011-03-04 13:43:27

LucMorizur
Membre
Vienne (Isère, 38)
2009-03-01
1969

Re: Insensible à la casse...

Whiler a écrit:

Eric a écrit:

En effet, s'il n'existe qu'un seul username en bdd, il devient inutilisable.

J'comprends pas ce que tu veux dire ?

Je pense qu'Éric voulait dire qu'à partir du moment où un username existe dans la base, il ne peut plus être utilisé par un autre utilisateur.

Pour répondre au questionnement en cours, je dirais : avons-nous le choix ? Car en fin de compte, on est bien obligé de vérifier, à certains moments, qu'un username proposé n'existe pas, et donc, potentiellement, de le comparer avec tous les username existants, en convertissant tout à la moulinette LCAS.

On peut imaginer une table "cache", qui stocke tous les username transformés par LCAS, mais dans le cas où le webmestre modifie son option LCAS, ou au moment de l'installation, ça risque de faire mal.

Hors ligne

#313 2011-03-04 14:05:08

Whiler
Membre
Clichy
2004-12-24
189

Re: Insensible à la casse...

LucMorizur a écrit:

Pour répondre au questionnement en cours, je dirais : avons-nous le choix ? Car en fin de compte, on est bien obligé de vérifier, à certains moments, qu'un username proposé n'existe pas, et donc, potentiellement, de le comparer avec tous les username existants, en convertissant tout à la moulinette LCAS.

Oui.. mais ;o)
Il y a plusieurs solutions possibles : Soit, c'est PHP, soit c'est la DB, soit un mix des deux qui peut faire le taf...

Là, on utilise que PHP... qui prend tout et recherche partout...

Une autre solution serait de préparer une requête plus sophistiquée et de demander à la DB s'il y a des résultats...
Dans le genre... ça pourrait ressembler à ça, quand c'est insensible à la casse et aux accents...

Généré en PHP :
Utilisateur choisie : Béatrice (par exemple)
select username from user where LOWER(username) in ('beatrice', 'béatrice', 'bèatrice', 'bêatrice', 'bëatrice');

Si c'est sensible à la casse :
BÉA
select username from user where username in ('BEA', 'BÉA', 'BÊA', ...);


LucMorizur a écrit:

On peut imaginer une table "cache", qui stocke tous les username transformés par LCAS, mais dans le cas où le webmestre modifie son option LCAS, ou au moment de l'installation, ça risque de faire mal.

Oui, je suis d'accord, le cache me fait encore plus peur...

Hors ligne

#314 2011-03-04 14:08:07

Whiler
Membre
Clichy
2004-12-24
189

Re: Insensible à la casse...

L'idée serait de
- générer la forme basique
puis de
- prendre tes tableaux de conversion à l'envers pour générer tous les cas possibles afin de les mettre dans une clause where user IN


Je ne sais pas si ça vaut le coup ou pas... ?

Hors ligne

#315 2011-03-04 14:23:27

Eric
Former Piwigo Team
VALENCE (FR)
2005-03-25
4579

Re: Insensible à la casse...

Whiler a écrit:

L'idée serait de
- générer la forme basique
puis de
- prendre tes tableaux de conversion à l'envers pour générer tous les cas possibles afin de les mettre dans une clause where user IN

C'est ce que je pensais aussi : Comparer les username sous une forme neutre. Par exemple : Mémé deviendrait meme pour toutes les comparaisons.

Whiler a écrit:

Je ne sais pas si ça vaut le coup ou pas... ?

L'idéal serait de mesurer les temps de traitement avec le code actuel sur une table de plusieurs centaines de users (+ de 100 au minimum) et d'effectuer la même mesure avec d'autres méthodes (table de cache, requêtes full MySql,...).

Perso, une de mes galeries aligne au max 73 users. C'est trop peu...

Hors ligne

  •  » Plugins
  •  » Insensible à la casse...

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact