begin process at 2008 05 16 05:34:37
1 173 216 membres
58 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MOTEUR DE RECHERCHE DANS BDD


Information sur la source

Catégorie :Base de données Niveau : Débutant Date de création : 15/08/2004 Date de mise à jour : 16/08/2004 15:13:21 Vu : 9 108

Note :
9,75 / 10 - par 8 personnes
9,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (76)
Ajouter un commentaire et/ou une note

Description

C'est un petit code qui permet de créer une requête pour une recherche dans une table données.

On à trois options de recherche:
- Rechercher tous les mots (AND)
- Rechercher un des mots (OR)
- Phrase complète ("")

Il suffit de passer ensuite à la fonction la table, les champs de recherche, les infos à récupérer et le critère de classement...

Source

  • ********
  • formulaire
  • ********
  • <form action="search.php" method="post">
  • <input type="text" name="search" size="100" style="font-size: 12px;"><br><br>
  • <input type="radio" name="option" value="all" style="border: none; font-size: 12px;" checked>Rechercher tous les mots<br>
  • <input type="radio" name="option" value="one" style="border: none; font-size: 12px;">Rechercher un de ces mots<br>
  • <input type="radio" name="option" value="sentence" style="border: none; font-size: 12px;">Rechercher l'expression exacte
  • <br><br>
  • <input type="submit" value="Rechercher" style="font-size: 12px; position: relative; left: 20px;">
  • </form>
  • *************************
  • fonction de création de requête
  • *************************
  • function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '')
  • {
  • // option de recherche
  • $option = $_POST['option'];
  • // texte de recherche
  • $search = $_POST['search'];
  • // si c'est le premier appel de la fonction
  • if(!isset($fonction_requete))
  • {
  • static $fonction_requete = 1;
  • // si "Rechercher tous les mots" ou "Rechercher un de ces mots"
  • if($option == 'all' || $option == 'one')
  • {
  • // liste des mots
  • $mots = explode(' ', $search);
  • // sépararateur
  • if($option == 'all')
  • $sep = ' AND ';
  • else
  • $sep = ' OR ';
  • } // if($option == 'all' || $option == 'one')
  • // "Rechercher l'expression exacte"
  • else
  • {
  • $mots = $search;
  • $sep = '';
  • }
  • } // if(!isset($fonction_requete))
  • if(!is_array($champs))
  • $champs = array($champs);
  • if($option == 'all' || $option == 'one')
  • {
  • // pour savoir si on en est à la première itération ou non
  • $i = 0;
  • // pour tous les mots
  • foreach($mots as $mot)
  • {
  • if(!$i)
  • {
  • $search = '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
  • $i = 1;
  • }
  • else
  • $search .= $sep . '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
  • } // foreach($mots as $mot)
  • } // if($option == 'all' || $option == 'one')
  • else if($option == 'sentence')
  • $search = '~#^!|!^#~ LIKE \'%' . $mots . '%\'';
  • $i = 0;
  • // début de requête
  • if(empty($count))
  • $req_search = 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ';
  • else
  • $req_search = 'SELECT count(' . $count . ') FROM ' . $table . ' WHERE ';
  • // ajout des champs
  • foreach($champs as $champ)
  • {
  • if(!$i)
  • {
  • $req_search .= '( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
  • $i = 1;
  • }
  • else
  • $req_search .= 'OR ( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
  • }
  • if(empty($count))
  • $req_search .= "ORDER BY $order $sens LIMIT $limit_start, $limit_nb";
  • return $req_search;
  • }
  • **********
  • Paramètres:
  • **********
  • $table: table dans laquelle effectuer la requête
  • $champs: champs dans lesquels la recherche est effectuées (si plusieurs champs, $champs est un tableau)
  • $select: champs à récupérer
  • $order: champ de classement
  • $sens: ASC ou DESC
  • $limit_start: départ
  • $limit_nb: nombre d'enregistrements sélectionnés
  • $count: paramètre optionnel: Si est vide ou non-passé, la requête est crée normalement. Sinon, il désigne le champ pour créer la requête count()
  • En simplifé, la requête est générée comme ceci:
  • SELECT $champs FROM $table WHERE ... ORDER BY $order $sens LIMIT $limit_start, $limit_nb
  • *******
  • Exemple
  • *******
  • $requete = requete('table', array('champ1', 'champ2', 'champ3'), 'id, champ4', 'id', 'DESC', 10, 25);
  • $result = mysql_query($requete);
********
formulaire
********
<form action="search.php" method="post">
<input type="text" name="search" size="100" style="font-size: 12px;"><br><br>
<input type="radio" name="option" value="all" style="border: none; font-size: 12px;" checked>Rechercher tous les mots<br>
<input type="radio" name="option" value="one" style="border: none; font-size: 12px;">Rechercher un de ces mots<br>
<input type="radio" name="option" value="sentence" style="border: none; font-size: 12px;">Rechercher l'expression exacte
		
<br><br>
<input type="submit" value="Rechercher" style="font-size: 12px; position: relative; left: 20px;">
</form>

