Moteur de cherche pour ma bdd

Suivre ce topic
Ce topic est suivi par : pain
Ce topic a été résolu
Sh0kaP1k

Sh0kaP1k Le 27 mars 2016 à 21:10 (Édité le 25 janvier 2019 à 17:50)

Bonjour ou bonsoir à tous,

Je vais essayer de résumer mon probleme rapidement:

J'aimerai inserer une barre de recherche pour que l'on puisse entrer des mots-clés et que cela nous amene vers les profil qui possède ces mots-clés.

PS: J'ai créé une colonne "Mots-clés"

Vous pouvez me poser des question si vous n'avez pas très bien compris 😀
quiqou55

quiqou55 Le 28 mars 2016 à 01:09 (Édité le 28 mars 2016 à 01:15)

Salut !
Pour faire une recherche tu peut utiliser la fonction LIKE de MySQL suivi d'une expression régulière simplifié :
SELECT * FROM articles WHERE title LIKE :motcle OR content LIKE :motcle
ensuite dans ton script php tu peut exécuter ta requete sql : 
<?php $req->execute(array(
   "motcle"   =>   "%" . $motcle . "%"
)); 
// Ou la méthode raccourcie : 
$req->execute([
   "motcle"   =>   "%{$motcle}%"
]);
Après si tu veut lier ta table mots clé, tu peut faire un LEFT JOIN.
Mais tu peut aussi créer un champs "mot_cle" dans ta table article par exemple et ensuite faire un : 
SELECT * FROM articles WHERE title LIKE :motcle OR content LIKE :motcle OR mot_cle LIKE :motcle
PS:  écrire un tableau avec une clé évite de dupliquer les champs comme ça : 
SELECT * FROM articles WHERE title LIKE ? OR content LIKE ?
et ecrire sa dans l'execution : 
<?php $req->execute(array(
   "%" . $motcle . "%",
   "%" . $motcle . "%"
)); 
Sh0kaP1k

Sh0kaP1k Le 28 mars 2016 à 01:14

Dsl mais j'ai compris que 20% de ce que tu ma dis parce que je suis débutant.
quiqou55

quiqou55 Le 28 mars 2016 à 01:23 (Édité le 28 mars 2016 à 01:25)

Par exemple si tu as une table articles qui contient tout les articles de ton site, dans ta table article tu as cette structure : 

  • Champ id 
  • Champ titre
  • Champ content
  • Champ mots_cle

Tu peut faire sa dans ton code php : 
<?php
   $bdd = new PDO('mysql:dbname=*****;host=localhost:charset=utf8;', '****', '***');
   $req = $bdd->prepare('SELECT * FROM articles WHERE content LIKE :search OR titre LIKE :search OR mots_cle LIKE :search');
   
   // Je suppose que les mots clé se trouve dans $_GET['mots_cles']
   $req->execute(array(
      "search"  =>  "%" . $_GET["mots_cles"] . "%"
   ));
   while($data = $req->fetch()){
      echo $data['titre'];
   }
Sh0kaP1k

Sh0kaP1k Le 28 mars 2016 à 11:00

D'accord je vais essayer et je t'informe sous peu.
Sh0kaP1k

Sh0kaP1k Le 28 mars 2016 à 11:34

Je vais expliquer en détail ce que je voudrai:

Je voudrai que on puisse faire une recherche de pseudo dans une barre et si ce pseudo existe alors ca l'affiche et après je voudrai que l'on puisse cliquer sur le pseudo pour que ca nous amene sur sa page de profil.
quiqou55

quiqou55 Le 28 mars 2016 à 12:56 (Édité le 28 mars 2016 à 12:57)

Ok, le code peut changer en fonction de l'organisation et du choix des noms de variables.

Tout d'abord pour la barre de recherche c'est assez simple : 
<form action="search_pseudo.php">
   <input type="text" name="search" id="search" />
   <input type="submit" class="btn">
</form>
Dans ta bdd tu auras par exemple ces champs supplémentaire : 
TABLE membres
   pseudo   VARCHAR(255)
   mots_cles VARCHAR(255)

et ensuite dans ton fichier search_pseudo.php : 
<?php
   $search = htmlspecialchars($_GET['search']);
   $bdd = new PDO("mysql:dbname=******;host=******;charset=utf8;", "****", "*****");
   
   // Pour eviter les problèmes d'encodage et pour gagner en performance (pas obligatoire): 
   $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $bdd->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
   $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
   
   // Requetes SQL : 
   
   $query = "
      SELECT * FROM membres
      WHERE pseudo LIKE :s
      OR mots_cles LIKE :s
   "
   
   $s = "%" . $search . "%";
   
   $req = $bdd->prepare($query);
   $req->execute([ "s"  =>  $s ]);
   
   // Faire un fetchAll() est plus performant pour un système recherche 😀
   
   $results = $req->fetchAll();

   foreach($results as $result){
      ?>
         <a href="/profil/<?php echo $result['pseudo'] ?>">
            Profile de <?php echo $result['pseudo'] ?>
         </a>
      <?php
   }
Sh0kaP1k

Sh0kaP1k Le 28 mars 2016 à 15:13

Merci mais il me dit qu'il y a un probleme a la ligne 18 ($s)
quiqou55

quiqou55 Le 28 mars 2016 à 17:41

Ah oui j'ai oublié le ; a la fin de la ligne 16 dsl 😉
Sh0kaP1k

Sh0kaP1k Le 28 mars 2016 à 19:42

Ok ca marche mais quand je clique sur le profil ca ne mamene pas vrs sa page.
quiqou55

quiqou55 Le 28 mars 2016 à 20:00

Il faut que tu adapte en fonction du nom de ta page 😀
Sh0kaP1k

Sh0kaP1k Le 28 mars 2016 à 21:06

Ok c'est bon ca arche nickel

MERCI MERCI MERCI !!!
M69-74

M69-74 Le 1 avril 2016 à 20:26 (Édité le 2 avril 2016 à 21:37)

Bonjour, quand je met rien, cela m'affiche tout les profils, comment puis-je remédier a cela et faire en sorte que ca affiche une erreur ?
Merci de votre réponse
julienb

julienb Le 4 avril 2016 à 06:47 (Édité le 4 avril 2016 à 06:48)

Doc PHP ISSETSalut Marius, pour ton soucis il faut qu'avant d'effectuer ta requète, tu vérifies que le contenu de ta recherche n'est pas vide. En supposant que tu as un formulaire avec un champ de recherche qui s'appelle search, il faudrait un code dans ce genre:
$search = htmlspecialchars($_POST['search']);
if(!isset($search)){ //
echo "erreur, une recherche ne peut pas être vide";
}else{
//connexion base de données
//requète
//...
}
La fonction isset() vérifie si la chaine de caractères passée en paramètre contient une valeur ou non. Tu peux aussi utiliser empty() qui vérifie si la chaine passée est vide. 
 Doc PHP Isset
Doc PHP Empty
pain

pain Le 4 février 2020 à 16:25

Salut tous le monde je sais que le topic est vieux et j'ai le même problème que j'arrive pas à régler. Quelqu'un pourrait m'aider???
Profil introuvable

Profil introuvable Le 20 mars 2020 à 18:06

Hello @pain,

Crée un nouveau topic pour obtenir de l'aide 😉

Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte