Recherches avec FULLTEXT

Répondre
jackbocar
le 29/06/2013 à 17:50
jackbocar
Bonjour,

J'aimerais réaliser une recherche par NOM et TITRE dans une bibliothèque, avec se script (s'il est correctement écrit), mais je ne vois pas comment réaliser le formulaire ?
Quel argument dois-je y mettre ?

Merci pour votre aide
Jack Bocar

<?php
$mysql_hostname = 'localhost';
$mysql_username = 'xxxxxxxxxxxx';
$mysql_password = 'xxxxxxxxxxxxxxxx';
$mysql_dbname = 'xxxxxxxxxxxxxxx';

try {
$dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql=("SELECT * FROM librairies_sarch WHERE lib_nom = 'User specified name'
OR lib_nom LIKE '%keyword%'
OR lib_titre LIKE '%keyword%'");

foreach ($dbh->query($sql) as $row) {
print '<span>'.$row['nom'].'</span><br />';
print '<span>'.$row['titre'].'</span><br />';
}
$dbh = null;
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
LupusMic
le 30/06/2013 à 03:27
LupusMic
Si je comprends bien, tu veux utiliser les index FULLTEXT. Dans ce cas, il faut utiliser la syntaxe ad hoc.

En ce qui concerne le formulaire, un simple input de type 'text' suffira.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
jackbocar
le 30/06/2013 à 17:03
jackbocar
Bonjour,

Merci LupusMic pour tes conseils, mais cela ne fonctionne pas. Mon script doit être nul, mal construit ou je ne sais pas. Lorsque je mets un nom, il me sort une liste de noms différant, pas la liste avec le nom demandé.


J'ai pris exemple sur les modèles proposés par MYSQL, et j'arrive à un résultat différent,
La recherche reste la même, le NOM et le TITRE, je choisis en plus un critère qui se trouve dans le titre, exemple CARTULAIRE.

<?php
require ('/mysql_hostname.php');

try {
$dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql=("SELECT * FROM bibliotheque WHERE MATCH (titre,nom) AGAINST ('cartulaire')");

foreach ($dbh->query($sql) as $row) {
print '<p><span>'.$row['nom'].'</span><br />';
print '<span>'.$row['titre'].'</span> - <span>'.$row['id'].'</span></p>';
}
$dbh = null;
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>



La liste sort complète, le trie fonctionne très bien avec DESC ou ASC, grâce au SELECT *, je peux ajourer sans problème un autre item du style ID.

Maintenant, quelqu'un peut me dire comment faire une surbrillance sur un mot ou des mots de la liste.

J'ai trouvé ceci sur le Net: HighlightComponent
Je ne sais pas comment le passer en argument.

D'autre part, est-il possible de choisir d'afficher une liste de NOM, en donnant comme argument la lettre A, tous les NOMS qui commencent par A et seulement cela ?

Je l'ai déjà fait avec REGEXP '^A', existe-il un autre moyen ?

Merci de votre aide
Jack Bocar
LupusMic
le 02/07/2013 à 13:38
LupusMic
Mais au final, ça fait ce que tu veux ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
jackbocar
le 02/07/2013 à 16:18
jackbocar
Bonjour,

Oui, ça fait ce que je veux. Mis à part le grand nombre de fichiers alphabétiques (18).

Je n'ai toujours pas trouvé la solution pour afficher en surbrillance le nom choisit.

As-tu une idée de script qui fonctionne avec une recherche sur deux critères ?

Merci
Jack Bocar
LupusMic
le 03/07/2013 à 11:16
LupusMic
Pour le highlight, tu peux utiliser strtr :

<?php
function highlight($text, $word_color_pairs)
{
$tr_table = array();
foreach($word_color_pairs as $word => $color)
$tr_table[$word] = sprintf('<span style=\'color: %s\'>%s</span>'
, htmlentities($color, ENT_QUOTES)
, htmlentities($word, ENT_NOQUOTES)
);

return strtr($text, $tr_table);
}

echo highlight('ceci est un texte avec des mots', array('ceci' => 'blue', 'un' => 'red'));
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
jackbocar
le 04/07/2013 à 08:07
jackbocar
Bonjour LupusMic

Merci pour ton code, très efficace pour un texte.
Mais, ce n’est pas ce que je recherche. Ce que je recherche, c’est un changement de couleur d’un mot à la sortie d’une base de données.
J’ai réalisé ce petit code, j’ai fait quelques essais, visiblement il fonctionne en local. Analyses-le, et dis-moi s’il est bien conçu, ou plutôt s’il est viable.
Si tu as une idée pour son amélioration, merci de corriger ce code.

Jack Bocar

<?php
function couleur($chaine){
$chaine = str_replace
(array('Paris', 'Londres')

, array ('<span style="font-weight:bolder; color: #ff0000;">Paris</span>'
, '<span style="font-weight:bolder; color: #ff0000;">Londre</span>'
)
, $chaine
);
return $chaine;
}
?>
LupusMic
le 04/07/2013 à 10:30
LupusMic
En fait, tu fais ce que je fais, mais tu enlève la possibilité de le faire pour n'importe quel mot. En fait, si tu veux adapter tous le style, tu peux modifier mon code comme suit :
<?php
function highlight($text, $word_style_pairs)
{
$tr_table = array();
foreach($word_style_pairs as $word => $style)
$tr_table[$word] = sprintf('<span style=\'%s\'>%s</span>'
, htmlentities($style, ENT_QUOTES)
, htmlentities($word, ENT_NOQUOTES)
);

return strtr($text, $tr_table);
}

echo highlight('De Paris à Londres', array('Paris' => 'font-weight:bolder; color: #ff0000;', 'Londres' => 'font-weight:bolder; color: #ff0000;'));


Évidement, utiliser une classe HTML serait plus propre que de répéter le même style un peu partout.

Ce que je recherche, c’est un changement de couleur d’un mot à la sortie d’une base de données.


Je ne comprends pas ta phrase. Ce que je t'ai proposé, c'est une fonction qui prend une chaîne, et la manipule pour justement donner une couleur à certains mots. Les instructions étant données en second paramètre de la fonction.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
jackbocar
le 04/07/2013 à 16:30
jackbocar
Bonjour,
Je comprends ce que tu me dis, mais j'ai essayé de m'en servir comme d'une fonction, et je n'y suis pas parvenu.
Par exemple, si je veux que ta fonction soit appelée il faut que je puisse la placer ici :


<?php
include './_require/mysql_hostname.php';

try {
$dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

function highlight($text, $word_color_pairs)
{
$tr_table = array();
foreach($word_color_pairs as $word => $color)
$tr_table[$word] = sprintf('<span style=\'color: %s\'>%s</span>'
, htmlentities($color, ENT_QUOTES)
, htmlentities($word, ENT_NOQUOTES)
);

return strtr($text, $tr_table);
}

$sql = "SELECT * FROM voyage";
foreach ($dbh->query($sql) as $row)
{
print '<>'.$row['locomotion'].'<br />'.$row['date'].'<p>'.highlight($row['resumer']).''.$row['impressions'].'</p>';
}
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>


Je ne comprends pas commement faire pour utiliser ce dode ? Comment le placer avec la variable '.$_row['resumer'].', puisque c'est dans le résumer qu'il y a le nom des villes.
<?php
echo highlight('De Paris à Londres', array('Paris' => 'font-weight:bolder; color: #ff0000;', 'Londres' => 'font-weight:bolder; color: #ff0000;'));
?>


Comment j'utilise ton code avec la variable - '.$_row['resumer'].' - pour obtenir ce résultat ?
<p>Départ de Paris, avec mon camping-car, j'ai pris le bateau à Calais direction Douvres.</p>

<p>Mon voyage avait pour but une remise à niveau de mon anglais, c'est donc tout naturellement que j'ai choisis l'Angleterre et ma
première étape fut <span style="font-weight:bolder; color: #ff0000;">Londres</span>.</p>

Merci pour ta patience, comme je le dis toujours, il vaut mieux une explication et un bon exemple pour arriver à faire comprendre à certaines personnes comme moi, les arcanes de PHP.
LupusMic
le 04/07/2013 à 16:42
LupusMic
Ce n'est pas un problème de PHP ;)

En fait, tu voudrais mettre en exergue les noms des villes ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre
LoadingChargement en cours