*************************
fonction de création de requête
*************************
function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '')
{
	// option de recherche
	$option = $_POST['option'];
	// texte de recherche
	$search = $_POST['search'];
		
	// si c'est le premier appel de la fonction
	if(!isset($fonction_requete))
	{
		static $fonction_requete = 1;
		
		// si "Rechercher tous les mots" ou "Rechercher un de ces mots"
		if($option == 'all' || $option == 'one')
		{
			// liste des mots
			$mots = explode(' ', $search);
			
			// sépararateur
			if($option == 'all')
				$sep = ' AND ';
			else
				$sep = ' OR ';
		} // if($option == 'all' || $option == 'one')
		// "Rechercher l'expression exacte"
		else
		{
			$mots = $search;
			$sep = '';
		}
	} // if(!isset($fonction_requete))
	
	if(!is_array($champs))
		$champs = array($champs);
	
	if($option == 'all' || $option == 'one')
	{
		// pour savoir si on en est à la première itération ou non
		$i = 0;
		
		// pour tous les mots
		foreach($mots as $mot)
		{
			if(!$i)
			{
				$search = '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
				$i = 1;
			}
			else
				$search .= $sep . '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
		} // foreach($mots as $mot)
	} // if($option == 'all' || $option == 'one')
	else if($option == 'sentence')
		$search = '~#^!|!^#~ LIKE \'%' . $mots . '%\'';
		
	$i = 0;
	
	// début de requête
	if(empty($count))
		$req_search = 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ';
	else
		$req_search = 'SELECT count(' . $count . ') FROM ' . $table . ' WHERE ';
	
	// ajout des champs
	foreach($champs as $champ)
	{
		if(!$i)
		{
			$req_search .= '( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
			$i = 1;
		}
		else
			$req_search .= 'OR ( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
	}
	
	if(empty($count))
		$req_search .= "ORDER BY $order $sens LIMIT $limit_start, $limit_nb";
	
	return $req_search;
}

**********
Paramètres:
**********
$table: table dans laquelle effectuer la requête
$champs: champs dans lesquels la recherche est effectuées (si plusieurs champs, $champs est un tableau)
$select: champs à récupérer
$order: champ de classement
$sens: ASC ou DESC
$limit_start: départ
$limit_nb: nombre d'enregistrements sélectionnés 
$count: paramètre optionnel: Si est vide ou non-passé, la requête est crée normalement. Sinon, il désigne le champ pour créer la requête count() 

En simplifé, la requête est générée comme ceci:
SELECT $champs FROM $table WHERE ... ORDER BY $order $sens LIMIT $limit_start, $limit_nb  

*******
Exemple
*******

$requete = requete('table', array('champ1', 'champ2', 'champ3'), 'id, champ4', 'id', 'DESC', 10, 25);
$result = mysql_query($requete); 

Conclusion

