Formulaire de recherche sur le site

Eléphant du PHP | 122 Messages

07 juil. 2008, 15:29

Salut,

Voici mon troisième script sur lequel j'ai également un petit soucis:

Mon moteur de recherche.

Voici le script du formulaire de recherche:
<form method="POST" action="recherche.php">

Entrez un mot clé:<br>

<input type="text" name="Mot" size="15">

<input type="submit" value="Rechercher" alt="Lancer la recherche!">

</form>
Voici le script d'affichage du résultat de la recherche:
<?php
$host = "localhost";
$user = "root";
$password = "";
$bdd = "abcfibromyalgie";

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>

<body>";

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!
	<p>";

}

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 "
	<h2>Aucun résultat ne correspond à votre recherche</h2>

	<p>

	";

}

// 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 "
	<a name=\"#resultat\"><h2>Résultat: Un article trouvé</h2></a>

	<p>";

	}
	// Dans le cas contraire le message est au pluriel...
	else {
	echo "
	<a name=\"#resultat\"><h2>Résultat: $Nombre articles trouvés</h2></a>

	<p>";

	}
	while($row = mysql_fetch_row($result))
	{
		echo "
		<p>\n
		<b>$row[2]</b>\n
		<br><a href=\"../$row[0]\">Visualiser l'article</a>\n
		<p>\n
		";

	}
}

}

// on ferme la base
mysql_close();

?>

</body>

</html>
Voici le premier code de la BDD:
-- 
-- 
-- Structure de la table `search`
-- 

CREATE TABLE `search` (
  `lien` varchar(128) NOT NULL,
  `keyword` text,
  `titre` varchar(128) default NULL,
  `id` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Là le problème, c'est que quand je tape un mot dans le moteur de recherche et que je valide ma requete, il ne m'affiche aucun resultat meme si dans la BDD ce mot là est présent ....

Donc si certains d'entre vous ont une solution ... je suis preneur ...

D'avance merci beaucoup ...

Mammouth du PHP | 1353 Messages

07 juil. 2008, 15:49

Il faudrait commencer par définir ta variable $Mot (dans recherche.php, avant de tester si $Mot est vide il faudrait la définir)...
if(isset($_POST["Mot"])) $Mot = $_POST["Mot"];
else $Mot = "";
Parce que la $Mot est toujours vide puisqu'elle est pas déclarée ou définie...
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 122 Messages

07 juil. 2008, 16:05

Génial !!!

Ca fonctionne nickel ...

J'ai essayé ca marche super bien ...

A la place %, est-il possible de définir un autre symbole, comme * par exemple ?? c'est plus d'usage que % ???

Mammouth du PHP | 1353 Messages

07 juil. 2008, 16:22

Si tu parles du "%" dans le if (($Mot == "")||($Mot == "%")) alors oui tu peux faire ce que tu veux.
Par contre il ne faut pas modifier les % dans les LIKE de la requete SQL.

Tu peux meme faire mieux que ca dans le if, tu peux par exemple verifier que la chaine contienne + d'un caractère (car c'est rare de chercher sur un caractere seulement...)

Exemple :
if(strlen($Mot)>1) //si la longueur de mot est > à 1...
{
}
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 122 Messages

07 juil. 2008, 16:34

Pas bête non plus cette astuce..

Je vais "tenter" de la mettre en pratique ...

Merci à toi

Mammouth du PHP | 1353 Messages

07 juil. 2008, 16:38

Dernier détail assez important :

Pense à te prémunir des injections SQL dans ta base, a savoir des injections de code mal intentionés lorsque tu récupères des valeurs saisies par des utilisateurs.

Je te conseille non pas de faire simplement un
if(isset($_POST["Mot"])) $Mot = $_POST["Mot"]; 
comme je t'avais dit (pour que tu comprennes le principe ;))

mais plutot un
if(isset($_POST["Mot"])) $Mot = mysql_real_escape_string($_POST["Mot"]); 
Car ca te "purifie" la variable et évite que des caraactères permettant les injections ne trainent...


Renseigne toi sur cette fonciton et sur les injections SQL pour en savoir +...
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphant du PHP | 122 Messages

17 sept. 2008, 10:30

Bonjour,

Après un long moment d'absence je reviens doucement ...

J'ai une question concernant ce moteur de recherche car il y a un point qui ne fonctionne pas ...

Voici le code:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ABC Fibromyalgie</title>
<!-- lien de la feuille de style des textes -->
<link href="../../Design/styletext.css" rel="stylesheet" type="text/css" />
<!-- lien de la feuille de style de la position des blocs -->
<link href="../../Design/stylepage.css" rel="stylesheet" type="text/css" />
<!-- lien de la feuille de style de la gestion du menu -->
<link href="../../Design/stylemenu.css" rel="stylesheet" type="text/css" />
</head>

<body>

<div id="corps">
<div id="image_fond"></div>
<div id="logo"><a href="../../Index.php"><img src="../../Images/Logo/colombe_couleur_text.png" width="160" height="160" border="0" /></a></div>
<div id="posmenu">
<?php include("../../MenuPages.php"); ?>
</div>
<div id="titre">Rechercher un article sur le site de l'Assoc</div>
<div id="texte"><br/>
    <br/>
  <br/>
  <br/>
  <center>
    <?php //include("../Form_recherche.php"); ?>
  </center>
  <br/>
  <br/>
  <br/>
  <br/>
  <br/>
</div>
</div>
<div id="recherche">
<?php
$host = "localhost";
$user = "root";
$password = "";
$bdd = "toto";

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");

if(isset($_POST["Mot"])) $Mot = mysql_real_escape_string($_POST['Mot']);
else $Mot = "";

echo "
<html>

<head>

<title>R&eacute;sultat de la recherche</title>

</head>

<body>";

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&eacute; s'il vous pla&icirc;t!
	<p>";

}

else {
// On selectionne les enregistrements contenant le mot cl�
// dans les keywords ou le titre
	$query = "SELECT distinct count(up_lien) FROM upload_fichier
	WHERE inscr_pseudo LIKE \"%$Mot%\"
	OR up_titre_article LIKE \"%$Mot%\"
	OR up_rubrique LIKE \"%$Mot%\"
	OR up_description LIKE \"%$Mot%\"
	OR up_finalname 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 "
	<h3>Aucun r&eacute;sultat ne correspond &agrave; votre recherche</h3>

	<p>

	";

}

// Sinon, on affiche le nombre d'enregistrements correspondant
// et les r�sultats eux-m�mes
else {
	$query = "SELECT distinct inscr_pseudo, up_titre_article, up_rubrique, up_description, up_lien FROM upload_fichier
	WHERE inscr_pseudo LIKE \"%$Mot%\"
	OR up_titre_article LIKE \"%$Mot%\"
	OR up_rubrique LIKE \"%$Mot%\"
	OR up_description LIKE \"%$Mot%\"
	OR up_finalname LIKE \"%$Mot%\"
	ORDER by up_titre_article ASC";

	$result = mysql_query($query);

	// Si un seul enregistrement est trouv�, on affiche un message au singulier
	if ($Nombre == "1") {
	echo "
	<a name=\"#resultat\"><h2>R&eacute;sultat: Un article trouv&eacute;</h2></a>

	<p>";

	}
	// Dans le cas contraire le message est au pluriel...
	else {
	echo "
	<a name=\"#resultat\"><h2>R&eacute;sultat: $Nombre articles trouv&eacute;s</h2></a>

	<p>";

	}
	while($row = mysql_fetch_row($result))
	{
		echo "
		<p>\n
		<b>$row[2]</b>\n
		<br><a href=\"../$row[0]\">Visualiser l'article</a>\n
		<p>\n
		";

	}
}

}

// on ferme la base
mysql_close();

?>
</div>
</body>
</html>
Donc mon problème est que quand il trouve des résultats et qu'il les affichent, quand je veux cliquer dessus pour afficher le contenu de l'article juste en dessous, il m'affiche sur une page blanche:

The requested URL /3eme mouture - /Formulaire/Admin was not found on this server.
(dans ce cas "Admin" est le pseudo de la personne ayant posté l'article)

Et il ne m'affiche rien d'autre.

Donc je soupçonne les lignes:
	while($row = mysql_fetch_row($result))
	{
		echo "
		<p>\n
		<b>$row[2]</b>\n
		<br><a href=\"../$row[0]\">Visualiser l'article</a>\n
		<p>\n
		";

	}
Mais je ne sais pas trop quoi changer ...

Je compte donc encore une fois sur le site de PHPFrance pour venir à mon aide ...

Merci à vous toutes et tous ...

Eléphant du PHP | 122 Messages

19 sept. 2008, 15:04

UP ... Besoin de vous svp

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

19 sept. 2008, 15:41

mon problème est que quand il trouve des résultats et qu'il les affichent, quand je veux cliquer dessus pour afficher le contenu de l'article juste en dessous, il m'affiche sur une page blanche:

The requested URL /3eme mouture - /Formulaire/Admin was not found on this server.
Bonjour,

Regarde le code HTML généré et trouve pourquoi les url que tu affiches ne renvoie pas vers les bonnes pages. ;)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 122 Messages

19 sept. 2008, 15:45

Bah je ne vois pas grand chose ...

Je soupçonne les lignes là
while($row = mysql_fetch_row($result))
    {
        echo "
        <p>\n
        <b>$row[2]</b>\n
        <br><a href=\"../$row[0]\">Visualiser l'article</a>\n
        <p>\n
        ";

    } 
Et peut etre plus cette ligne-ci:
<br><a href=\"../$row[0]\">Visualiser l'article</a>\n
Mais je ne vois pas ce qu'il faut changer ...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 sept. 2008, 15:48

Si tu avais suivi le conseil d'@rthur
Regarde le code HTML généré
Je pense que tu aurais trouvé la solution tout seul ;)

En effet, je pense qu'un code
echo " 
        <p>\n 
        <b>$row[2]</b>\n 
        <br><a href=\"../$row[0]\">Visualiser l'article</a>\n 
        <p>\n 
        ";
Doit généré un code HTML final qui doit ressembler à ça :

Code : Tout sélectionner

<p> <b>array[2]</b> <br><a href=\"../array[0]\">Visualiser l'article</a> <p>
En effet, lorsque les variables sont dans les chaines, PHP fait echo $row sans comprendre que [2] fait parti de la variable. Et un echo sur un tableau affiche "array".
Pour corriger ce soucis, il faut extraire les variables des chaines.
Exemple :
echo " 
        <p>\n 
        <b>". $row[2] ."</b>\n 
        <br><a href=\"../". $row[0] ."\">Visualiser l'article</a>\n 
        <p>\n 
        ";
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 122 Messages

19 sept. 2008, 15:53

J'ai copié coller ton code en lieu et place du mien mais ça n'a rien changé ...

Je suis peut etre sur la bonne piste mais il doit manqué qqchose à changer ...

EDIT:

Je viens de piger que row[0] m'affichait la rubrique de l'article, row[1], le pseudo row[2], le titre de l'article , etc ... enfin peut etre pas dans cet ordre là mais ça change cette valeur ... cooollll

Eléphant du PHP | 122 Messages

22 sept. 2008, 09:31

Juste un petit UP ...

Svp

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 sept. 2008, 09:49

Pour la 3ème fois : affiche le code HTML généré.

C'est à dire que tu affiches la page dans ton navigateur, tu demandes à voir le code source de cette page et tu recherches la partie de code que ton code PHP à généré.

Une fois que tu l'as trouvé, poste nous ça ici.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 122 Messages

22 sept. 2008, 09:53

Ok ok .....

Alors quand je fais une recherche sur mon site, j'ai une liste de resultats et quand je clique sur un des resultats, voilà le code source de la page qui s'affichent :

Code : Tout sélectionner

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL /Form/Aluminium was not found on this server.</p> </body></html>
Si ça peut aider ...