[1/2HS] Interrogations MySQL

Le
andre_debian
Bonjour,

Désolé de cette question pas 100% Debian,
mais MySQL tourne sous Debian Jessie :-)

$brief est une variable correspondant à un mot clé
qui ne peut contenir que 3 infos maxi séparées par un espace.

On va supposer que le mot clé = "paris"

SELECT DISTINCT email, prenom, famille, ville FROM table
WHERE MATCH (email, prenom, famille, ville)
AGAINST ('+$brief[0] +$brief[1] +$brief[2]' IN BOOLEAN MODE)

et la base affiche toutes les personnes qui ont une info liée à Paris.

Mais si le mot clé =" par"
la base ne m'affiche aucun résultat.
Elle ne va matcher que les infos qui contiennent * exactement * "par"

J'ai tenté cette méthode (ajouter un "%" de part et d'autres de la vari=
able) :
AGAINST ('+%$brief[0]% +%$brief[1]% +%$brief[2]%' IN BOOLEAN MODE)
ça ne fonctionne pas.

Dommage, car c'est utile lorsque on est pas sûr de l'orthographe d'un cha=
mp,
et que l'on a retenu que ses x premières lettres.

Il y a cette méthode mais trop basique car elle ne permet pas des recherc=
hes
sur mots clés multiples :
SELECT DISTINCT email, prenom, famille, ville FROM table
WHERE email LIKE '%$brief%' OR ville LIKE '%$brief%'

Ma question : comment le faire avec : WHERE MATCH AGAINST

Merci.

André
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
S
Le #26387536
Bonjour,

Le mardi 02 février 2016 à 11:34, a écrit :
SELECT DISTINCT email, prenom, famille, ville FROM table
WHERE MATCH (email, prenom, famille, ville)
AGAINST ('+$brief[0] +$brief[1] +$brief[2]' IN BOOLEAN MODE)



Attention aux concaténations de chaînes de caractères lors de l'initialisation
d'une requête, c'est souvent par là qu'arrivent les injections SQL…

Sébastien
BERBAR Florian
Le #26387550
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

On 02/02/2016 11:34, wrote:
Bonjour,

Désolé de cette question pas 100% Debian, mais MySQL tourne sous
Debian Jessie :-)

$brief est une variable correspondant à un mot clé qui ne peut
contenir que 3 infos maxi séparées par un espace.

On va supposer que le mot clé = "paris"

SELECT DISTINCT email, prenom, famille, ville FROM table WHERE
MATCH (email, prenom, famille, ville) AGAINST ('+$brief[0]
+$brief[1] +$brief[2]' IN BOOLEAN MODE)

et la base affiche toutes les personnes qui ont une info liée à
Paris.

Mais si le mot clé =" par" la base ne m'affiche aucun résultat.
Elle ne va matcher que les infos qui contiennent * exactement *
"par"

J'ai tenté cette méthode (ajouter un "%" de part et d'autres de la
variable) : AGAINST ('+%$brief[0]% +%$brief[1]% +%$brief[2]%' IN
BOOLEAN MODE) ça ne fonctionne pas.

Dommage, car c'est utile lorsque on est pas sûr de l'orthographe
d'un champ, et que l'on a retenu que ses x premières lettres.

Il y a cette méthode mais trop basique car elle ne permet pas des
recherches sur mots clés multiples : SELECT DISTINCT email, prenom,
famille, ville FROM table WHERE email LIKE '%$brief%' OR ville LIKE
'%$brief%' ...

Ma question : comment le faire avec : ... WHERE MATCH ... AGAINST

Merci.

André




Bonjour André,

Je en regardant la requête SQL utilisant la fonction AGAINST que tu
essais d’exécuter, nous pouvoir voir que tu tentes d'utiliser le
caractère joker (wildcard) '%' afin de compléter les mots clefs
servant de critère à ta requête à l'image de ce que tu pourrais faire
à l'aide de la fonction LIKE.

