Page 1 sur 1

afficher l'intégralité d'une donnée recherchée

Posté : 28 juin 2011, 11:16
par malcolm1482
bonjour tout le monde je tiens à remercier Moogli et Mazarini pour leur aide précieuse et leur réactivité.

Je poste une nouvelle question qui n'est pas très simple à formuler.
voila j'ai mis en place un moteur de recherche.
Ce moteur de recherche me donne mes résultats sous forme de résumé.
Mon but serait de pouvoir créer un bouton à chaque ligne de résultat de ma recherche qui me permette d'obtenir toutes les données de ma recherche (un bouton genre "+" ou "plus de détails"...)


Par exemple
_____________________
Il y a 2 Résultats :

Résultat 1
nom : Résultat 1
résumé : résumé de résultat 1

Plus de détails

Résultat 2
nom : Résultat 2
résumé : résumé de résultat 2

Plus de détails
_______________________
Ma question est de savoir si c'est possible et si oui comment.

Je me demande s'il ne faut pas faire un lien vers une autre page (par exemple détails.php) qui dirait SELECT $recherche FROM ma_table.
Cependant $recherche est sur une autre page (page catalogue.php)

ai-je tord ai-je raison? Merci de votre aide

Re: afficher l'intégralité d'une donnée recherchée

Posté : 28 juin 2011, 11:22
par Mazarini
Bonjour,

2 solutions :
- ajouter un paramètre qui indique ce que tu dois faire (saisie critère, affichage liste, affichage détail...)
- faire une page spécifique

Je te conseille de garder les critères de recherche dans une session ou un cookie pour pouvoir revenir de la page détail à la page résultats de recherche.

Re: afficher l'intégralité d'une donnée recherchée

Posté : 28 juin 2011, 12:17
par malcolm1482
bonjour et merci Mazarini

Je viens de lire ta réponse

Seulement un cookie n'est ce pas "dangereux". en effet, certains antivirus les bloquent. Et si je mise tout dessus je risque de ne pas pouvoir réaliser ce que je souhaite faire?

enfin concernant ta réponse
- ajouter un paramètre qui indique ce que tu dois faire (saisie critère, affichage liste, affichage détail...)
- faire une page spécifique
Je ne comprend pas trop. Y'a t'il un tutoriel ou un topic qui traite du sujet ?

Merci d'avance

Re: afficher l'intégralité d'une donnée recherchée

Posté : 28 juin 2011, 13:34
par macgawel
enfin concernant ta réponse
- ajouter un paramètre qui indique ce que tu dois faire (saisie critère, affichage liste, affichage détail...)
- faire une page spécifique
Je ne comprend pas trop. Y'a t'il un tutoriel ou un topic qui traite du sujet ?
En fait, ça dépend un peu de plusieurs choses :
1. Ton site. Comment il est architecturé, entre autres.
2. Quels sont les résultats ?

- Un cas simple, c'est un site de news/blog. Dans ce genre de cas, chaque article a sa "page" propre. Du coup, il "suffit" de construire le lien "+" pour qu'il pointe vers cette page.

- Une autre possibilité, c'est effectivement de passer par une page detail.php. Là,ça peut vite devenir complexe - surtout si au départ tu n'as pas prévu le coup...
L'idéal, c'est de construire ton lien avec en paramètres le(s) mot(s) recherché(s) et le résultat.
Par exemple : detail.php?recherche=toto&result=1
L'avantage de passer la recherche, c'est que tu peux surligner les mots pertinents.
Après, pour la façon de passer le resultat, c'est difficile à dire sans plus d'indication. L'idéal - histoire d'éviter de repasser une requête SQL - c'est de passer l'ID de l'article (il te suffira alors de faire une requête pour le sélectioner).

