CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[php/bdd] Question sur la recherche

Ion_Negatif
Ion_Negatif
Niveau 10
28 juin 2009 à 16:00:18

Bonjour a tous :)

Voila en fait j'utilise MySQL, je code en php, et j'aimerais savoir deux choses.

La première : je sais chercher un enregistrement en cherchant un ou plusieurs champs (par exemple SELECT * FROM table WHERE unchamp="trucmuche" )

Mais en fait, je me demande comment faire pour faire une sorte de moteur de recherche. Je m'explique : si j'ai par exemple une table "message", qui contiendrait tout les messages d'un chat ou d'un petit forum, et qu'elle a donc un champ "message", qui contient le texte brut du message (comme ce que je suis en train d'écrire), comment chercher dans ce texte un ou plusieurs termes, et récuperer les champs en question :question:

Et également je me demandais : existe-t-il un moyen de stocker plusieurs "mot" dans un champs d'une bdd, et de chercher ensuite si ce champs contient un ou plusieurs mots ? Par exemple, dans le cas d'un blog, ou les article seraient classés par tags (par exemple un article qui aurait les tag "Jeux video, Nintendo, super mario"), comment stocker ces 3 termes dans la base de donnée ? Je pense a l'option "serialize" (que j'ai apprise ici d'ailleurs) et qui permet dans de stocker un tableau dans lequel je mettrais lesdites variables, mais la je me demande vraiment comment chercher ces champs par la suite :-( (on retrouverais par exemple l'article en question a la fois en cherchant "jeux video", "nintendo", "super mario", ou plusieurs de ces trois termes)

En esperant avoir été le plus clair possible, n'hésitez surtout pas a demander si j'ai mal expliqué :) merci d'avance :-)

deepblue
deepblue
Niveau 16
28 juin 2009 à 17:04:44

Imaginons que dans ta table, une des entrée a dans son champ message :
"Php ça envoie le paté".

Le mec fait une recherche avec le mot "php" :
SELECT FROM maTable WHERE message LIKE '%php%'

Si il cherche avec les mots clés : "php" et "paté, alors :
SELECT FROM maTable WHERE message LIKE '%php%' OR message LIKE '%paté%'

AU niveau de php, tu devras généré ta requete avec un code dans le genre :

$searchString = 'php paté';

$words = explode(' ', $searchString);

foreach($words as $key => $word) {
$words[$key] = 'message LIKE \'%'.jeSecuriseLaChaine($word).'%\'';
}

$query = 'SELECT FROM message WHERE '.implode(' OR ', $words);

En ce qui concerne ta deuxième question, j'ai le cas en ce moment pour le développement d'une application et il ne faut pas (a mon sens) mettre des tags dans un seul et même champ.

J'ai une table tags qui contient l'idTag et le titer du tag.
J'ai une table content mes fichiers (idFichier + les infos relatives au fichier).
J'ai une table qui lie un tag à un fichier.

Évidement, ça implique une requete un peu plus chiante qu'un SELECT classique.
http://wall.deblan.fr/x547/php/0/

Ion_Negatif
Ion_Negatif
Niveau 10
28 juin 2009 à 17:22:07

Waou je crois que j'ai plus qu'a potassé tout ça mais merci bien :-d

En plus je doit reconnaitre que c'est brillament expliqué :ok: Je vais essayer de faire ça :)

Djiroms
Djiroms
Niveau 2
01 juillet 2009 à 01:36:54

Bonsoir

Mysql permet de faire des recherches à partir de mots clefs, c'est particulièrement pratique, par contre tes tables doivent êtres en MyISAM.

la recherche ne se fait que sur des champs texte (TEXT, VARCHAR, etc...)

pour la structure de ta table :

CREATE TABLE livres (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(70),
body TEXT,
FULLTEXT (title,body)
);

FULLTEXT définie ici les champs où tu fera ta recherche dans notre cas on fera des recherches dans 'title' et 'body'

un petit exemple d'enregistrement :
INSERT INTO livres VALUES
(NULL,'Apprendre Mysql', 'db database mysql phpmyadmin');

et enfin une recherche :
SELECT * FROM livres
WHERE MATCH (title,body) AGAINST ('phpmyadmin');

rien n'empeche de remplacer 'phpmyadmin' par une suite de mots clefs ou une phrase.

pour finaliser un peu faire apparaitre un indice de pertinence:

SELECT id, body, MATCH (title,body) AGAINST
('utilisation de phpmyadmin') AS score
FROM livres WHERE MATCH (title,body) AGAINST
('utilisation de phpmyadmin');

le champ score contiendra un indice de pertinence,un petit order by dessus pour trier en ascendant.

Pseudo supprimé
Pseudo supprimé 02 juillet 2009 à 17:02:54

Avec la méthode de deepblue, on pourrait même se passer de la table id/tag. Les tags étant uniques (logiquement) tu pourrais très bien t'en servir d'id.

deepblue
deepblue
Niveau 16
02 juillet 2009 à 17:52:32

Meja, oui et non. Dans l'idée c'est juste. Simplement, si tu lis une donnée à un tag dans une table et que tu changes le titre du tag ensuite, tu auras 2 opérations à faire :
- changer le titre du tag dans la table tag
- changer pour chaque liaison donnée/tag, le titre du tag

deepblue
deepblue
Niveau 16
02 juillet 2009 à 17:55:09

Djiroms, intéressant, je ne connaissais pas.

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware