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 :

ne pas afficher certains messages qui ont des mots contenus dans une autre table


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut ne pas afficher certains messages qui ont des mots contenus dans une autre table
    Bonjour, à tous

    Je voudrai exclure les messages à caractères douteux des vrais messages

    donc par défaut j'enregistre tous les messages qui sont stockés dans la colonne message avec auteur et la date de diffusion

    la seconde me permet de filtrer les messages par comparaison

    donc on a 2 tables

    1ère table livre avec les colonnes auteur, date, et message
    2ème table mot avec une colonne indertits

    je bute sur une requête qui doit être simple

    j'ai essayé distinct ou like ou d'autres formules sans grand résultat comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $retour = mysql_query('SELECT DISTINCT COUNT(*) AS nb_messages FROM livre WHERE message NOT EXIST indertits FROM mot');
    Auriez vous une suggestion ? merci Steph

    Le code décomposé qui effectue les requêtes pour l'affichage de tous les messages
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    donc on se connecte sur la bdd
    require ("connection.php");
    $sql = 'SELECT auteur, usremail, date_signature, message FROM livre ORDER BY date_signature DESC';
    $req=mysql_query($sql);
    $nb_signature = mysql_num_rows($req);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    $sql = 'SELECT auteur, date_signature, message FROM livre WHERE NOT EXIST indertits FROM mot';
     
    $donnees = mysql_fetch_array($retour);
    $totalDesMessages = $donnees['nb_messages'];
    // On calcule le nombre de pages à créer
    $nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);
    // Puis on fait une boucle pour écrire les liens vers chacune des pages
    echo '<strong>','Commentaires','</strong>','&nbsp;', 'Livre', '<strong>','&nbsp;', '</strong>', '&nbsp;','* Champs obligatoires','<br />','Page : ';
    for ($i = 1 ; $i <= $nombreDePages ; $i++)
    {
        echo '<a href="./url.php?page=' . $i . '">' . $i . '</a> ';
    }
    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
     
    if (isset($_GET['page']))
    {
            $page = intval($_GET['page']); // On récupère le numéro de la page indiqué dans l'adresse 
    }
    else // La variable n'existe pas, c'est la première fois qu'on charge la page
    {
            $page = 1; // On se met sur la page 1 (par défaut)
    }
    // On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
    $premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
    $reponse = mysql_query('SELECT * FROM livre ORDER BY id DESC LIMIT ' .htmlentities($premierMessageAafficher). ', ' .htmlentities($nombreDeMessagesParPage));
     
    //$reponse = mysql_query('SELECT livre from auteur message ' .htmlentities($premierMessageAafficher). ', ' .htmlentities($nombreDeMessagesParPage));
    while ($donnees = mysql_fetch_array($reponse))
    {
    	echo '<div class="commentlist clear fix" style="margin-top:1.1rem;font-size:1.1rem;line-height: 1.4rem;"><li class="alt"><div class="commentlist" id="d_corps_msg"><div class="commentlist" id="body_txt">','<strong>' . $donnees['auteur'] . '</strong>&nbsp;<em>' . htmlentities($donnees['date_signature']) . '</em> a &eacute;crit :<br />' . $donnees['message'] . '</div></div></li></div>';																
    }
    mysql_free_result ($reponse);
    mysql_close(); // On n'oublie pas de fermer la connexion à MySQL)

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    Donc je mets une solution proposée puis supprimée
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT auteur, date_signature, message FROM livre lv inner join mot m on find_in_set(lv.message,m.indertits) = 0

    merci pour la réponse j'ai essayé sans exclusion des fameux messages

    de mon coté j'ai essayé avec une jointure de style right outer qui affiche tous les messages mais sans exclusion des mauvais
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT auteur, date_signature, message FROM livre lv RIGHT OUTER JOIN mot m on find_in_set(lv.message,m.indertits) = 0

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 496
    Par défaut
    Et avec group_concat et regexp ?

    Le group_concat regroupe tous les mots interdits en les séparant par une virgule :interdit1,interdit2,interdit3, et si on remplace les virgules par l'opérateur ou |, le retour sera interdit1|interdit2|interdit3.

    Il ne reste qu'à appliquer une expression régulière en utilisant ce retour :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select auteur, date_signature, message,(select GROUP_CONCAT(indertits) from mot) as t  FROM livre
    group by id
    having message not regexp replace(t,",","|")

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    merci pour ce retour, mais je préfère opter pour l'exclusion et le non affichage des mauvais messages et afficher seulement les bons messages

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- ce que tu veux faire (vérifier TOUS les messages à CHAQUE affichage) n'est pas ergonomique, ni performant.

    2- pourquoi ne pas supprimer purement et simplement tous les "mauvais" messages ?
    Le principe reste le même, mais il peut être effectuer dès l’enregistrement (ou pas) du message.

    3- Ou, sans les supprimer, ajouter une colonne "blacklist" (0/1), et au moment où le message est enregistré (avant ou après INSERT) :
    • vérifié les mots interdits
    • mettre "blacklist" à 1 si on trouve un mot interdit

    Ainsi, on conserve TOUS les messages,
    mais lors de l'affichage :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    "WHERE blacklist = 0"

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    la troisième solution serait envisageable
    3- Ou, sans les supprimer, ajouter une colonne "blacklist" (0/1), et au moment où le message est enregistré (avant ou après INSERT) :

    vérifié les mots interdits
    mettre "blacklist" à 1 si on trouve un mot interdit


    Ainsi, on conserve TOUS les messages,
    mais lors de l'affichage :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part

    [CODE
    "WHERE blacklist = 0"
    [/CODE]

  7. #7
    Invité
    Invité(e)
    Par défaut
    Alors le principe est simple :

    Pour chaque message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql_mots = "SELECT indertits FROM mot";
    // on récupère tous les mots dans un array
    $mots = .........;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $blacklist = 0; // faux par défaut
    foreach( $mots as $mot )
    {
    	if( strpos($message, $mot) ) // si on trouve le mot dans le message
    	{
    		$blacklist = 1; // vrai
    		break; // on sort de la boucle
    	}
    }
    // INSERT (ou UPDATE) du message
    //...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Par défaut
    merci
    je vois pour l'insertion au vu des précisions
    A+ bonne après-midi

Discussions similaires

  1. Afficher un nom en fonction d'un ID dans une autre table
    Par Glliass dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/10/2016, 12h09
  2. Réponses: 3
    Dernier message: 08/03/2012, 15h51
  3. Réponses: 3
    Dernier message: 18/04/2008, 13h36
  4. Réponses: 8
    Dernier message: 14/12/2007, 16h04
  5. Réponses: 2
    Dernier message: 05/06/2006, 14h24

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