Conseils pour créer un moteur de recherches

Répondre
jackbocar
le 27/06/2007 à 08:38
jackbocar
Bonjour,

J'aimerai faire un moteur de recherches avec plusieurs critères de recherches.

J'ai pour le moment une base de données avec une table dont le seul critère d'affichage est le nom de lieu.

J'aimerai ajouter pour le moteur de recherches un nom de personnage, le genre de bâtiment qui existe sur ce lieu de façon que si l'on recherche une chapelle à Vence (06), la recherche affiche le nom du bâtiment (chapelle, église, grange, métairie, ferme), le ou les personnages connus en ce lieu (chevalier, sergent, pâtre, fermier).

Je n'ai aucune idée de la façon la plus appropriée de créer de nouvelles tables : faut-il une table avec les bâtiments dans ce lieu, une autre avec le nom des personnages dans ce même lieu ?

Comment organiser cette recherche sur ces trois tables : celle des lieux ; celle des bâtiments ; celle des personnages ?

Est-ce que les joins entre ces trois tables sont viables ?
Est-ce que ce moteur de recherche ne prendra pas trop de ressources et mettre en péril le système et les résultats ?

Merci de vos conseils et votre aide.

Jack Bocar
jackbocar
le 27/06/2007 à 13:07
jackbocar
Bonjour,

J'ai essayé de faire comme sur les cours et les bases de données, mes rien ne s'affiche ?

Merci de me dire pourquoi.

Jack Bocar

<?php
$base = mysql_connect ('serveur', 'login', 'pass');
mysql_select_db ('commanderies', $base) ;
?>


--
-- Structure de la table `lieux`
--

DROP TABLE IF EXISTS `lieux`;
CREATE TABLE `lieux` (
`id` int(5) NOT NULL auto_increment,
`nom` varchar(150) NOT NULL,
`dep` varchar(2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Lieux des commanderies' AUTO_INCREMENT=3 ;

--
-- Contenu de la table `lieux`
--

INSERT INTO `lieux` (`id`, `nom`, `dep`) VALUES
(1, 'Paris', '75'),
(2, 'Coulommiers', '77');

-- --------------------------------------------------------

--
-- Structure de la table `personnages`
--

DROP TABLE IF EXISTS `personnages`;
CREATE TABLE `personnages` (
`id` int(5) NOT NULL auto_increment,
`patronyme` varchar(150) NOT NULL,
`chevalier` varchar(50) NOT NULL,
`precepteur` varchar(50) NOT NULL,
`pretre` varchar(50) NOT NULL,
`sergent` varchar(50) NOT NULL,
`grangier` varchar(50) NOT NULL,
`donnat` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='personnages' AUTO_INCREMENT=3 ;

--
-- Contenu de la table `personnages`
--

INSERT INTO `personnages` (`id`, `patronyme`, `chevalier`, `precepteur`, `pretre`, `sergent`, `grangier`, `donnat`) VALUES
(1, 'Hugues de Payns', 'Chevaliers', 'Précepteur', '', '', '', ''),
(2, 'Jacques de Molay', 'Chevaliers', 'Précepteur', '', '', '', '');

-- --------------------------------------------------------

--
-- Structure de la table `stuctures`
--

DROP TABLE IF EXISTS `stuctures`;
CREATE TABLE `stuctures` (
`id` int(5) NOT NULL auto_increment,
`type` varchar(150) NOT NULL,
`visible` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Liste des batiments' AUTO_INCREMENT=3 ;

--
-- Contenu de la table `stuctures`
--

INSERT INTO `stuctures` (`id`, `type`, `visible`) VALUES
(1, 'Plan', 'Oui'),
(2, 'Commanderie, Chapelle, Grange', 'Oui');


<?php
$sql = 'SELECT nom, patronyme, chevalier, precepteur, pretre, sergent, grangier, donnat, type, visible FROM lieux, stuctures, personnages WHERE stuctures.type LIKE "C%" AND stuctures.visible ="chapelle" AND personnages.id ="patronyme" ORDER BY lieux.nom ASC';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

while ($data = mysql_fetch_array($req)) {

//Nom pour le lieu
echo 'Nom : '.$data['nom'].'<br />';
//Patronyme pour le nom et le prénom
echo 'Personnage : '.$data['patronyme'].'<br />';
//Type pour le genre de bâtiment
echo 'Bâtiments : '.$data['type'].'<br /><br />';
}
mysql_free_result ($req);
mysql_close ();
?>
jackbocar
le 27/06/2007 à 14:04
jackbocar
Bonjour,

J'ai trouvé une solution, je ne sais si elle est une BONNE solution.

Merci de me dire si ce code est de bonne qualité et si NON, où et comment l'améliorer.

Jack Bocar


<?php
<?php
$sql = 'SELECT lieux.nom,dep, stuctures.type, personnages.patronyme, chevalier, precepteur, donnat FROM lieux, stuctures, personnages WHERE lieux.nom LIKE "C%" AND lieux.id = stuctures.id = personnages.id ORDER BY lieux.nom ASC';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

while ($data = mysql_fetch_array($req)) {

$nom=$data['nom'];
$dep=$data['dep'];
$patronyme=$data['patronyme'];
$chevalier=$data['chevalier'];
$precepteur=$data['precepteur'];
$sergent=$data['sergent'];
$pretre=$data['pretre'];
$ecuyer=$data['ecuyer'];
$donnat=$data['donnat'];
$type=$data['type'];

//Nom pour le lieu
echo '<span>Lieu : '.($nom).' &nbsp; '.($dep).'</span><br />';

//Patronyme personnage
echo '<span>Patronyme : '.($patronyme).'</span><br />';

//les fonction du personnage
echo '<span>Ses Fonctions : '.($chevalier).' &nbsp; '.($precepteur).' &nbsp; '.($sergent).' &nbsp; '.($pretre).' &nbsp; '.($donnat).'</span><br />';

//Type pour le genre de bâtiment
echo '<span>Bâtiments : '.($type).'</span><br />';
}
mysql_free_result ($req);
mysql_close ();
?>


Résultat de l'Affichage :

Lieu : Coulommiers 77

Patronyme : Hugues de Payns

Ses Fonctions : Chevaliers Précepteur

Bâtiments : Commanderie, Chapelle, Grange


Comment afficher pour les bâtiments Commanderie Chapelle et pas Grange
jackbocar
le 27/06/2007 à 15:42
jackbocar
Bonjour,

Merci de l'information MYSQL, car avec la recherche FULLTEXT et mon select :

<?php
$sql = 'SELECT nom, news, MATCH (nom,news) AGAINST
("chevalier") AS score
FROM recherches WHERE MATCH (nom,news) AGAINST
("commanderie")';
?>


Je peux faire sans problèmes des recherches de ce genre là. Et bien plus avec un menu déroulant avec OPTION.

Exemple :

<?php
$sql = 'SELECT nom, news, MATCH (nom,news) AGAINST
("grange") AS score
FROM recherches WHERE MATCH (nom,news) AGAINST
("ecuyer")';
?>


<?php
$sql = 'SELECT departement, news, MATCH (departement,news) AGAINST
("grange") AS score
FROM recherches WHERE MATCH (departement,news) AGAINST
("cantal")';
?>


C'est super ce code.

Jack Bocar
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours