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 :

Intégrer des mots clés à un article [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut Intégrer des mots clés à un article
    Bonjour,

    J'ai besoin de vos lumières afin de m'aider à construire un système permettant d'accrocher des mots clés à un article.

    Il faut par-contre prendre en compte la modélisation suivante :

    • Un article peut avoir o ou n mots clés
    • Un mot clé peut être inféodé à un ou plusieurs articles


    Nous avons donc une table "article_avoir_mot_cle" qui pioche dans les mots clés disponibles.

    A ce jour, j'ai 1200 mots clés et j'aimerais être capable de créer une interface permettant à l'utilisateur de piocher dans ces mots clés (afin d'éviter le doublonnage) mais aussi lui laisser l'accès à la création de nouveaux mots clés (tout en vérifiant que ces derniers ne sont pas déjà présents) .

    Comment imagineriez-vous cette interface pour qu'elle soit la plus intuitive possible ?

    N.B : Au départ, je gérai les mots clés par article (avec une virgule entre les mots clés) mais je me suis fait tirer dessus à boulet rouge du fait de cette mauvaise modélisation.


    Par avance merci pour votre aide.


  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Niveau base de données, tu as typiquement une relation * - *, c'est à dire plusieurs à plusieurs.
    Un mot-clé peut appartenir à plusieurs articles, et un article peut avoir plusieurs mots-clés.

    Dans ce cas, on a généralement besoin de 3 tables en base de données.
    • Une table article
    • Une table mot-clés (qui semble être ta table "article_avoir_mot_cle").
    • Une table de liaison article-mot clé. Celle-ci a deux colonnes (au minimum), une colonne "identifiant_article" et une colonne "identifiant mot-clé".


    Un mot-clé appartient à un article si (et seulement si), une ligne est présente dans ta table liaison, avec les identifiants du mot-clé et de l'article.

    Exemple:
    Tu as 2 article : A1, A2 (dans ta table article)
    Tu as 3 mots-clés : M1, M2, M3 (dans ta table des mot-clé).

    Si l'article A1 contient M2 et M3, et l'article A2 contient M2, ta table de liaison aura la forme suivante :

    --------------------------------------
    identifiant article | identifiant_mot_clé
    --------------------------------------
    A1 | M2
    A1 | M3
    A2 | M2
    --------------------------------------

    Maintenant au niveau de l'interface, il y a beaucoup de possibilités.
    Difficile de te donner des pistes comme ça, avec si peu de contraintes.
    Voilà tout de même une possibilité, simple (mais pas forcément super) :
    Une page avec la liste des articles : leur titre, et éventuellement les mots-clés existant pour cet article.
    A coté de chaque mot-clé, un bouton/lien pour "saisir les mots-clés".
    Lorsque l'on clique dessus, on arrive sur une nouvelle page.
    La liste des mots-clés de l'article apparait, et il y a un input texte "mot clé à ajouter".
    L'utilisateur saisit un mot-clé, et celui-ci s'ajoute à la liste lorsqu'il clique sur entrée, ou sur un bouton de validation. Eventuellement, si le mot-clé n'existe pas déjà, il peut être ajouté automatiquement dans ta table mot-clé, ou bien après confirmation de l'utilisateur.
    RQ : vu le nombre de mots-clés que tu as, utiliser un autocomplete sur l'input texte des mots-clés pourrait être une bonne chose.

    Si tu as des questions...


    Cela dit, étant donné la grande quantité de mots-clés que tu as, je pense qu'un auto

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Bonjour et merci pour cette réponse,

    Effectivement, la modélisation est la suivante :



    Seulement, j'aimerais pouvoir affecter les mots clés lors de la création de l'article et en ajouter en cas de modification de l'article.

    Une bonne option serait d'avoir un champ de recherche des mots clés par auto-complétion et ajout de celui sélectionné par un bouton ou la touche entrée. Si le mot clé n'est pas trouvé, le même bouton ajouterai le mot clé dans la liste de sélection mais celui-ci serait ajouté en base.

    Bref, cela paraît difficile en php, si quelqu'un veut m'aider ce serait sympa. Si quelqu'un à déjà développer un système similaire et qu'il souhaite partager, merci de se manifester !

    ----------

    Sinon, plus simple, on pourrait juste laisser un textarea et demander à l'utilisateur de mettre ses mots clés avec une virgule entre chaque mot clé.

    Ensuite, on testerait l'existence des mots clés et on insérerait les nouveaux mots clés puis lierait les nouveaux et ceux déjà présents en base.

  4. #4
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Effectivement, la modélisation est la suivante :
    [...]
    Seulement, j'aimerais pouvoir affecter les mots clés lors de la création de l'article et en ajouter en cas de modification de l'article.
    Dois-je en déduire que tu penses que cette modélisation ne te permet pas d'ajouter des mots-clés lors de la création?

    C'est une bonne structure de données, et elle doit te permettre de faire tout ce que tu veux. Si tu veux ajouter des mots-clés lors de la création d'un article, tu peux le faire en plusieurs requêtes SQL exécutées l'une à la suite de l'autre.
    Un champ contenant les mots-clés dans la table article, séparés par des virgules, est effectivement une mauvaise modélisation.

    Ton problème ne me semble pas être lié à la modélisation, mais davantage à l'interface.
    C'est à toi de voir ce que tu veux, je ne pense pas que quelqu'un ici te dira : "il faut faire ça", en te donnant un code source existant (en général, ce n'est pas en "pompant" que l'on apprend).
    Je pense que c'est à toi de décider comment tu veux faire. Ce que tu as dit dans ton précédent post est tout à fait réalisable. Commence à coder, et si tu as des problèmes, n'hésite pas à revenir avec un exemple de code source.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Oui la modélisation est figée

    C'est plus le système utilisateur qui me pose des soucis. Je vais essayer de produire quelque et revient vers vous si j'ai des soucis.


  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Bonjour,

    Je me suis inspiré du code suivant et j'ai produit mon code pour intégrer des nouveaux mots clés ou les lier s'ils existent déjà.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    include('connect_pdo_new.php');
     
    if(!empty($_POST['submit']))
    {	
    	$mot_cle = $_POST['mot_cle'];
    	$id_article = $_POST['id_article'];
     
    	echo'<form action="mot_cle.php" method="post" name="formulaire">'; 
    	echo'<label for="mot_cle">Mots Clés : </label><br /><br /><center><textarea name="mot_cle" cols="70" rows="10">'.$mot_cle.'</textarea><br />';
    	echo'<input type="hidden" name="id_article" value="'.$id_article.'" />';
    	echo'<input type="submit" value="Envoyer" name="submit" />';
     
    	//on va chercher les mots clés déjà présents
    	include('connect_pdo_new.php');
    	$sql_mot_cle = $bdd->prepare('SELECT mot_cle_intitule FROM pevtt_mot_cle');
    	$sql_mot_cle->execute();
    	while($tab_mot_cle = $sql_mot_cle->fetch())
    	{
    		$cache_tags[$tab_mot_cle['mot_cle_intitule']] = $tab_mot_cle;
    	}
     
    	# Intégration des mots clés
    	$post_tags = array_map('trim', explode(',', $_POST['mot_cle']));
    	$post_tags = array_map('strtolower', $post_tags); // Minuscules
     
    	foreach($post_tags as $mot_cle)
    	{
    		if(empty($mot_cle)) // Si le mot_cle est vide on passe au suivant
    			continue;
     
    		# Recherche mot_cle
    		foreach($cache_tags AS $cache_key => $cache_tag)
    		{
    			if($cache_tag['mot_cle_intitule'] == $mot_cle) # Le mot_cle existe
    			{
    				$id_mot_cle = $cache_key;
    				continue;
    			}
    		}
     
    		/* Le mot_cle existe pas */
    		if(!isset($id_mot_cle))
    		{
    			echo'INSERT INTO pevtt_mot_cle(mot_cle_intitule) VALUES(\''.$mot_cle.'\')';
    			echo '<br />';
    			$id_mot_cle = mysql_insert_id();
    		}
     
    		echo'INSERT INTO pevtt_article_avoir_mot_cle(id_article, id_mot_cle) VALUES(\''.$id_article.'\', \''.$id_mot_cle.'\')';
    		echo'<br />';
    	}
    }
    else
    {
    	//prochain id autoincrement
    	$sql_prochain_id_article = $bdd->prepare('SHOW TABLE STATUS LIKE "pevtt_article"');
    	$sql_prochain_id_article->execute();
    	$tab_prochain_id_article = $sql_prochain_id_article->fetch();
    	$id_prochain_article = $tab_prochain_id_article['Auto_increment'];
     
    	echo'<form action="mot_cle.php" method="post" name="formulaire">'; 
    	echo'<label for="mot_cle">Mots Clés : </label><br /><br /><center><textarea name="mot_cle" cols="70" rows="10"></textarea><br />';
    	echo'<input type="hidden" name="id_article" value="'.$id_prochain_article.'" />';
    	echo'<input type="submit" value="Envoyer" name="submit" />';
     
    	echo'</form>';
    }
    Cependant, cela ne repère pas les nouveaux mots clés et l'id_mot_cle n'est pas récupéré pour la liaison mot clé <=> article

    Par avance merci pour votre aide !

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Bonsoir,

    Personne pour me filer un coup de main ?

    Déjà, je pense qu'il faut requêter l'identifiant du mot clé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	$sql_mot_cle = $bdd->prepare('SELECT id_mot_cle, mot_cle_intitule FROM pevtt_mot_cle');
    	$sql_mot_cle->execute();
    	while($tab_mot_cle = $sql_mot_cle->fetch())
    	{
    		$cache_tags[$tab_mot_cle['mot_cle_intitule']] = $tab_mot_cle;
    	}
    Mais après, je ne comprend pas pourquoi il n'y a pas les bonnes requêtes qui se déclenchent !

    Merci par avance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/10/2006, 16h48
  2. Réponses: 2
    Dernier message: 10/10/2006, 12h38
  3. Comment stocker des mots clés dans une bas Mysql
    Par renofx1 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 05/01/2006, 00h57
  4. Liste des mots clés c++
    Par CyberCouf dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2005, 00h13
  5. Réponses: 13
    Dernier message: 16/11/2005, 13h15

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