[Moteur de recherche]

8 messages dans ce sujet

Posté(e) · Signaler ce message

Bonjour,

J'avais remarqué que lorsque deux mots clefs sont insérés dans le champ de recherche de haut.php, ces deux mots doivent obligatoirement figurer dans le même champ d'une table pour être appelés.

Se posait alors un gros problème.

Exemple :

vous voulez ajouter 3 produits : voiture rouge, voiture bleue et voiture verte.

Le terme "voiture" figurant dans le champ "nom" et la couleur dans un champ "couleur" que vous auriez créé auparavant.

Une recherche avec le terme voiture vous aurait affiché les 3 réponses possibles alors qu'une recherche comme "voiture rouge" ne vous aurait renvoyé aucun résultat.

J'ai donc travaillé un peu sur ce problème, et je vous donne ici la solution :

Dans recherche.php,

remplacez :

$resultat = mysql_query("SELECT id, reference, nom FROM peel_produits WHERE etat = '1' AND nom LIKE '%" . addslashes($_GET['motclef']) . "%' OR descriptif LIKE '%" . addslashes($_GET['motclef']) . "%' LIMIT $start,$nb");

Par :

$recherche=strtolower($motclef);

$mots = str_replace("+", " ", trim($recherche));

$mots = str_replace("\"", " ", $mots);

$mots = str_replace(",", " ", $mots);

$mots = str_replace(":", " ", $mots);

$recherche=rawurlencode($recherche);

$tab=explode(" " , $mots);

$count=count($tab);

$sql="select id, reference, nom from peel_produits where etat='1' and ( reference like \"%$tab[0]%\" or nom like \"%$tab[0]%\" ) ";

for($i=1 ; $i<$count; $i++)

{

$sql.="AND ( reference like \"%$tab[$i]%\" or nom like \"%$tab[$i]%\" )";

}

$resultat = mysql_query($sql);

et

$$result=mysql_query("SELECT COUNT(*) FROM peel_produits WHERE nom LIKE '%" . addslashes($_GET['motclef']) . "%' ");

$row=mysql_fetch_row($result);

Par

$req = mysql_query($sql);

$row = mysql_numrows($req);

L'astuce se déroule ainsi :

1 - on met en minuscule les termes entrés dans le formulaire

2 - on remplace tous les caractères '+', '\', ',' et ':' par un espace.

3 - on place les différents mots dans un tableau grâce à la fonction "explode".

4 - Pour chaque terme entré, on regarde s'il se situe dans les champs "reference" ou "nom"

5 - on renvoie la requête.

Voilà, en espérant vous avoir été utile ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Bonjour,

Après avoir ajouter ce code, lorsque je fais une recherche ça fonctionne mais j'ai ce message d'erreur en dessous de la page avec les données de la recherche.

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/sites/site83/web/boutique/achat/recherche.php on line 98
La ligne 98 est celle-ci
$row=mysql_fetch_row($result);

Avez-vous une idée ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Exact, je m'étais trompé dans la 2e partie à changer. J'ai modifié mon post initial, mais il faudrait tester pour être sûr (je ne peux pas, car j'ai changé trop de choses pour pouvoir le faire...).

Donc je récapitule ce qu'il faudrait tester :

Remplacer :

$result=mysql_query("SELECT COUNT(*) FROM peel_produits WHERE nom LIKE '%" . addslashes($_GET['motclef']) . "%' ");

$row=mysql_fetch_row($result);

Par :

$req = mysql_query($sql);

$row = mysql_numrows($req);

Tenez moi au courant, au pire des cas, je vous donnerai ma page recherche.php qui fonctionne sans erreur (en fait, j'ai modifié le code pour l'affichage des liens 'page précédente' et 'page suivante').

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

J'ai toujours une erreur à cette ligne

$row = mysql_numrows($req);

Sauriez-vous publier le code entier de votre page "recherche.php" ?

D'avance merci ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

$row = mysql_num_rows($req);

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Ca ne change rien

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/sites/site83/web/boutique/achat/recherche.php on line 96

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Je précise avant de publier le code de la page, que la méthode de recherche affiche les résultats sous forme de tableau et de lignes... C'est donc différent de l'original.

Pour voir comment cela rend, rendez vous ici : http://chateaupartner.com/index.html et faites une recherche avec "michel" par exemple (pas encore rentré les produits définitifs =p).

Ou alors, regardez dans n'importe quelle rubrique comme "meilleures ventes", etc... Tout est affiché de la même manière.

Voici donc ma page recherche.php :

<?
include("../configuration.inc.php");
$DOC_TITLE = "Chateau Partner - Recherche";
include("$repertoire_modele/haut.php");
?>
<table border="0" cellpadding="1" cellspacing="4" width="100%">
<tr>
<td class="titre" colspan="2">
<table cellpadding="0" cellspacing="0" border="0" >
<tr><td class="tetiere" align="center" >Recherche</td></tr>
</table>
<p></p>
<p></p>
Résultat de votre recherche
</tr>
<tr>
<td colspan="2" height="20"><img src="<?=$wwwroot?>/images/blank.gif" height="20" alt="" /></td>
</tr>

<?
if(!isset($start)) {$start=0;}

$recherche=strtolower($motclef); //on passe en minuscule
$mots = str_replace("+", " ", trim($recherche)); //on remplace les + par des espaces
$mots = str_replace("\"", " ", $mots); //idem pour \
$mots = str_replace(",", " ", $mots); //idem pour ,
$mots = str_replace(":", " ", $mots); //idem pour :
$recherche=rawurlencode($recherche); //on encode la recherche

$tab=explode(" " , $mots);
$count=count($tab);

$sql="select * from peel_produits where etat='1' and ( nom like \"%$tab[0]%\" or reference like \"%$tab[0]%\" or millesime like \"%$tab[0]%\" ) ";

for($i=1 ; $i<$count; $i++)
{
$sql.="AND ( nom like \"%$tab[$i]%\" or reference like \"%$tab[$i]%\" or millesime like \"%$tab[$i]%\" )";
}


// On met dans une variable le nombre de vins qu'on veut par page
$nombreDeVinsParPage = 20;

// On récupère le nombre total de vins
$req = mysql_query($sql);
$totalDesVins = mysql_numrows($req);

// On calcule le nombre de pages à créer
$nombreDePages = ceil($totalDesVins / $nombreDeVinsParPage);



?>

</p>

<?php

// on affiche les vins

if (isset($_GET['page']))
{
$page = $_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 vin qu'on prend pour le LIMIT de MySQL
$premierVinAafficher = ($page - 1) * $nombreDeVinsParPage;

$reponse = mysql_query( "$sql ORDER BY nom LIMIT $premierVinAafficher , $nombreDeVinsParPage") or die(mysql_error());


// fin de la requete

if (mysql_num_rows($reponse) == 0) //compteur de resultats
{

echo "<tr><td colspan=\"2\" class=\"normal\">Nous n'avons pas trouvé de résultats incluant le mot clé <b>". stripslashes($_GET['recherche']) ."</b>.<p></p><b>Suggestions :</b><br /><li type=\"square\"> Vérifiez l’orthographe du mot clé.<br /><li type=\"square\"> Essayez d'autres mots.<br /><li type=square> Utilisez des mots plus généraux.<p></p><a href=\"$wwwroot/catalogue.php\" class=\"normal\"><b>Cliquez ici</b></a> pour consulter directement notre catalogue.</td></tr>";

}
else
{
?>

<tr bgcolor="#eeeeee">
<td class="label">Appellation</td>
<td class="label">Château</td>
<td class="label">Millésime</td>
<td class="label">Prix € TTC</td>
</tr>
<?

$o=0;

while($sortie=mysql_fetch_array($reponse))
{

echo " <tr>
<td class=\"normal\">$sortie[reference]</td>
<td class=\"normal\">";
?>

<a href="<?echo $wwwroot?>/achat/produit-details-<?=$sortie['id'] ?>-<?=$catid?>.htm"><?echo stripslashes($sortie['nom']) ?>

<?
echo " </a></td>
<td class=\"normal\">$sortie[millesime]</td>
<td class=\"normal\">$sortie[prix] €</td>
</tr>";

} // fin de boucle

echo "<tr><td>";
// Puis on fait une boucle pour écrire les liens vers chacune des pages
echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
echo ' - <a href="?motclef='.$_GET[motclef].'&page=' . $i . '">' . $i . '</a>';
}
echo "</tr></td>";
}
?>
</td></tr>

</table>
<?
include("$repertoire_modele/bas.php");
?>
[/codebox]

J'espère que vous vous y retrouverez ... ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Posté(e) · Signaler ce message

Ca fonctionne.

Je viens de reprendre le fichier d'origine et ai refais la modif du début de sujet, elle fonctionne maintenant parfaitement.

Voici mon site, en construction :(

http://www.batteries-joskin.be/boutique

Merci pour ton aide ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant

Twitter Advisto ecommerce

Facebook PEEL Shopping