Moteur de recherche

Résolu
erdoganak Messages postés 44 Date d'inscription mercredi 9 septembre 2009 Statut Membre Dernière intervention 11 avril 2011 - 29 juin 2009 à 11:30
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015 - 29 juin 2009 à 15:57
Bonjour dans le cadre de mon stage d'étè je développe un outil de collaboration en xhtml/php/css couplé a une base de donné où des fichiers seront mis a disposition pour collaborer, entre les utilisateurs qui ont droit d'acceder sur la "g.e.d".

je rencontre un problème au niveau du moteur de recherche, quoi que je tape dans la barre de recherche j'obtiens article trouvé :

<html>
<?php
$host = "localhost";
$user = "erdoganak";
$password = "0000";
$bdd = "base";

$Mot = $_POST['Mot'];

mysql_connect($host, $user, $password) or die ("Connexion au serveur impossible");

// on choisit la bonne base
mysql_select_db($bdd) or die ("Connexion a la base impossible");

echo "
<html>

<head>

<title>Résultat de la recherche</title>

</head>

";
if (($Mot "")||($Mot "%")) {
// Si aucun mot clé n'a été saisi,le script demande à l'utilisateur de bien vouloir préciser un mot clé

    echo "
    Veuillez entrer un mot clé s'il vous plaît!
    ";
}

else {
// On selectionne les enregistrements contenant le mot clé
// dans les keywords ou le titre
    $query = "SELECT distinct count(lien) FROM search
    WHERE keyword LIKE "%$Mot%"
    OR titre LIKE "%$Mot%"
    ";

    $result = mysql_query($query);

    $row = mysql_fetch_row($result);

    $Nombre = $row[0];

// Si aucun enregistrement n'est retourné, on affiche un message adéquat
if ($Nombre == "0") {
    echo "
    Aucun résultat ne correspond à votre recherche

   

    ";
}

// Sinon, on affiche le nombre d'enregistrements correspondant et les résultats eux-mêmes
else {
    $query = "SELECT distinct lien,keyword,titre FROM search
    WHERE keyword LIKE "%$Mot%"
    OR titre LIKE "%$Mot%" ORDER by titre ASC";

    $result = mysql_query($query);

    // Si un seul enregistrement est trouvé, on affiche un message au singulier
    if ($Nombre == "1") {
    echo "
    Résultat: Un article trouvé

    ";

    }
    // Dans le cas contraire le message est au pluriel...
    else {
    echo "
    Résultat: $Nombre articles trouvés

    ";

    }
    while($row = mysql_fetch_row($result))
    {
        echo "
        \n
        $row[2]\n
        
Visualiser l'article\n
        \n
        ";

    }
}

}

// on ferme la base
mysql_close();

?>

</html>

merci d'avance

2 réponses

kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
29 juin 2009 à 15:47
$Mot = $_POST['Mot'];

LIKE "%$Mot%"

Raaaaaah comme c'est pas beau... tu fais quoi si je fais une recherche à

"; DROP TABLE search; #

ta requete devenant...

SELECT distinct count(lien) FROM search WHERE keyword LIKE "%"; DROP TABLE search; #%" OR titre LIKE "%"; DROP TABLE search; #%"

je te laisse imaginer la suite... bon cet exemple ne marcherait pas car maintenant mysql_query n'accepte qu'un requête a la fois mais le principe est là et d'autre injection sont possible avec ta requête... donc déjà...

if(isset($_POST['Mot'])) {
$mot = mysql_real_escape_string($_POST['Mot']);
}
else {
$mot = '';
}

http://fr2.php.net/mysql_real_escape_string

ensuite... ta requête semble bien formée... as tu essayer de la tester dans phpmyadmin... tu fais une recherche avec un mot ou avec une phrase... si c'est avec une phrase split là et construit ta requête avec chaques mots indépendamment... fais un truc dans le genre... .. .

$Mots = explode(' ', $Mots);
$first = array_shift($Mots);
$req1 = ' keywords LIKE "%'.$first.'%"';
$req2 = ' OR title LIKE "%'.$first.'%"';
if(!empty($Mots)) {
$i= -1;
while(isset($Mots[++$i])) {
$req1 .= ' OR keyword LIKE "%'.$Mots[$i].'%"';
$req2 .= ' OR title LIKE "%'.$Mots[$i].'%"';
}
}
$query = 'SELECT distinct lien, keyword, titre FROM search WHERE '.req1.req2.' ORDER by titre ASC';

Par contre

$Nombre == "0"

>>

$Nombre === 0
3
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
29 juin 2009 à 15:57
Ah j'oubliais tu peux mettre des parenthèses dans tes like pour filtrer un peu le bousin

WHERE field LIKE "%test%" OR title LIKE "%test%" OR field LIKE "%pwet%" OR title LIKE "%pwet%"

ne retournera pas la même chose que...

WHERE (field LIKE "%test%" OR title LIKE "%test%") OR (field LIKE "%pwet%" OR title LIKE "%pwet%")

Mais ça c'est à toi de voir... .. .

@ tchaOo°
3
Rejoignez-nous