- Une troisième possibilité - à réserver aux articles courts - c'est de tricher. Ta page résultat renvoie tous les articles dans leur intégralité, avec du CSS tu n'affiches que X lignes.
Et tu utilises CSS (+ Javascript) pour afficher le reste au clic.
L'avantage, c'est que tout est géré dans cette page, l'inconvénient c'est que tu envoies tous les articles complets (ça peut vite faire lourd, même si avec la généralisation du haut débit ce n'est plus forcément bloquant)

Re: afficher l'intégralité d'une donnée recherchée

Posté : 28 juin 2011, 18:20
par malcolm1482
Merci pour tes conseils Macgawel.

Cependant tu m'effraie un peu j’espère que c'est pas grave docteur.
Mon projet est un catalogue de données que je teste en ce moment sur une table sql http://www.megaupload.com/?d=TT7NWHPB

je te joins le code php de ma page en espérant qu'il ya un moyen pour gérer cela
<?php
mysql_connect("localhost", "root", ""); //connexion à la BDD
mysql_select_db("test");
if (isset($_POST['rechercher'])) //si on a validé le formulaire
{
$recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); //sécurisation des variables
$mode = mysql_real_escape_string(htmlspecialchars($_POST['mode']));
if ($mode == "tous_les_mots")
{
$and_ou_or = 'AND'; //on utilisera AND dans la boucle
}
else
{
$and_ou_or = 'OR'; //on utilisera OR dans la boucle
}
if ($mode == "expression_exacte") //si le mode de recherche est par expression exacte
{
$selection_recherche = mysql_query("SELECT * FROM cp_insee WHERE Commune LIKE '%$recherche%' ");
}
else //si le mode de recherche n'est pas par expression exacte
{
$mots = explode(" ", $recherche); //séparation des mots
$nombre_mots = count ($mots); //comptage du nombre de mots
$valeur_requete = '';
for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en incrémentant à chaque fois le nombre de mots
{
$valeur_requete .= '' . $and_ou_or . ' Commune LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; //modification de la variable $valeur_requete
}
$valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou de OR au début de la boucle
$selection_recherche = mysql_query("SELECT * FROM cp_insee WHERE $valeur_requete "); //requête contenant le résultat de la boucle
}
$nombre_resultats = mysql_num_rows($selection_recherche); //comptage du nombre d'entrées sélectionnées par la recherche
if ($nombre_resultats == 0) //s'il n'y a pas de résultat
{
echo 'Il n y a aucun résultat correspondant effectuez une nouvelle recherche. <a href="catalogue.php">Recommencer</a>';
}
else //il y a au moins un résultat

{
echo "<font face='Verdana' size='2'><br /> Nombre de résultats : " . $nombre_resultats . "<font face='Verdana' size='2'><br />"; //nombre de résultats
echo'<br/><a href="catalogue.php">Recommencer</a><br/>';
while($resultats = mysql_fetch_array($selection_recherche) ) //boucle affichant les résultats

{
//mettre le bouton ici pour pouvoir développer la metadata
echo 
'<br /><strong>Nom de Commune : </strong> ' . $resultats['Commune'] . 
'<br /><strong>Code INSEE :</strong> ' . $resultats['INSEE'] . 
'<br/><strong>Code Postal :</strong> ' . $resultats['CP'] . '<br /><strong></strong><br /> ';
}
echo '<a href="catalogue.php">Recommencer</a>';
}
}
else //si on n'a pas validé le formulaire, on l'affiche
{
?>
<style type="text/css">
<!--
.Style1 {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 10px;
}
-->
</style>

<form action="catalogue.php" method="post" class="Style1">
  <div align="center">
    <blockquote>
      <blockquote>
        <blockquote>
          <blockquote>
            <blockquote>
              <blockquote>
                <blockquote>
                  <p align="center">Votre recherche :
                    <input name="recherche" type="text" size="50" />
                    <br />
                    Votre mode de recherche :
                    <select name="mode">
                      <option value="expression_exacte">Expression exacte</option>
                      <option value="tous_les_mots">Tous les mots</option>
                      <option value="un_mot">Au moins un mot</option>
                                               </select>
                                                                                                                        </p>
                </blockquote>
              </blockquote>
            </blockquote>
          </blockquote>
        </blockquote>
      </blockquote>
    </blockquote>
    <p align="center">
      <input type="submit" value="Rechercher" name="rechercher" />
        </p>
  </div>
</form>
<div align="center"><span class="Style1">
  <?php
}
mysql_close(); //déconnexion de la BDD
?>
</span></div>
Voila si tu as besoin de quoi que ce soit n'hésite pas j'espère que mon objectif n'est pas utopique.

