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

Langage PHP Discussion :

preg_match : besoin de précision


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Par défaut preg_match : besoin de précision
    Bonjour,

    Je recherche des chaines de caractères dans un champ.
    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
    <?php
    $nbr = 0;
    if (isset($_POST['mot'])) { 
    	$mot = $_POST['mot'];
    	$mot_eclate = explode(" ",$_POST['mot']);
    	$nbr = count($mot_eclate);
    	//recherche dans la table des films
    	if ($nbr == 1){
    		$sql = mysql_query("SELECT * FROM films");
    		$nb = mysql_num_rows($sql);
    		for ($a = 0; $a < $nb; $a++) {
    			$titre = mysql_result($sql,$a,"titre");				
    			$synopsis = mysql_result($sql,$a,"synopsis");
    			if (preg_match("/$mot/i",$synopsis)){
    				echo "<b>$mot trouvé dans $titre</b><br /> $synopsis<br />";
    			}
    			else {echo "$synopsis<br /><br />";
    			}
    		}
    	}
    	else {
    		for ($i = 0; $i < $nbr; $i++){
    			$sql = mysql_query("SELECT * FROM films");
    			$nb = mysql_num_rows($sql);
    			for ($a = 0; $a < $nb; $a++) {
    				$titre = mysql_result($sql,$a,"titre");				
    				$synopsis = mysql_result($sql,$a,"synopsis");
    				if (preg_match("/$mot[$i]/i",$synopsis)){
    					echo "<b>$mot[$i] trouvé dans $titre</b><br /> $synopsis<br />";
    				}
    			}
    		}
    	}
    }
    ?>
    Si $nbr = 1 pas de problème, par contre si $nbr > 1 (donc si j'entre plus de 2 mots à rechercher, preg_match me retrourne tous les textes qui contiennent "c" ou "o"

    Comment je peux résoudre ce problème ?
    Merci d'avance

  2. #2
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Bonjour,

    Même si je n'ai pas tout compris à tes "c" et "o", il y a plusieurs choses à faire pour ce code (j'ai ajouté des commentaires) :

    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
     
    <?php
    $nbr = 0;
    if (isset($_POST['mot'])) { 
    	$mot = $_POST['mot'];
    	$mot_eclate = explode(" ",$_POST['mot']);
    	$nbr = count($mot_eclate);
     
        // jml94 - sortir la requête des boucles inutiles
        $sql = mysql_query("SELECT * FROM films");
        $nb = mysql_num_rows($sql);
     
    	//recherche dans la table des films
    	if ($nbr == 1){
            // jml94 - meilleure façon pour itérer sur le résulatt d'une requete
    		while ($row = mysql_fetch_assoc($sql)) {
                // jml94 - ne pas hésiter à se servir de variables temporaires
    			$titre = $row["titre"];				
    			$synopsis = $row["synopsis"];
    			if (preg_match("/$mot/i", $synopsis))
    				echo "<b>$mot trouvé dans $titre</b><br /> $synopsis<br />";
    			else
                    echo "$synopsis<br /><br />";
    		}
    	}
    	else {
    		for ($i = 0; $i < $nbr; $i++){
    			while ($row = mysql_fetch_assoc($sql)) {
                    $titre = $row["titre"];				
                    $synopsis = $row["synopsis"];
                    // jml94 - ne pas hésiter à se servir de variables temporaires
                    // jml94 - de plus, il vaut mieux utiliser $mot_eclate que $mot qui n'est pas un tableau
                    $search = $mot_eclate[$i];
    				if (preg_match("/$search/i",$synopsis)){
    					echo "<b>$mot[$i] trouvé dans $titre</b><br /> $synopsis<br />";
    				}
    			}
    		}
    	}
    }
    D'autres optimisations sont bien sûr à faire, mais dans un premier temps, le challenge sera de faire fonctionner le script.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Par défaut
    Merci, j'ai modifié le code et cela va déjà mieux, je n'ai plus ni les "c" ni les "o" que d'ailleurs je n'avais pas expliqués

    Je ne comprends pas pourquoi je n'ai que le texte qui contient le premier mot recherché qui s'affiche.

    Si j'entre Paris Touquet, je n'ai que le sysnopsis qui contient Paris qui s'affiche.

  4. #4
    Membre Expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Par défaut

    ça ne viendrait pas du fait que tu utilises mysql_fetch_assoc et que ton pointeur de données sur ton résultat est au bout du tableau de résultat ?

    Essaie en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_data_seek($sql, 0);
    après le while..

  5. #5
    Membre éprouvé
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 898
    Par défaut
    Merci.
    J'ai essayé mysql_data_seek($sql, 0); mais ça a planté !!
    donc ce que j'ai fait
    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
    <?php
    $nbr = 0;
    if (isset($_POST['mot'])) { 
    	$mot = $_POST['mot'];
    	$mot_eclate = explode(" ",$_POST['mot']);
    	$nbr = count($mot_eclate);
    	//recherche dans la table des films
    	$sql = mysql_query("SELECT * FROM films");
    	$nb = mysql_num_rows($sql);
    	if ($nbr == 1){
    		while ($row = mysql_fetch_assoc($sql)){
    			$titre = $row["titre"];
    			$synopsis = $row["synopsis"];
    			if (preg_match("/$mot/i",$synopsis)){
    				echo "<b>$mot trouvé dans $titre</b><br />";
    			}
    			else {echo "$synopsis<br /><br />";
    			}
    		}
    	}
    	else {
    		for ($i = 0; $i < $nbr; $i++){
    			$search = $mot_eclate[$i];
    			for ($a = 0; $a <$nb; $a++){
    				$titre = mysql_result($sql,$a,"titre");
    				$synopsis = mysql_result($sql,$a,"synopsis");
    				if (preg_match("/$search/i",$synopsis)){
    					echo "<b>$mot_eclate[$i] trouvé dans $titre</b><br /> $synopsis<br />";
    				}
    			}
    		}
    	}
    }
    Je l'ai testé plusieurs fois avec plusieurs mots et ça à l'air de marcher

    Merci encore

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

Discussions similaires

  1. [SOAP] besoin de précision
    Par Louis-Guillaume Morand dans le forum Services Web
    Réponses: 1
    Dernier message: 05/03/2007, 21h10
  2. [POO Basique] Besoin de précision sur une notion de base
    Par alois.cochard dans le forum Langage
    Réponses: 8
    Dernier message: 15/09/2006, 09h01
  3. tableau mutlidim, besoin de précision
    Par tuxout dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 25/08/2006, 11h36
  4. [VB.NET]Besoin de précision pour architecture 3-tiers
    Par Dnx dans le forum Windows Forms
    Réponses: 8
    Dernier message: 14/09/2005, 09h09
  5. Besoin de précision sur TThread
    Par psau dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/02/2005, 23h35

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