8791 sujets

Développement web côté serveur, CMS

bonjour à tous comment je peux faire un recherche approché sur la contenu de la base de donnée ??
Modifié par eagle83 (07 Aug 2009 - 15:24)
Modérateur
Hello,

Je ne comprends pas très bien ce que tu veux. En SQL, il y a plusieurs opérateurs afin de rechercher tes données avec plus ou moins de précisions. Tu as une instruction qui pourrait t'aider entres autres, c'est LIKE. Ce qui donne ceci :


SELECT * FROM uneTable WHERE unChamp LIKE ('%Ren%')


Cela veut dire : Sélectionne moi tous les champs de la table « uneTable » si dans le champ « unChamp », il y a le motif Ren.

++
merci mec
si l'enregistrement contient plusieurs mot comment je peux gérer l'espace entre les mots????
Modérateur
Salut,

Tu as la solution d'utiliser une RegEx. Cependant, j'ai l'impression que le champ que tu souhaites interroger n'est pas aux normes (données atomiques) et donc cette table n'est pas aux normes. Je peux toutefois me tromper. Je pense à ce genre de choses :

couleur = 'bleu, vert, marron, ... '

Il y a néanmoins la possibilité que ton champ soit par exemple un synopsis. Dans cet esprit, tu peux utiliser un RegEx afin de récupérer les enregistrements :

SELECT * FROM uneTable WHERE unChamp REGEXP 'Il était une fois | princesse | prince charmant | sorcière'


Peux tu mettre sur le forum un enregistrement de ta BDD afin que je comprenne mieux ce que tu désires.

++
bonjour
veuillez trouver l'image de la base de donnée
upload/22261-basedonnee.png
et j'ai fais mon code qui permet tester par $_post mais il ne marche pas je ne sais pas pourqoui il ne connait pas la le nom de chmps de test

<?php
						echo'<div id="divzonerecherche">
						<form id="form1" name="form1" method="post" action="searchauto.php">
						  <p class="fontbold">Recherche une fiche par mot cl&egrave;s : 
						    <input name="vrecherche" type="text" value="" class="divtexte" />
						 <input name="butrech" type="submit" value="valider" class="divbutton"/><p>
						 </form>
						</div>';
						
						
						if(empty($_POST["vrecherche"]))
						{
								$i=0;
								$connect = mysql_connect('localhost','root','') or die ("erreur de connexion");
								mysql_select_db('base',$connect) or die ("erreur de connexion base");
								setlocale (LC_ALL, 'fr_FR'); 
								$result = mysql_query("SELECT *,DATE_FORMAT(date_creation, '%d %m %Y') AS datecreation,DATE_FORMAT(date_miseajour, '%d %m %Y') AS datemise from fiche") ;
								$mois = array("01"=>"Janvier","02"=>"Février","03"=>"Mars","04"=>"Avril","05"=>"Mai","06"=>"Juin","07"=>"juillet","08"=>"Août","09"=>"Septembre","10"=>"Octobre","11"=>"Novembre","12"=>"Décembre"); 
								while ($row = mysql_fetch_array($result)){
								if($i %2 == 0)
								$bgcolor = "#969696";
									else
								$bgcolor = "#D5D5D5";

								list($day,$month,$year) = explode(" ", $row["datecreation"]); 
								list($day,$month,$year) = explode(" ", $row["datemise"]); 
								$row["datecreation"] = $day .' '. $mois[$month] .' '. $year;
								$row["datemise"] = $day .' '. $mois[$month] .' '. $year;
								
								echo'<div class="information" style="background-color:'.$bgcolor.'">
								<p><h4>Titre de document :'.$row["Nom_fiche"].'<span class="dateac"> Date de creation:'.$row["datecreation"].'</span></h4></p>
								<p class="dateac"> Date de mise &agrave; jour : '.$row["datecreation"].'</p>
								<p>'.$row["Commentaire"].'</p>
								<p><a href="'.$row["liendoc"].'" Target="_blank">Voir le document</a>
								</div>';
								$i++;
								}
								mysql_close();
							}	
								else
								$i=0;
								$connect = mysql_connect('localhost','root','') or die ("erreur de connexion");
								mysql_select_db('base',$connect) or die ("erreur de connexion base");
								setlocale (LC_ALL, 'fr_FR'); 
								$text=$_POST['vrecherche'];
								$result = mysql_query("SELECT *,DATE_FORMAT(date_creation, '%d %m %Y') AS datecreation,DATE_FORMAT(date_miseajour, '%d %m %Y') AS datemise from fiche where Nom_fiche LIKE '%".$text."%' or Commentaire LIKE '%".$text."%'") ;
								$mois = array("01"=>"Janvier","02"=>"Février","03"=>"Mars","04"=>"Avril","05"=>"Mai","06"=>"Juin","07"=>"juillet","08"=>"Août","09"=>"Septembre","10"=>"Octobre","11"=>"Novembre","12"=>"Décembre"); 
								while ($row = mysql_fetch_array($result)){
								if($i %2 == 0)
								$bgcolor = "#969696";
									else
								$bgcolor = "#D5D5D5";

								list($day,$month,$year) = explode(" ", $row["datecreation"]); 
								list($day,$month,$year) = explode(" ", $row["datemise"]); 
								$row["datecreation"] = $day .' '. $mois[$month] .' '. $year;
								$row["datemise"] = $day .' '. $mois[$month] .' '. $year;
								
								echo'<div class="information" style="background-color:'.$bgcolor.'">
								<p><h4>Titre de document :'.$row["Nom_fiche"].'<span class="dateac"> Date de creation:'.$row["datecreation"].'</span></h4></p>
								<p class="dateac"> Date de mise à jour : '.$row["datecreation"].'</p>
								<p>'.$row["Commentaire"].'</p>
								<p><a href="'.$row["liendoc"].'" Target="_blank">Voir le document</a>
								</div>';
								$i++;
								}
								mysql_close();

						?>