Re: afficher l'intégralité d'une donnée recherchée

Posté : 30 juin 2011, 17:49
par macgawel
1. Rien à voir, mais tu devrais revoir ton code HTML, il est un peu...différent :mrgreen:
- c'est quoi tous ces <blockquote> ?
- evite de mettre du style directement dans les balises (le align=), utilise plutôt le CSS.
- profite-en pour déporter le CSS dans une feuille de style.

2. Pour construire ta "requête multiple", au lieu de faire ta boucle, pourquoi tu n'utilises pas plutôt un implode() ?
$mots = explode(" ", $recherche); //séparation des mots
$valeur_requete = implode( " ".$and_ou_or." ", $mots); //regroupement des mots
3. (pour ton problème de départ)
En fait, tu affiches les informations de base de tes communes et tu voudrais qu'un clic sur "details" (ou autre, hein) te donne les informations complémentaires, c'est ça ?

Solution 1 :
Une page detail.php qui va récupérer et afficher les informations de la commune, et un lien vers detail.php?insee=...
Dans ton code actuel (j'utiliserais plutôt une liste de définition, mais c'est une question de goûts) :
echo '<dl>';
echo '<dt>Nom de Commune :</dt><dd>' . $resultats['Commune'] .'</dd>';
echo '<dt>Code INSEE :</dt><dd>' . $resultats['INSEE'] .'</dd>';
echo '<dt>Code Postal :</dt><dd>' . $resultats['CP'] . '</dd> ';
echo '<dt><a href="detail.php?insee='.$resultats['INSEE'].'" title="details de la commune">Details</a></dt>';
echo '</dl>';
Et dans la page detail.php (exemple très basique à améliorer/sécuriser) :
<?php
mysql_connect("localhost", "root", ""); //connexion à la BDD
mysql_select_db("test");
$insee = $_GET['insee'];
$requete = mysql_query("SELECT * FROM cp_insee WHERE insee = $insee");
$resultats = mysql_fetch_array ($requete);
print_r($resultats);
Solution 2 :
Cacher les détails, et les afficher via du JS.
Exemple utilisant la bibliothèque jQuery (parce que j'en avais un sous le coude, et la flemme d'en refaire un :oops: ) :
- Partie PHP :
echo '<dl>';
echo '<dt>Nom de Commune :</dt><dd>' . $resultats['Commune'] .'</dd>';
echo '<dt>Code INSEE :</dt><dd>' . $resultats['INSEE'] .'</dd>';
echo '<dt>Code Postal :</dt><dd>' . $resultats['CP'] . '</dd> ';
echo '<dt><a href="#insee='.$resultats['INSEE'].'" title="details de la commune">Details</a></dt>';
echo '<dd id="insee'.$resultats['INSEE'].'" class="details">'.$resultats[LesChampsQueTuVeuxAfficherAvecUneEventuelleMisEnForme].'</dd>';
echo '</dl>';
Partie CSS : .details {display:none;}
Il faudra encore rajouter à ta page les scripts JS qui vont bien.
Ici :
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
       $('a').click(function(){
                $('#cp59000').toggle();
        });
});
</script>

[Edit] Après, il faudrait plus d'informations pour choisir la solution la plus adaptée.
En gros, la première (une page détail) est plus adaptée s'il y a beaucoup d'informations et/ou s'i tu comptes fournir un autre moyen d'accéder aux détails des communes (auquel cas ta page détail sera réutilisable).
La deuxième est mieux si l'utilisateur est amené à consulter les détails de plusieurs communes à la suite...