La documentation de MySQL au sujet du couple de fonction MATCH et
AGAINST
(https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#function_m
atch),
ne fait pas référence à la possibilité d'utiliser des caractères
jokers (wildcard) à l'image de ce que tu pourrais faire avec la
fonction LIKE
(https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.htm
l#operator_like).
Il semblerait que tu sois contraint à l’utilisation de mot complet.

Bon courage,

Florian
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJWsJ2xAAoJEBGYNnE0a7qPrQkP+wW7za2iwl2660wgE4Z/vV2z
Ot7luM0iVfUx4DgL4rOEll0d16gxMxg2ihLYA8/bZfgV6iLVSJe+gtCB0aImJ+GT
Z8ClpuHoh9MVKZlsaoczxJdUXmhY95z9affk15eZ0ZHp8y7T8bznvLdaUnUrZQ/H
II1S3W4wnc5nftmJ3w9F7bmCnq/uiob0jduKaTO63cRQBtpbhOEGdxoF1GGsOj9T
iEbOpE5TRYgr2j8B1N3nug7b+z32AyDjaj58LEl34vrfgcboJgY0w4G5c9Qw9iwm
yZkEZrs9wUf2OTQHelLteaOXAWs+vIWJIpkxlHa2DxSE0oafyC8nIFcFaJDk1vjl
bNDiWkz1me4ls1aqjKVFCoAo28ddeOK5UsujyS0u1VhwnUXejzHTLt1mnZeiPdkB
44mOL9Cx0FHEUjL3F74VdAZwYU3ydTZo0Blu7g0/AoKP56WFjKilYRNRTuEatC2B
q00IB5pdxhBWDMKpznh1o0HHKC6wPbTvvEAHyu1Cd/224K0T/LlVuHMrpEU/HZpj
PN2lNzS7yzRP+gsYhO1E6+jHDLfmPzx6Tvkwe5xx11xcwIxKZRJQ9ZbAPllcyXsV
JP6fZhYqhwjRH75p/FU4irmVZa+fKJy2IynCDIGlj+sqpwZXHdF8HuKocFhJh/nA
FWwx+TkvJwGqbg2Dk/zf
=wXgU
-----END PGP SIGNATURE-----
Daniel Caillibaud
Le #26387571
Le 02/02/16 à 13:14, BERBAR Florian
BF> -----BEGIN PGP SIGNED MESSAGE-----
BF> Hash: SHA256
BF>
BF> On 02/02/2016 11:34, wrote:
BF> > Bonjour,
BF> >
BF> > Désolé de cette question pas 100% Debian, mais MySQL tourne sous
BF> > Debian Jessie :-)
BF> >
BF> > $brief est une variable correspondant à un mot clé qui ne p eut
BF> > contenir que 3 infos maxi séparées par un espace.
BF> >
BF> > On va supposer que le mot clé = "paris"
BF> >
BF> > SELECT DISTINCT email, prenom, famille, ville FROM table WHERE
BF> > MATCH (email, prenom, famille, ville) AGAINST ('+$brief[0]
BF> > +$brief[1] +$brief[2]' IN BOOLEAN MODE)
BF> >
BF> > et la base affiche toutes les personnes qui ont une info liée à
BF> > Paris.
BF> >
BF> > Mais si le mot clé =" par" la base ne m'affiche aucun rés ultat.
BF> > Elle ne va matcher que les infos qui contiennent * exactement *
BF> > "par"
BF> >
BF> > J'ai tenté cette méthode (ajouter un "%" de part et d'autre s de la
BF> > variable) : AGAINST ('+%$brief[0]% +%$brief[1]% +%$brief[2]%' IN
BF> > BOOLEAN MODE) ça ne fonctionne pas.
BF> >
BF> > Dommage, car c'est utile lorsque on est pas sûr de l'orthographe
BF> > d'un champ, et que l'on a retenu que ses x premières lettres.
BF> >
BF> > Il y a cette méthode mais trop basique car elle ne permet pas des
BF> > recherches sur mots clés multiples : SELECT DISTINCT email, pren om,
BF> > famille, ville FROM table WHERE email LIKE '%$brief%' OR ville LIKE
BF> > '%$brief%' ...
BF> >
BF> > Ma question : comment le faire avec : ... WHERE MATCH ... AGAINST
BF> >
BF> > Merci.
BF> >
BF> > André
BF> >
BF>
BF> Bonjour André,
BF>
BF> Je en regardant la requête SQL utilisant la fonction AGAINST que tu
BF> essais d’exécuter, nous pouvoir voir que tu tentes d'utili ser le
BF> caractère joker (wildcard) '%' afin de compléter les mots cle fs
BF> servant de critère à ta requête à l'image de ce que tu pourrais faire
BF> à l'aide de la fonction LIKE.
BF>
BF> La documentation de MySQL au sujet du couple de fonction MATCH et
BF> AGAINST
BF> (https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#function_m
BF> atch),
BF> ne fait pas référence à la possibilité d'utiliser d es caractères
BF> jokers (wildcard) à l'image de ce que tu pourrais faire avec la
BF> fonction LIKE
BF> (https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.htm
BF> l#operator_like).
BF> Il semblerait que tu sois contraint à l’utilisation de mot complet.

De mémoire pour ce genre de chose il fallait effectivement indexer soi -même les mots et les
"début de mot".

Un SGBDR est pas très performant sur ce genre de chose (même si p ostgresql fait un peu mieux je
crois), pour de gros volume ajouter un solr ou elasticsearch est finalement plus simple (on le
configure une fois en lui donnant les champs à indexer et il fournit a utocompletion et
recherche par facette, entre autre). Pour de petits volume, faut ajouter un peu de code.

--
Daniel

La vie est trop courte pour qu'on soit pressé.
Henry David Thoreau
Daniel Caillibaud
Le #26387570
Le 02/02/16 à 12:09, Sébastien NOBILI
SN> Bonjour,
SN>
SN> Le mardi 02 février 2016 à 11:34, a écrit :
SN> > SELECT DISTINCT email, prenom, famille, ville FROM table
SN> > WHERE MATCH (email, prenom, famille, ville)
SN> > AGAINST ('+$brief[0] +$brief[1] +$brief[2]' IN BOOLEAN MODE)
SN>
SN> Attention aux concaténations de chaînes de caractères lo rs de l'initialisation
SN> d'une requête, c'est souvent par là qu'arrivent les injection s SQL…

Oui, si ton code est du php regarde coté PDO ça va te faciliter l a vie en écrivant des choses
comme

$query = 'SELECT DISTINCT email, prenom, famille, ville FROM table
WHERE MATCH (email, prenom, famille, ville)
AGAINST (:recherche IN BOOLEAN MODE)'
$params = array(
':recherche' => $brief[0] .$brief[1] .$brief[2]
);
$resultats = uneFct($query, $params);

(où uneFct enveloppe un appel à PDO et retourne un tableau, à   adapter à tes besoins)

Autre remarque, en php la concaténation c'est . et pas +, si $brief[xx ] est une chaîne ton
$brief[0] +$brief[1] +$brief[2] vaut toujours 0

--
Daniel

L'argent a rendu l'homme esclave et
personne ne fera de l'argent son esclave.
Gilles Olive
andre_debian
Le #26387580
On Tuesday 02 February 2016 15:25:13 Daniel Caillibaud wrote:
Le 02/02/16 à 12:09, Sébastien NOBILI Oui, si ton code est du php regarde coté PDO ça va te faciliter la vie en


écrivant des choses comme
$query = 'SELECT DISTINCT email, prenom, famille, ville FROM table
WHERE MATCH (email, prenom, famille, ville)
AGAINST (:recherche IN BOOLEAN MODE)'
$params = array(
':recherche' => $brief[0] .$brief[1] .$brief[2]
);
$resultats = uneFct($query, $params);
(où uneFct enveloppe un appel à PDO et retourne un tableau, à   adapter
à tes besoins)
Autre remarque, en php la concaténation c'est . et pas +, si $brief[ xx] est
une chaîne ton
$brief[0] +$brief[1] +$brief[2] vaut toujours 0



Merci à ceux qui m'ont répondu.

Autre remarque, en php la concaténation c'est . et pas + :



Les "+" il me semble l'avoir lu sur le site MySQL.
C'est mon script php qui remplace les espaces par des + :
Mot clé : jean dupont paris => jean+dupont+paris

On les voit dans les requêtes Google qui utilise la base MySQL.
(du moins revue et corrigée...).

Si le mot clé est : jean.dupont paris
ça va bugger.

André
Daniel Caillibaud
Le #26387627
Le 02/02/16 à 15:52, a écrit :

AF> On Tuesday 02 February 2016 15:25:13 Daniel Caillibaud wrote:
AF> > Le 02/02/16 à 12:09, Sébastien NOBILI AF> > Oui, si ton code est du php regarde coté PDO ça va te facil iter la vie en
AF> écrivant des choses comme
AF> > $query = 'SELECT DISTINCT email, prenom, famille, ville FROM table
AF> > WHERE MATCH (email, prenom, famille, ville)
AF> > AGAINST (:recherche IN BOOLEAN MODE)'
AF> > $params = array(
AF> > ':recherche' => $brief[0] .$brief[1] .$brief[2]
AF> > );
AF> > $resultats = uneFct($query, $params);
AF> > (où uneFct enveloppe un appel à PDO et retourne un tableau, à adapter
AF> > à tes besoins)
AF> > Autre remarque, en php la concaténation c'est . et pas +, si $br ief[xx] est
AF> > une chaîne ton
AF> > $brief[0] +$brief[1] +$brief[2] vaut toujours 0
AF>
AF> Merci à ceux qui m'ont répondu.
AF>
AF> > Autre remarque, en php la concaténation c'est . et pas + :
AF>
AF> Les "+" il me semble l'avoir lu sur le site MySQL.

Pour la concatenation de chaine coté mysql, faut utiliser la fonction concat (qui va marcher
partout, indépendamment du charset d'encodage des tables), je connais pas +

AF> C'est mon script php qui remplace les espaces par des + :
AF> Mot clé : jean dupont paris => jean+dupont+paris

Ça c'est quand tu le passe dans une url, parce que l'espace s'encode " +" (ou "%20") dans une
url.

Mais c'est vraiment très important que tu contrôle ces trucs que php récupère de l'url, parce
qu'un robot aura vite fait de trouver qu'en mettant des trucs du genre

jean+dupont+%3B%20truncate%20table%20toto%3B
(qui donnera dans ton php un $brief[2] = "; truncate table toto;", Ã §a va planter parce que
j'ai pas terminé la requête originale, mais tu vois l'idée)

il passe les requêtes qu'il veut sur ta base de données (et en cr eusant un peu il aura pas trop
de mal à afficher la liste des login/pass par exemple).

AF> On les voit dans les requêtes Google qui utilise la base MySQL.
AF> (du moins revue et corrigée...).
AF>
AF> Si le mot clé est : jean.dupont paris
AF> ça va bugger.
AF>
AF> André
AF>
AF>


--
Daniel

Si ceux qui disent du mal de moi, savaient exactement ce que je
pense d'eux, il en diraient bien d'avantage.
Sacha Guitry
Publicité
Poster une réponse
Anonyme