Ben voila, j'attends vos commentaires
16 août 2004 14:45:19 :
16.08.2004: Petite mise à jour pour tenir compte de LIMIT
16 août 2004 15:13:22 :
16.08.2004: Possibilité de créer une requête count()
  • signaler à un administrateur
    Commentaire de webdesignasp le 21/10/2004 14:38:08

    Je pense qu'il y a une erreur à la ligne 70 :

            $search = '~#^!|!^#~ LIKE \'%' . $mot . '%\'';

    devrait plutôt s'écrire sans '% %' pour l'option "l'expression exacte" :

            $search = '~#^!|!^#~ LIKE \'' . $mots . '\'';

  • signaler à un administrateur
    Commentaire de coockiesch le 21/10/2004 16:52:01

    Salut!
    Non, car l'expression excate peut être encadrée par un texte autre...

    Si on cherche "cette phrase" dans un champ qui contient "je me demande si ctte phrase est juste", la requête doit retourner ce résultat....

    @++

    R@f

  • signaler à un administrateur
    Commentaire de nognog le 23/02/2005 15:23:44

    salut

    je suis debutant et j'ai un souci avec ton script

    j'ai reussi a le faire fonctionner et faire mes affichage , mais par exemple qd je cherche l'expression exacte sur 'extra' je me retrouve avec des resultats incluant 'extrait' .

    ce qui est juste vu que texte LIKE '%extra%' : 'extrait contient bien extra' mais cependant ce n'est pas l'expression exacte d'ou une recherche legerement faussée .

    ya til une solution simple a ce probleme ? sinon je peux vivre avec :)

  • signaler à un administrateur
    Commentaire de coockiesch le 23/02/2005 16:06:49

    Salut!
    Je sais pas, je pense pas...

    Pcq si tu enlève les %, tu auras d'autres pbs...

    @++

    R@f

  • signaler à un administrateur
    Commentaire de nognog le 24/02/2005 10:44:07

    salut cookiesch !

    j'ai trouvé un ptit truc tout bete pour affiner la recherche sur l'expression exacte.

    dans la fonction tu encodes un espace, ce qui a pour effet de couper le mot (donc extrait ne peu contenir extra+1space )  et ainsi avoir une expression qui est exacte dans la recherche

    [code]

    else if($option == 'sentence')
            $search = '~#^!|!^#~ LIKE \'%' . $mots . '%\'';


    a remplacer par :

    $search = '~#^!|!^#~ LIKE \'%' . $mots ." ". '%\'';
    [/code]

    sinon j'ai une ptite remarque il serait sympa de faire une petite fonction qui retire tous les articles pour les recherches autre que exacte sinon ca renvoit trop de references

    merci bcp pour ton script il est super :)
    ++

  • signaler à un administrateur
    Commentaire de coockiesch le 24/02/2005 11:45:08

    Salut!
    Merci pour l'idée...

    Donc, je retirerai quels mots dans les recherches en AND et OR:
    le, la, les, un, une, des, l'

    Autres idées?

    @++

    R@f

  • signaler à un administrateur
    Commentaire de nognog le 25/02/2005 10:41:09

    salut

    j'ai fait qques modifs pour affiner encore les recherches

    [code]
    if($option == 'all' || $option == 'one')
            {
              
              //creer un tableau d'articles/verbe a comparer et a supprimer de $search
    $strip = array('le','la','les','de','des','est','a','à','un','une');

                if($option == 'all'){
                    $sep = ' and ';

    // liste des mots
    $mots = explode(' ', $search);
    // retire les articles
    $stripmots = array_diff($mots,$strip); //print_r ($stripmots);
    //retire les array vide
    $stripmots2 = array_filter($stripmots); //print_r ($stripmots2);

    // message erreur si le tableau est vide
    if (empty($stripmots2)){echo "les articles ayant été retirés (ex: le, la, un), votre requete n'a pas de mots clefs";include('footer.php');exit;}

    }
    else{
                    $sep = ' or ';
    $mots = explode(' ', $search);
    $stripmots = array_diff($mots,$strip);
    //print_r ($stripmots);
    $stripmots2 = array_filter($stripmots);
    //print_r ($stripmots2);

    if (empty($stripmots2)){echo "les articles ayant été retirés (ex: le, la, un), votre requete n'a pas de mots clefs";include('footer.php');exit;}


    }
            } // if($option == 'all' || $option == 'one')
            // "Rechercher l'expression exacte"
            else
            {
    // on retire les espaces
    $search = trim($search);
                $mots = $search;
                $sep = '';
            }
    [/code]

    petit bout de code qui evite d'avoir un array[x]=vide lorsque l'on rentre plusieurs espaces dans la string $search pour option 'all'  'one'  , et retire les articles lors de la recherche

    voila j'esperes que j'ai pas fait ou dit de betises

    $nognog == 'debutant';

    ++

  • signaler à un administrateur
    Commentaire de nognog le 25/02/2005 10:45:12

    j'ai oublié un truc ;)

    si vous appliquez ces modifs ne pas oublier de passer $stripmots2 a foreach

    [code]
    foreach($mots as $mot)

    par
    foreach($stripmots2 as $mot)
    [/code]

    ++

  • signaler à un administrateur
    Commentaire de the_leech le 02/06/2005 09:22:07

    Bonjours,
    Je suis très nul au niveau base de donner, j'aimerait savoir comment en créer une est après mettre les liens qui pouront  êtres rechercher pas le moteur de rechercher ( votre code ).

    Merci de méclèrsir !

  • signaler à un administrateur
    Commentaire de coockiesch le 02/06/2005 15:26:27

    Hello!
    Il faudrait que tu regarder des tutos sur les bases de données, ca prend un peu de temps à assimilier et à apprendre comment bosser avec...

    Par exemple: http://cyberzoide.developpez.com/php4/mysql/

    @++

    R@f

  • signaler à un administrateur
    Commentaire de frippons le 14/06/2005 10:38:47

    bonjour

    je ne comprend pas cette ligne
    $search = '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
    Peut on me l'expliquer, et quand doit on se connecter à la BDD

  • signaler à un administrateur
    Commentaire de coockiesch le 14/06/2005 21:37:22

    Salut!
    Cette fonction te retourne une requête mais ne l'exécute pas. A toi de te connecter avant l'exécution de celle ci...

    En fait, on insère ~#^!|!^#~à la place des mots à chercher et on y remplace par les bons mots après... Ca fait gagner du temps, :)

    @++

    R@f

  • signaler à un administrateur
    Commentaire de frenchconexion le 14/09/2005 03:51:32

    Bonjour a tous voila j'ai un petit soucis avec le script il me fait des erreurs esce normale ou me suis-je tromper?
    exemple:j me co dessus je voit le cadre avec recher etc..
    mais en dessous ca me fait ca : 13. 14. ************************* 15. fonction de création de requête 16. ************************* 17. function requete($table, $champs, a partir de la il liste tous
    voila merci pour tout

  • signaler à un administrateur
    Commentaire de coockiesch le 14/09/2005 12:47:48

    Salut!
    Tu peux nous expliquer comment tu as mis en place le script? Ce que contiennent les différents fichiers?

    @++

    R@f

  • signaler à un administrateur
    Commentaire de frenchconexion le 14/09/2005 16:37:55

    bonjour merci d'avoir repondu!!
    donc voila j'explique ma situation donc je vais partit d'un staff de jeu online je cherchait a faire pour les joueur un site en php et integrer une recherche dur la database du jeux
    exemple:le joueur tape toto et hop il vois que tot c le nom d'1 item qu'il est vendu a tel endroit et le prix etc....
    ensuite pour le script (je sais que l'erreur viens de moi)
    j'utilise Easy php pour le faire en local pour tester pour pouvoir le metre on line plus tard,donc je me suis scripter un site basic en php bouton etc donc g mis mon bouton item ensuite g crée un item.php et incorporer le script dedans
    g aussi fait un dbconnect voila
    desoler si j'ecrit trop et merci d'avance

  • signaler à un administrateur
    Commentaire de coockiesch le 14/09/2005 16:45:48

    Salut!
    Contacte moi par MP:
    On se croise sur MSN ou par mail afin que tu m'explique...

    @++

    R@f

  • signaler à un administrateur
    Commentaire de bj33 le 26/11/2005 18:19:20

    salut

    très intéréssant, mais à part le formulaire, je suis perdu.

    en effet, je n'obtient qu'une page blanche et dans la source le code html que j'ai rentré, rien d'autre.

    c'est surement dû au fait que je ne comprends pas les champs(leurs noms).

    [code]
    SELECT $champs FROM $table WHERE ... ORDER BY $order $sens LIMIT $limit_start, $limit_nb
    [/code]

    la variable champs et table, c'est ok.mais order, çà correspond à quoi? et pourquoi le where est suivi de ..., le limit_start, je ne vois pas non plus.

    comment j'éffectue ma requête?

    et les arguments de la fonction, je les passe comme çà?

    [code]
    .. = 'dico,definition,"definition,note,signature",asc,20,'
    [/code]
    dico : table
    définition : champs de recherche
    "definition,notes,signature" : le select
    asc : order by
    20 : limit
    j'ai supprimer les variables order et $limit_start

    si quelqu'un peux m'éclairer.

  • signaler à un administrateur
    Commentaire de coockiesch le 29/11/2005 20:36:56

    Salut!
    SELECT $champs FROM $table WHERE ... ORDER BY $order $sens LIMIT $limit_start, $limit_nb
    >> Ce n'est que pour indiquer à des personnes connaissant le SQL quelle tête la requête va avoir.

    Il te suffit d'appeler la fonction avec les bons params, par exemple:
    # $requete = requete('table', array('champ1', 'champ2', 'champ3'), 'id, champ4', 'id', 'DESC', 10, 25);
    # $result = mysql_query($requete);

    @++

    R@f

  • signaler à un administrateur
    Commentaire de bj33 le 30/11/2005 14:01:45

    salut et merci pour ta réponse.

    je ne comprend rien du tout à la façon de passer les paramètres.je publie le dernier essai :

    [code]
    <?php
    function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = 'recherche,("titre","keywords"),(titre,liens),titre,asc,1,20')
    {
        // option de recherche
        $option = $_POST['option'];
        // texte de recherche
        $search = $_POST['search'];
            
        // si c'est le premier appel de la fonction
        if(!isset($fonction_requete))
        {
            static $fonction_requete = 1;
            
            // si "Rechercher tous les mots" ou "Rechercher un de ces mots"
            if($option == 'all' || $option == 'one')
            {
                // liste des mots
                $mots = explode(' ', $search);
                
                // sépararateur
                if($option == 'all')
                    $sep = ' AND ';
                else
                    $sep = ' OR ';
            } // if($option == 'all' || $option == 'one')
            // "Rechercher l'expression exacte"
            else
            {
                $mots = $search;
                $sep = '';
            }
        } // if(!isset($fonction_requete))
        
        if(!is_array($champs))
            $champs = array($champs);
        
        if($option == 'all' || $option == 'one')
        {
            // pour savoir si on en est à la première itération ou non
            $i = 0;
            
            // pour tous les mots
            foreach($mots as $mot)
            {
                if(!$i)
                {
                    $search = '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
                    $i = 1;
                }
                else
                    $search .= $sep . '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
            } // foreach($mots as $mot)
        } // if($option == 'all' || $option == 'one')
        else if($option == 'sentence')
            $search = '~#^!|!^#~ LIKE \'%' . $mots . '%\'';
            
        $i = 0;
        
        // début de requête
        if(empty($count))
            $req_search = 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ';
        else
            $req_search = 'SELECT count(' . $count . ') FROM ' . $table . ' WHERE ';
        
        // ajout des champs
        foreach($champs as $champ)
        {
            if(!$i)
            {
                $req_search .= '( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
                $i = 1;
            }
            else
                $req_search .= 'OR ( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
        }
        
        if(empty($count))
            $req_search .= "ORDER BY $order $sens LIMIT $limit_start, $limit_nb";
        
        return $req_search;
    }
    include_once ("fichiers/connect.php");
    $req_search = requete('recherche', array('titre', 'keywords'), 'titre, liens', 'liens', 'ASC', 1, 20);
    $result = mysql_query($requete);
    ?>
    [/code]

    ma table est structurée ainsi :

    id (uniquement pour la maintenance)
    keywords
    titre
    liens

    j'ai tenter de comprendre la structure de la requête...c'est plus fort que moi!je débute en php/mysql.avec un seul mot à rechercher pas de soucis mais plusieurs...ce code est exactement ce que je cherche à utiliser pour la nouvelle version de mon site, j'en ai essayer un bon nombre, c'est celui là qu'il me faut, même si je n'arrive pas à le faire fonctionner.un exemple parlant serait le bienvenue.

  • signaler à un administrateur
    Commentaire de joebuz le 31/01/2006 18:43:11

    'lut j'y arrive pas ca ne m'affiche aucun resultat
    j'ai mis le formulaire ds un fichier index.html
    et créé un fichier search.php ou dedans j'ai mis :

    $bdd_host = 'host';
    $bdd_login = 'login';
    $bdd_pass = '*****';
    $bdd_base = 'base';
    $bdd_conect = mysql_connect("$bdd_host", "$bdd_login", "$bdd_pass") or die('erreur connection sql');
    mysql_select_db("$bdd_base") or die('oops pas de base de donnée');


    $table = 'NV_sites';
    $champs = array('nom', 'mini_desc', 'description');
    $select = 'mini_desc';
    $order= 'description';
    $sens = 'ASC';
    $limit_start = '1';
    $limit_nb = '25';

    [Ton code]

    et ca ne m'affiche qu'une page blanche pourtant je recherche des mots qui sont dans ma table !

  • signaler à un administrateur
    Commentaire de coockiesch le 31/01/2006 20:09:20

    Salut!
    Tu pourrais afficher la requête crée par ma fonction? Et si tu colle ce code dans phpmyadmin, ca renvoie qqch?

    @++

    R@f

  • signaler à un administrateur
    Commentaire de bj33 le 31/01/2006 20:31:19

    bonjour

    merci monsieur le programmeur Professionel pour cette réponse rapide.les débutants que nous sommes vous salut bien bas pour votre mépris...

  • signaler à un administrateur
    Commentaire de coockiesch le 31/01/2006 21:13:35

    Salut, BJ33!
    Je suis désolé mais je n'avais pas vu ton deuxième commentaire... En règle générale, j'essaie de répondre le plus vite possible, ce que j'ai fait avec la question de JOEBUZ... Petit couac dans le cadre de ta question, nullement question de mépris...

    @++

    R@f

  • signaler à un administrateur
    Commentaire de coockiesch le 01/02/2006 12:35:33

    Pas de réponse? Bon, pas la peine d'écrire de commentaires aussi méprisants, alors...

    @++

    R@f

  • signaler à un administrateur
    Commentaire de bj33 le 01/02/2006 13:34:50

    < cookiesch

    tu attendais une réponse, ok, désolé, je ne pensais pas que c'était le cas.c'est vrai, c'est un msg agréssif, çà m'à énervé de lire la réponse que tu à écrit pour joebuz, le jour même alors que le mien à deux mois tout juste.je retire.tu acceptes mes excuses?

    en fait, en tant que débutants, ont se retrouvent souvent confrontés à, peut être pas du mépris, mais au moins de l'indifférence, quand l'on pose des questions qui appellent des réponses qui paraissent évidentes aux initiés.c'est particulièrement vrai sur les sites cs et prog en général.et çà, c'est diablement frustrant.d'où, parfois, des écarts de conduite élémentaire.je m'en excuse encore.

    à l'époque, j'ai lù ce code et il m'à emballé, je l'ai donc testé.je ne comprenais même pas ce que je devais faire pour paramétrer la fonction, CF: le commentaire au dessus de celui de joebuzz.

    aujourd'hui, j'ai coder un moteur simple, à la mesure de mes compétences php(je viens d'en finir avec les variables, les opérateurs et les boucles, j'attaque justement les fonctions), il ne recherche qu'un mot clé et marche bien.mais si tu veux m'expliquer comment le paramétrer, je prend.

    ma question : est ce que je dois entrer les paramétres comme ceçi ou est ce que çà doit rester vide?

    function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = 'recherche,("titre","keywords"),(titre,liens),titre,asc,1,20')
    {

    sinon, est ce correct?

    pour la requête, j'avais tenter çà :

    include_once ("fichiers/connect.php");
    $req_search = requete('recherche', array('titre', 'keywords'), 'titre, liens', 'liens', 'ASC', 1, 20);
    $result = mysql_query($requete);

    et aussi ce que tu suggérais, à savoir :

    Il te suffit d'appeler la fonction avec les bons params, par exemple:
    # $requete = requete('table', array('champ1', 'champ2', 'champ3'), 'id, champ4', 'id', 'DESC', 10, 25);
    # $result = mysql_query($requete);

    je n'obtiens rien d'autre qu'une page blanche.avec dans la source, uniquement les entètes html.

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 19:04:30

    ...et je fais comment pour afficher la requete générée ??

    print $req_search; ??

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 19:04:44

    ...et je fais comment pour afficher la requete générée ??

    print $req_search; ??

  • signaler à un administrateur
    Commentaire de coockiesch le 01/02/2006 19:06:43

    Salut!
    Oui, je comprends! Cela m'est arrivé aussi bien souvent, et m'arrive encore parfois. Oki, alors oublions tout ça et repartons d'un bon pied sur le code, :)

    include_once ("fichiers/connect.php");
    $req_search = requete('recherche', array('titre', 'keywords'), 'titre, liens', 'liens', 'ASC', 1, 20);
    $result = mysql_query($requete);

    - l'appel de la fonction avec ses paramètres est OK, pour moi
    - petite erreur: tu enregistre la requête crée par la fonction dans $req_search mais tu utilises $requete dans mysql_query

    Essaie:
    include_once ("fichiers/connect.php");
    $req_search = requete('recherche', array('titre', 'keywords'), 'titre, liens', 'liens', 'ASC', 1, 20);
    $result = mysql_query($req_search) or die('MySQL Error'); // Affichera MySQL Error et bloquera le script en cas d'erreur mysql

    Ensuite:
    echo $req_search . '<br /><br />'; // affichera la requête
    eccho 'nb: ' . mysql_num_rows($result); // affichera le nombre d'enregistrements retournés

    Pour la suite:
    - on met start à 0 et pas à 1 ( le premier enregistrement est l'enregistrement 0 et pas 1, comme pour les tableaux ).
    - comment fais-tu l'affichage des résultats?

    Voilà!

    @++

    R@f


  • signaler à un administrateur
    Commentaire de coockiesch le 01/02/2006 19:09:12

    Salut!
    Oui!

    Mais on préfère echo à print pcq c plus rapide:
    echo $req_search;

    @++

    R@f

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 19:11:11

    mes variables sont bonnes puisque j'ai fait :

    $sql100 = mysql_query("SELECT * FROM $table WHERE $champs LIKE '%$search%' ORDER BY $order $sens");
    while....

    et ça fonctionne

  • signaler à un administrateur
    Commentaire de coockiesch le 01/02/2006 19:12:55

    Alors, ca doit être la requête générée...
    Ca donne quoi à l'affichage?

    @++

    R@f

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 19:14:27

    j'ai essayé les deux :

    echo "requete : ".$req_search."<br />";
    print "requete : ".$req_search."<br />";

    ca ne m'affiche rien

  • signaler à un administrateur
    Commentaire de coockiesch le 01/02/2006 19:16:27

    Pas normal... Tu peux me montrer la façon dont tu appelle la fonction?

    @++

    R@f

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 19:17:54

    je l'appelle pas !! (je pensais que c'etait dans ton script !, c'est peut-etre pour ça alors lol!!)
    je t'envoi mon script

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 19:19:03

    $table = 'NV_sites';
    $champs = 'mini_desc';
    $select = 'mini_desc';
    $order= 'nom';
    $sens = 'ASC';
    $limit_start= '1';
    $limit_nb = '10';

    function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '')
    {
        // option de recherche
        $option = $_POST['option'];
        // texte de recherche
        $search = $_POST['search'];
            
        // si c'est le premier appel de la fonction
        if(!isset($fonction_requete))
        {
            static $fonction_requete = 1;
            
            // si "Rechercher tous les mots" ou "Rechercher un de ces mots"
            if($option == 'all' || $option == 'one')
            {
                // liste des mots
                $mots = explode(' ', $search);
                
                // sépararateur
                if($option == 'all')
                    $sep = ' AND ';
                else
                    $sep = ' OR ';
            } // if($option == 'all' || $option == 'one')
            // "Rechercher l'expression exacte"
            else
            {
                $mots = $search;
                $sep = '';
            }
        } // if(!isset($fonction_requete))
        
        if(!is_array($champs))
            $champs = array($champs);
        
        if($option == 'all' || $option == 'one')
        {
            // pour savoir si on en est à la première itération ou non
            $i = 0;
            
            // pour tous les mots
            foreach($mots as $mot)
            {
                if(!$i)
                {
                    $search = '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
                    $i = 1;
                }
                else
                    $search .= $sep . '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
            } // foreach($mots as $mot)
        } // if($option == 'all' || $option == 'one')
        else if($option == 'sentence')
            $search = '~#^!|!^#~ LIKE \'%' . $mots . '%\'';
            
        $i = 0;
        
        // début de requête
        if(empty($count))
            $req_search = 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ';
        else
            $req_search = 'SELECT count(' . $count . ') FROM ' . $table . ' WHERE ';
        
        // ajout des champs
        foreach($champs as $champ)
        {
            if(!$i)
            {
                $req_search .= '( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
                $i = 1;
            }
            else
                $req_search .= 'OR ( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
        }
        
        if(empty($count))
            $req_search .= "ORDER BY $order $sens LIMIT $limit_start, $limit_nb";
        
        return $req_search;
    }

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 19:20:26

    voila c'est tout avec <?php et parametres de connexion avant et ?> apres !!

  • signaler à un administrateur
    Commentaire de coockiesch le 01/02/2006 19:23:57

    Salut!
    Alors, comme j'ai dit à BJ33, $start=0;

    Ensuite, ben tu appelles la fonction avec tes params:
    $req_search = function_requete( $table, $champs, $select, $order, $sens, $limit_start, $limit_nb );

    ensuite:
    $result = mysql_query( $req_search ) or die('Erreur MySQL');
    // affichage & co

    Ca joue comme ca?

    @++

    R@f

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 20:38:50

    Fatal error: Call to undefined function: function_requete() in /home/internetk/www/nouveau/essai/search.php on line 124

    ligne 124 :
    $req_search = function_requete( $table, $champs, $select, $order, $sens, $limit_start, $limit_nb );

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 20:48:47

    excusez-moi j'ai remplacé la ligne 124 :
    $requete = requete( $table, $champs, $select, $order, $sens, $limit_start, $limit_nb );
    $result = mysql_query( $requete ) or die('Erreur MySQL');

    ca marche a peu pres, j'ai pas tout ce que je veux

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 20:53:22

    ok c good tout fonctionne correctement, mais dis-moi je ne vois pas l'intêret d'avoir un limit_start a 10 !?
    Enfin faut vraiment en avoir l'utilité, normalement pour un moteur de recherche si l'on veux affiché tout les resultats on met un limit_start = 0

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 21:03:56

    nog nog --> je suis interessé par ton post du 25/02/2005 10:41:09 mais je ne vois pas où rajouter ce bout de script peux-tu me dire la ligne d'avant et la ligne d'apres du script original si c'est une modif, ou alors faut-il le mettre a la fin du script ??

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 21:05:58

    merde alors !?

    coockiesch --> ton message du 01/02/2006 19:06:43 tout a l'heure il s'arretait a "Oki, alors oublions tout ça et repartons d'un bon pied sur le code, :)"

    j'avais pas tout le reste d'affiché !!

  • signaler à un administrateur
    Commentaire de joebuz le 01/02/2006 21:56:12

    pour ceux que ça interesse j'ai mis un affichage coloré des mots utilisés pour la recherche

    En ce qui me concerne c'est une recherche pour des sites (annuaire), on recherche les mots dans les champs nom, mini_desc, description

    ca donne ceci :
    $requete = requete( $table, $champs, $select, $order, $sens, $limit_start, $limit_nb );
    $result = mysql_query( $requete ) or die('Erreur MySQL');


    while($data100 = mysql_fetch_array($result)){
    $nom_site = $data100['nom'];
    $mini_desc_site = $data100['mini_desc'];
    $description_site = $data100['description'];

    if($option == 'all' || $option == 'one') {  
             $mots = explode(' ', $search);
    foreach($mots as $mot) {
    $replace='<font color=#33ccff>'.$mot.'</font>';
    $mini_desc2 = str_replace($mot,$replace,$mini_desc_site);
    $nom2 = str_replace($mot,$replace,$nom_site);
    $description2 = str_replace($mot,$replace,$description_site);
    $nom_site = $nom2;
    $mini_desc_site = $mini_desc2;
    $description_site = $description2;
    }
    }
    else{
    $mots = $search;
    $replace='<font color=#33ccff>'.$mots.'</font>';
    $mini_desc2 = str_replace($mots,$replace,$mini_desc_site);
    $nom2 = str_replace($mots,$replace,$nom_site);
    $description2 = str_replace($mot,$replace,$description_site);
    }

    echo "<b>Nom :</b> ".$nom2."<br />".$mini_desc2."<p /><b>Description :</b><br />".$description2."<p />";
    }

  • signaler à un administrateur
    Commentaire de coockiesch le 02/02/2006 08:12:46

    Le start permet de faire un affichage page par page... :)
    C'est tout bon, pour toi? :)

    @++

    R@f

  • signaler à un administrateur
    Commentaire de bj33 le 02/02/2006 14:22:42

    salut coockiesch

    alors après plusieurs tests, il y à du mieux, mais sql retourne cette erreur:

    MySQL Error'
    SELECT titre,liens FROM recherche WHERE ( titre,keywords LIKE '%accords%' AND titre,keywords LIKE '%gammes%' ) ORDER BY titre ASC LIMIT 1, 1
    Operand should contain 1 column(s)

    l'opérande devrait contenir une colonne.çà ne me parle pas.zendstudio, lui, retourne :

    ligne 2:argument de fonction non utilisés pour les variables de la fonction sauf count et limit_nomb.
    pour limit_nomb, la valeur de la variable n'est pas utilisée et n'apparait qu'une fois(ligne 10).

    la variable fonction_requete est utilisée mais pas définie et le résultat de l'expréssion n'est jamais utilisé(ligne 91).

    j'essai depuis hier plusieurs combinaisons, rien à faire.je sollicite donc, une fois de plus ton expérience.

    voilà les codes

    <?php
    function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '')
    {
    $table ='recherche';
    $champs ='titre,keywords';
    $select ='titre,liens';
    $order ='titre';
    $sens ='ASC';
    $limit_start='1';
    $limit_nomb='10';
    $count ='';

    $option = $_POST['option'];
    $search = $_POST['search'];
            
        // si c'est le premier appel de la fonction
        if(!isset($fonction_requete))
        {
            static $fonction_requete = 1;
            
            // si "Rechercher tous les mots" ou "Rechercher un de ces mots"
            if($option == 'all' || $option == 'one')
            {
                // liste des mots
                $mots = explode(' ', $search);
                
                // sépararateur
                if($option == 'all')
                    $sep = ' AND ';
                else
                    $sep = ' OR ';
            } // if($option == 'all' || $option == 'one')
            // "Rechercher l'expression exacte"
            else
            {
                $mots = $search;
                $sep = '';
            }
        } // if(!isset($fonction_requete))
        
        if(!is_array($champs))
            $champs = array($champs);
        
        if($option == 'all' || $option == 'one')
        {
            // pour savoir si on en est à la première itération ou non
            $i = 0;
            
            // pour tous les mots
            foreach($mots as $mot)
            {
                if(!$i)
                {
                    $search = '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
                    $i = 1;
                }
                else
                    $search .= $sep . '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
            } // foreach($mots as $mot)
        } // if($option == 'all' || $option == 'one')
        else if($option == 'sentence')
            $search = '~#^!|!^#~ LIKE \'%' . $mots . '%\'';
            
        $i = 0;
        
        // début de requête
        if(empty($count))
            $req_search = 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ';
        else
            $req_search = 'SELECT count(' . $count . ') FROM ' . $table . ' WHERE ';
        
        // ajout des champs
        foreach($champs as $champ)
        {
            if(!$i)
            {
                $req_search .= '( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
                $i = 1;
            }
            else
                $req_search .= 'OR ( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
        }
        
        if(empty($count))
            $req_search .= "ORDER BY $order $sens LIMIT $limit_start, $limit_nb";
        
        return $req_search;
    }  
    include_once ("fichiers/connect.php");
    $req_search = requete('titre,liens','recherche', array('titre','keywords'), 'titre,liens', 'liens', 'ASC', 1, 20);
    $result = mysql_query($req_search) or die("MySQL Error'<br />".$req_search.'<br />'.mysql_error());

    echo 'nombre de résultats pour votre requête : ' . mysql_num_rows($result); // affichera le nombre d'enregistrements retournés"
    echo 'pages de résultats : ' . mysql_fetch_array($req_search);
    ?>

  • signaler à un administrateur
    Commentaire de bj33 le 02/02/2006 18:24:36

    < coockiesch

    deux bugs résolus :

    dans le code une variable limit_nomb au début et à la fin, limit_nb.
    ce qui est une erreur.

    cette portion
       // si c'est le premier appel de la fonction
        if(!isset($fonction_requete))
        {
            static $fonction_requete = 1;
    je l'ai transformé en çà
    static $fonction_requete = 1;        
        // si c'est le premier appel de la fonction
        if(!isset($fonction_requete))
        {

    çà plait davantage à zend.la variable utilisé avant d'être déclarée çà ne lui plaisait pas...et à toi? c'est correct dans le contexte?

    le pb de variables non déclarés je l'ai résolu comme çà

    function requete($select ='titre,liens',$table ='recherche',$champs ='titre,keywords',$order ='titre',$sens ='ASC',$limit_start='0',$limit_nomb='10', $count = '')
    {

    par contre, j'ai toujours cette erreur d'expression dont le résultat n'est pas utilisé.

  • signaler à un administrateur
    Commentaire de coockiesch le 03/02/2006 15:46:35

    Salut!
    Le static a bien sa place dans le if: si c'est la première fois que la fonction est appelée, on crée la variable. Static indique simplement que la valeur sera gardée en mémoire enrte plusieurs appels de la fonction, au contraire d'une variable "normale"

    $req_search = requete('titre,liens','recherche', array('titre','keywords'), 'titre,liens', 'liens', 'ASC', 1, 20);
    Normalement, on appelle la fonction comme tu l'a fait. Pas besoin de faire l'affectation.

    Par contre: ne pas modifier la code de la fonction... Tu as déclaré des variables au début, il faut pas. L'intérêt d'une fonction c'est justement d'avoir des paramètres.

    Essaie de reprendre mon code tel qu'il est posté et d'appeler ta fonction comme tu l'a fait:
    $req_search = requete('titre,liens','recherche', array('titre','keywords'), 'titre,liens', 'liens', 'ASC', 1, 20);

    Ca change qqch?

    On va y arriver! :)

    @++

    R@f

  • signaler à un administrateur
    Commentaire de SuperRaplapla le 16/02/2006 10:10:44

    Bon code, juste ce que je cherchai. Bravo et merci !
    N'hésitez pas à rajouter des améliorations ou autre si vous en trouvez.
    A + !

  • signaler à un administrateur
    Commentaire de SuperRaplapla le 16/02/2006 10:31:25

    Autre chose, j'ai rajouté après :

    else if($option == 'sentence') $search = '~#^!|!^#~ LIKE \'%' . $mots ." ". '%\'';

    Ceci, afin de ne pas faire la recherche si aucun mot clés dans la recherche de phrase exacte :

    if (trim($mots)==''){
    echo "Votre recherche ne contient pas de mots clés.";
    exit;
    }

    Qu'en pensez-vous ?

  • signaler à un administrateur
    Commentaire de coockiesch le 16/02/2006 20:00:37

    Oui, pourquoi pas! :)

    @++

    R@f

  • signaler à un administrateur
    Commentaire de SuperRaplapla le 16/02/2006 20:36:27

    quoique non le "trim" a été fait avant et en plus il génère une erreur, il suffit de faire :

    if ($mots==''){
    echo "Votre recherche ne contient pas de mots clés.";
    exit;
    }

    A+