PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 18-08-2016 13:33:34

jenny89
Membre
Inscription : 18-08-2016
Messages : 3

Afficher un résultat d'après une liste déroulante

Bonjour,

Je réalise un site touristique.

J'ai créé un formulaire avec différents choix.

J'aimerais qu'une fois que l'internaute ait choisi la spécialité du bar voulu, ma deuxième page affiche la liste de bars avec cette spécialité (appelée dans le code "categorie").

J'ai essayé différents codes. Pour l'instant, la deuxième page m'affiche tous les bars de ma base de données.

Code du formulaire :


<h1>Liste des types de spécialités</h1>
 
    <form method="post" action="liste_bar.php" name="liste_bar"/>
      Choisissez un type de spécialité : <br />
        <select name="categorie">

<?php
//connexion au fichier des parametres php
  include('connexion.php');
    $requete_categorie="
      SELECT *
      FROM categorie"
;
        $resultat_categorie=mysql_query($requete_categorie,$connexion);
        while($categorie=mysql_fetch_array($resultat_categorie))
          {
            echo "<option value=";
            echo $categorie['id_categorie'];
            echo ">";
            echo $categorie['nom'];
            echo "</option>";
          }
         
?>
  </select>
  <br />
  <input name="ok" type="submit">
  </form>
</body>
</html>

 



Code de la page de résultat :


<html>
  <head>

  <title>Liste de Bars</title>

  </head>
  <body>


   
<?php
$categorie=$_POST['categorie'];
 
include('connexion.php');

  $requete_liste_bar="
    SELECT bar.nom, bar.adresse, bar.telephone, categorie.nom, prix.niveau
    FROM bar, categorie, posseder, prix
    WHERE posseder.fk_id_categorie= $categorie
    and bar.fk_id_prix= prix.id_prix
    ORDER BY bar.nom"
;
   
  $resultat_liste_bar=mysql_query($requete_liste_bar,$connexion);
     
  while($bar=mysql_fetch_array($resultat_liste_bar))
    {
      echo"<TR><TD>";
      echo $bar['nom'];
      echo"</TD><TD>";
      echo $bar['adresse'];
      echo"</TD><TD>";
      echo $bar['telephone'];
      echo"</TD><TD>";
      echo $bar['niveau'];
        }
 
?>

  </body>
  </html>

 


Connaissez-vous des bons tutos pour réaliser cela ?

Je vous remercie par avance.

Jennifer.


Hors ligne

#2 18-08-2016 15:49:20

ManicoW
Cowrespondant
Lieu : Tours
Inscription : 08-05-2009
Messages : 190
Site Web

Re : Afficher un résultat d'après une liste déroulante

Bonjour,

Avant la piste pour la solution, quelques remarques :

- Si possible utiliser plutot les fonctions mysqli_* que mysql_* qui sont maintenant dépréciés (oui le site n'est pas à jour là dessus sad )
- Il est important de vérifier le contenu de $categorie avant de l'utiliser dans une requête SQL, car là ça pourrait être n'importe quoi, y compris une injection visant a supprimer toute la base hmm
- Il doit manquer des guillemets dans le html des options du code du formulaire, mais bon pour tester ça ira smile

Concernant la solution, je pense que cela vient de la requête SQL list_bar, car elle fait appel à 4 tables mais n'en jointe que 3, et encore pas toutes entre elles. Ainsi on a une clause where sur le fk_id_categorie de posseder, mais rien qui ne relie cette table à la table bar. Du coup il n'y a pas limitation sur la sortie de la table bar, et le résultat contient toute la table...

@+


la v2, c'est tabou, on en viendra tous a bout

Hors ligne

#3 19-08-2016 08:36:26

jenny89
Membre
Inscription : 18-08-2016
Messages : 3

Re : Afficher un résultat d'après une liste déroulante

Bonjour,

Oui, je sais que mysql est dépassé. Mais, je débute donc j'ai préféré l'utiliser, car je le connais déjà un peu.

Pour la table bar et categorie, elles sont reliées par une table intermédiaire "posseder", où j'ai mis fk_id_bar et fk_id_categorie.

Hors ligne

#4 19-08-2016 11:59:30

ManicoW
Cowrespondant
Lieu : Tours
Inscription : 08-05-2009
Messages : 190
Site Web

Re : Afficher un résultat d'après une liste déroulante

Mais dans la requête de filtrage, on ne voit point de fk_id_bar smile


$requete_liste_bar="
    SELECT bar.nom, bar.adresse, bar.telephone, categorie.nom, prix.niveau
    FROM bar, categorie, posseder, prix
    WHERE posseder.fk_id_categorie= $categorie
    AND posseder.fk_id_bar=bar.id_bar
    AND bar.fk_id_prix= prix.id_prix
    ORDER BY bar.nom"
;
 

Devrait donner de meilleurs résultats (en supposant que la colonne id_bar soit bien celle utilisée dans la table bar).

Tant qu'on y est, pour avoir un truc un peu moins violent à lire, on pourrait peut être utiliser des alias pour les tables, ça serait "plus court" (après pour la lisibilité, chacun fait comme il veut) :


$requete_liste_bar="
    SELECT b.nom, b.adresse, b.telephone, c.nom, px.niveau
    FROM bar as b, categorie as c, posseder as po, prix as px
    WHERE po.fk_id_categorie = $categorie
    AND po.fk_id_bar = b.id_bar
    AND b.fk_id_prix = px.id_prix
    ORDER BY bar.nom"
;
 

Ceci dit, là on ne sera pas non plus bon, il manque la liaison avec la table categorie. Peut être quelque chose comme :


$requete_liste_bar="
    SELECT b.nom, b.adresse, b.telephone, c.nom, px.niveau
    FROM bar as b, categorie as c, posseder as po, prix as px
    WHERE po.fk_id_categorie = $categorie
    AND po.fk_id_bar = b.id_bar
    AND po.fk_id_categorie = c.id_categorie
    AND b.fk_id_prix = px.id_prix
    ORDER BY bar.nom"
;
 

Attention, je n'ai pas cherché à faire une requête optimisée ou fiable, après tout, j'ai faim ! smile

@+


la v2, c'est tabou, on en viendra tous a bout

Hors ligne

#5 19-08-2016 23:07:03

jenny89
Membre
Inscription : 18-08-2016
Messages : 3

Re : Afficher un résultat d'après une liste déroulante

re,

Ta dernière requête fonctionne. Merci beaucoup.

Tu avais faim, mais tu as été plus efficace que moi. Ca fait une semaine et demie que j'essaye des codes.

Bonne soirée

Hors ligne

Pied de page des forums