8768 sujets

Développement web côté serveur, CMS

Bonsoir,

J'ouvre ce post, car débutant dans le php, je ne sais pas quoi chercher et quels fonctions utiliser pour créer ma requête et ainsi afficher des articles qui aurait des mots clés identiques à ceux de l'article consulté. De nombreux site d'actualité l'utilise, mais ce sont des pros qui développe leurs codes et je ne sais pas par où commencer.

Pourriez-vous m'aider à orienter mes recherches ? (PS : je n'utilise pas Wordpress, donc je ne peux pas utiliser leur code, enfin je crois !)

Merci d'avoir prit quelques instant pour vous arrêtez sur mon post.
Bonne soirée
Salut,

Tu veux faire une recherche sur le contenu de ton article ou bien sur une liste de mots-clés que tu as déjà mis en correspondance avec ton article ?
Il faudrait que tu affiches ici la structure de ta base de données ou du moins celle de ta table contenant tes articles.
L'idée si tu veux faire une recherche sur des termes contenus dans tes articles est d'utiliser une recherche "FULLTEXT" :
SELECT *
FROM articles
WHERE MATCH(content)
AGAINST ('recherche');
MatthieuR a écrit :
Salut,

Tu veux faire une recherche sur le contenu de ton article ou bien sur une liste de mots-clés que tu as déjà mis en correspondance avec ton article ?
[/code]


Je pensais utiliser les mots clés que j'ai déjà mis dans ma table, mais ce n'est peut-être pas la meilleure solution, sur la pertinence de la recherche ?

La structure de ma BDD
lien
MatthieuR a écrit :

L'idée si tu veux faire une recherche sur des termes contenus dans tes articles est d'utiliser une recherche "FULLTEXT" :
SELECT *
FROM articles
WHERE MATCH(content)
AGAINST ('recherche');


Voici où j'en suis mais je ne comprend pas bien le code !!
dans ton exemple, content peut-être remplacer par le titre et les mots clés de l'article en cours ?
et recherche, les mots équivalents (mes mots clés) au contenu de l'article ?


<?php 

// Déclaration des paramètres de connexion
$host = "*********";
$user = "************";
$passwd  = "******";

try
{
$bdd = new PDO("mysql:host=$host; dbname=****************", $user, $passwd, array (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch (PDOException $e)
{
  echo('Erreur : ' . $e->getMessage());
}
$id = preg_replace('/([^a-z0-9]+)/i', '-', strtolower($_GET['id'])); 
$sth2 = $bdd->query('SELECT * FROM `liste-articles` WHERE MATCH(`titre`,`keywords`) AGAINST(`keywords`) ORDER BY `id` LIMIT 3');
$tab = $sth2->execute(array('id' => $id));
?>

<?php 
while($tab = $sth2->fetch(PDO::FETCH_ASSOC))
{
?>
<li>
<img src="<?php echo $tab['images']; ?>" alt="<?php echo $tab['titre']; ?>" data-pin-nopin="true">
<h3><?php echo $tab['titre']; ?></h3>
<p><a href="actualites-dietetiques.php?id=<?php echo $tab['id']; ?>-<?php echo $tab['url']; ?>">Lire l'article</a></p>
</li>
<?php
}
?>
MatthieuR a écrit :
Salut,
SELECT *
FROM articles
WHERE MATCH(content)
AGAINST ('recherche');


Après quelques recherches, j'en suis arrivé à cette ligne de code


try
{
$bdd = new PDO("mysql:host=$host; dbname=********", $user, $passwd, array (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch (PDOException $e)
{
  echo('Erreur : ' . $e->getMessage());
}
$id = preg_replace('/([^a-z0-9]+)/i', '-', strtolower($_GET['id']));
$sth2 = $bdd->query('SELECT * FROM `liste-articles` WHERE MATCH(titre,intro,meta_keywords) AGAINST(`meta_keywords` IN BOOLEAN MODE) ORDER BY `id` LIMIT 3');
$tab = $sth2->execute(array('id' => $id));


Cependant, ma page web affiche une page blanche, depuis que j'ai inséré cette ligne de requête. Avez-vous une idée? sur le site suivant : lien, ils indiquaient des "+" devant les mots recherchés.

De plus dans ma BDD, et dans ma colonne meta_keywords, les mots sont séparés par des virgules, est-ce que cela peut être la raison du dysfonctionnement ?

merci de votre aide
Salut,
Je ne suis pas spécialiste mais les "+" et les "-" permettent de filtrer sur certains mots.
Par exemple si on veut chercher tous les enregistrements ne contenant "chien" mais pas "bulldog" on aurait ça :
SELECT *
FROM articles
WHERE MATCH(keywords)
AGAINST ('chien -bulldog');

Y'a un truc bizarre dans ton code, c'est ton AGAINST. Tu recherches vraiment le mot "meta_keywords" ? Et par ailleurs ça ne peut pas fonctionner car cette recherche est entouré de "back ticks" et il faut des guillemets (simples ou doubles, mais des guillements). MySQL doit considérer ce dernier comme une colonne...
Une page blanche c'est bizarre aussi... Aucune erreur n'est affichée ?
MatthieuR a écrit :
Salut,
Y'a un truc bizarre dans ton code, c'est ton AGAINST. Tu recherches vraiment le mot "meta_keywords" ? Et par ailleurs ça ne peut pas fonctionner car cette recherche est entouré de "back ticks" et il faut des guillemets (simples ou doubles, mais des guillements). MySQL doit considérer ce dernier comme une colonne...
Une page blanche c'est bizarre aussi... Aucune erreur n'est affichée ?


Non je souhaites rechercher dans ma colonne meta_keywords qui se trouve dans ma BDD.
J'ai essayé en écrivant ainsi : AGAINT ('+$meta_keywords') mais cela n'a pas fonctionné. Je pense que de la façon dont je l'écrit je recherche me mot meta_keywords et non les données qui se trouve dans cette colonne.
Je pense que tu n'as pas saisi un truc : il faut dans tes parenthèses de AGAINST() les termes recherchés entourés de guillemets (des doubles dans ton cas et pas des "apostrophes à l'envers" Smiley smile ).
Si tu cherches dans tes colonnes "meta_keywords", "titre" et "intro" le mot-clé "canard" ta requête ressemblera à ça :
$sth2 = $bdd->query('SELECT * FROM liste-articles WHERE MATCH(titre,intro,meta_keywords) AGAINST("canard") ORDER BY id LIMIT 3');

Sans doute pas besoin de "backtick" autour du nom de tes colonnes, mais je crois que ça dépend de la version de MySql mpis en place sur le serveur...
Tu avais bien saisi ça ou pas ?
Modifié par MatthieuR (20 May 2016 - 09:42)
MatthieuR a écrit :
Je pense que tu n'as pas saisi un truc : il faut dans tes parenthèses de AGAINST() les termes recherchés entourés de guillemets (des doubles dans ton cas et pas des "apostrophes à l'envers" Smiley smile ).
Si tu cherches dans tes colonnes "meta_keywords", "titre" et "intro" le mot-clé "canard" ta requête ressemblera à ça :
$sth2 = $bdd-&gt;query('SELECT * FROM liste-articles WHERE MATCH(titre,intro,meta_keywords) AGAINST("canard") ORDER BY id LIMIT 3');

Sans doute pas besoin de "backtick" autour du nom de tes colonnes, mais je crois que ça dépend de la version de MySql mpis en place sur le serveur...
Tu avais bien saisi ça ou pas ?


Merci de ta réponse, j'ai bien compris qu'entre les parenthèses d'AGAINST, il fallait les mots recherchés, cependant je n'ai pas envie d'écrire directement "canard, chien, chat,..", mais faire une requête permettant de générer selon les articles (titre,intro, meta_keywords), les mots qui se trouve dans la colonne de ma BDD. Mon problème est l'écriture de cette requête dans AGAINST .

AGAINST("$meta_keywords")
comment dans ces parenthèses, refaire une requête pour appeler les mots?
dafid5 a écrit :
cependant je n'ai pas envie d'écrire directement "canard, chien, chat,..", mais faire une requête permettant de générer selon les articles (titre,intro, meta_keywords), les mots qui se trouve dans la colonne de ma BDD. Mon problème est l'écriture de cette requête dans AGAINST

Alors là moi pas comprendre ce que tu veux faire Smiley murf
Si dans un champ de recherche (un input de type text par exemple) l'utilisateur saisie son terme de recherché (canard par exemple) sa donnera ça :
$sth2 = $bdd-&gt;query('SELECT * FROM liste-articles WHERE MATCH(titre,intro,meta_keywords) AGAINST("' . $_POST['recherche'] . '") ORDER BY id LIMIT 3');

Bien sûr en sécurisant ta variable $_POST contre tous les soucis d'envoi de données, c'est juste pour le principe...

Si tu veux faire autre chose, je ne comprends pas ta demande...
MatthieuR a écrit :

Alors là moi pas comprendre ce que tu veux faire Smiley murf
Si dans un champ de recherche (un input de type text par exemple) l'utilisateur saisie son terme de recherché (canard par exemple) sa donnera ça :
$sth2 = $bdd-&amp;gt;query('SELECT * FROM liste-articles WHERE MATCH(titre,intro,meta_keywords) AGAINST("' . $_POST['recherche'] . '") ORDER BY id LIMIT 3');

Bien sûr en sécurisant ta variable $_POST contre tous les soucis d'envoi de données, c'est juste pour le principe...

Si tu veux faire autre chose, je ne comprends pas ta demande...


Effectivement, je n'ai pas du bien m'exprimer ou indiquer ce que je voulais faire.
En suivant ce lien, en bas, il y a les articles sur le même thème. SUR WORDPRESS il appelle ça des RELATED POSTS.
C'est ce que je voulais arrivé à faire, à l'aide des mots clés dans la BDD qui serait similaire à ceux de l'article en cours de lecture.
Modifié par dafid5 (21 May 2016 - 15:43)