Modérateur
Si tu veux faire une recherche sur le champ commentaire, je peux te proposer d'essayer ceci :

$sql = "SELECT unChamp, unAutreChamp ";
$sql .= "FROM maTable ";
$sql .= "WHERE commentaires LIKE ('%mai%') ";
$sql .= "AND commentaires LIKE ('%handicap%')";


Ce qui revient à dire, cherche une/des fiche(s) où il y a comme données dans le champ commentaire le mot mai et le handicap.

En espérant t'avoir aidé,
Bonne journée. Smiley smile
merci mais comment je peux savoir combien des mots doit entrer par l'utilisateur, pour votre solution vous avez fait des mots ,mais le cas des variable il aut tester donc le premier mot et aprés la deuxieme???
Modérateur
eagle83 a écrit :
...
premier mot et aprés la deuxieme???


Pas nécessairement. Tu peux faire une RegEx voir même une autre manière (explode) sur la saisie du champ text et retirer les différents mots entrés par l'utilisateur. Une fois retirés, implémenter une requête sql dynamique.
Modifié par Nolem (04 Aug 2009 - 18:00)
Salut,

tu as un exemple dans ce post (si tu veux que la recherche ne rapporte que les enregistrements qui ont tous les mots il faut changer OR par AND).
merci pour vos aides
mais ce que me dérange est ce qu'il avait une possibilité de sélectionner ou bien colorer les mots recherchées dans les résultats
2 est ce que cette méthode de recherche est utile pour les caractère comme(é,à...)parce que il est remplacé dans les enregistrement par par exemple(é>&eacute;)
merci Heyoan et Nolem pour vos aides
Modérateur
Hello Heyoan, Smiley smile

heyoan a écrit :

...
FROM article a, tag t, article_tag at
...


En lisant attentivement ton code, je vois que tu n'utilises pas l'instruction « AS ». Je ne connaissais pas cette forme d'écriture. Est ce qu'il y a des restrictions ou une/des règle(s) suivant cette forme d'écriture ?

Bonne journée à toi Smiley smile
Modifié par Nolem (05 Aug 2009 - 13:38)
eagle83 a écrit :
il avait une possibilité de sélectionner ou bien colorer les mots recherchées dans les résultats
Oui : il faut apprendre les regexp...

eagle83 a écrit :
est ce que cette méthode de recherche est utile pour les caractère comme(é,à...)parce que il est remplacé dans les enregistrement par par exemple(é>&eacute;)
Non : c'est l'un des intérêts à ne pas utiliser htmlspecialchars ou htmlentities sur des variables avant de les insérer en base.
Salut Nolem, Smiley smile
Nolem a écrit :
je vois que tu n'utilises pas l'instruction « AS »
Il me semble que le AS est facultatif dans la plupart (tous ?) des moteurs SQL.
Heyoan a écrit :
Oui :

Non : c'est l'un des intérêts à ne pas utiliser htmlspecialchars ou htmlentities sur des variables avant de les insérer en base.

merci c'est je peux utiliser après la récupération de donnée de la base de donnée (par exemple

$info=htmlspecialchars ($rows["pays"]


bonjour en fait j'ai trouver mes erreurs !!maintenant il fonctionne bien

$connect = mysql_connect('localhost','root','') or die ("erreur de connexion");
mysql_select_db('base',$connect) or die ("erreur de connexion base");
setlocale (LC_ALL, 'fr_FR');
 if (!isset($_POST['vrecherche']) || empty($_POST['vrecherche']))
{
	$requete = "SELECT *, DATE_FORMAT(date_creation, '%d %m %Y') AS datecreation, DATE_FORMAT(date_miseajour, '%d %m %Y') AS datemise from fiche";
}
else
{
	$text = $_POST['vrecherche'];
	$requete = "SELECT *, DATE_FORMAT(date_creation, '%d %m %Y') AS datecreation, DATE_FORMAT(date_miseajour, '%d %m %Y') AS datemise from fiche where Nom_fiche LIKE '%".$text."%' or Commentaire LIKE '%".$text."%'";
}
	$result = mysql_query($requete) or die ('Erreur sur '.$requete.'<br/>'.mysql_error());
 	$mois = array("01"=>"Janvier","02"=>"Février","03"=>"Mars","04"=>"Avril","05"=>"Mai","06"=>"Juin","07"=>"juillet","08"=>"Août","09"=>"Septembre","10"=>"Octobre","11"=>"Novembre","12"=>"Décembre");
 	$i=0;
	while ($row = mysql_fetch_array($result)){
	if($i %2 == 0)
		$bgcolor = "#969696";
	else
		$bgcolor = "#D5D5D5";
	list($day,$month,$year) = explode(" ", $row["datecreation"]);
	$datecreation = $day .' '. $mois[$month] .' '. $year;
	list($day,$month,$year) = explode(" ", $row["datemise"]);
	$datemise = $day .' '. $mois[$month] .' '. $year;
	echo '<div class="information" style="background-color:'.$bgcolor.'">';
	echo '<p><h4>Titre de document :'.$row["Nom_fiche"].'<span class="dateac"> Date de creation:'.$datecreation.'</span></h4></p>';
	echo '<p class="dateac"> Date de mise à jour : '.$datemise.'</p>
	<p>'.$row["Commentaire"].'</p>
	<p><a href="'.$row["liendoc"].'" Target="_blank">Voir le document</a></p>';
	echo '</div>';
	$i++;
}
mysql_close();
?>

mon problème c'est qu'elle est l regex qui me permet de colorer un mot dans la résultat de la recherche???