Requête sur 2 tables

Eléphant du PHP | 72 Messages

27 mars 2006, 10:16

Bonjour bonjour ! :D

Voilà j'ai un souci de requête. La suivante fonctionne bien, je fais une recherche sur 3 listes déroulantes à partir de la même table, tb_evenements (avec les champs, id_evenement, date, ville, departement)
<form name="form1" method="post" action="resultat.php">
        P&eacute;riode 
        <select name="num_mois" id="select1">
          <option value="1">Janvier</option>
          <option value="2">Février</option>
          <option value="3">Mars</option>
          <option value="4">Avril 
          <option value="5">Mai</option>
          <option value="6">Juin</option>
          <option value="7">Juillet</option>
          <option value="8">Août</option>
          <option value="9">Septembre</option>
          <option value="10">Octobre</option>
          <option value="11">Novembre</option>
          <option value="12">Décembre</option>
        </select>
        D&eacute;partement 
        <select name="departement2" id="select2">
          <?php
do {  
?>
          <option value="<?php echo $row_rs2departement['departement']?>"><?php echo $row_rs2departement['departement']?></option>
          <?php
} while ($row_rs2departement = mysql_fetch_assoc($rs2departement));
  $rows = mysql_num_rows($rs2departement);
  if($rows > 0) {
      mysql_data_seek($rs2departement, 0);
	  $row_rs2departement = mysql_fetch_assoc($rs2departement);
  }
?>
        </select>
        Th&egrave;me 
        <select name="evenement2" id="evenement2"> 
  <option value="">Tous les événements</option> 
  <?php 
    while ($row_rs2evenement = mysql_fetch_assoc($rs2evenement)) {   
  ?> 
      <option><?php echo $row_rs2evenement['evenement']?></option> 
   
  <?php 
    } 
 
?> 
</select> 

        <input type="submit" name="Submit2" value="Envoyer">
      </form>
	  
      
      <form name="form3" method="post" action="">
      </form>
    </td>
  </tr>
</table>
<table width="600" height="103" border="0" align="center" cellspacing="3">
  <tr> 
    <td height="103" colspan="2" bgcolor="#FFFFFF"> 
      <p align="center">&nbsp;</p>
      <form name="form2" method="post" action="resultatslocations.php">
        <p>D&eacute;partement 
          <select name="departement" id="departement" title="<?php echo $row_rsdepartement['departement']; ?>">
            <?php
do {  
?>
            <option value="<?php echo $row_rsdepartement['departement']?>"><?php echo $row_rsdepartement['departement']?></option>
            <?php
} while ($row_rsdepartement = mysql_fetch_assoc($rsdepartement));
  $rows = mysql_num_rows($rsdepartement);
  if($rows > 0) {
      mysql_data_seek($rsdepartement, 0);
	  $row_rsdepartement = mysql_fetch_assoc($rsdepartement);
  }
?>
          </select>
          Type 
          <select name="type" id="select3" title="<?php echo $row_rstype['type']; ?>">
            <?php
do {  
?>
            <option value="<?php echo $row_rstype['type']?>"><?php echo $row_rstype['type']?></option>
            <?php
} while ($row_rstype = mysql_fetch_assoc($rstype));
  $rows = mysql_num_rows($rstype);
  if($rows > 0) {
      mysql_data_seek($rstype, 0);
	  $row_rstype = mysql_fetch_assoc($rstype);
  }
?>
          </select>
          Cat&eacute;gorie 
          <select name="categorie" id="select4" title="<?php echo $row_rscategorie['categorie']; ?>">
            <?php
do {  
?>
            <option value="<?php echo $row_rscategorie['categorie']?>"><?php echo $row_rscategorie['categorie']?></option>
            <?php
} while ($row_rscategorie = mysql_fetch_assoc($rscategorie));
  $rows = mysql_num_rows($rscategorie);
  if($rows > 0) {
      mysql_data_seek($rscategorie, 0);
	  $row_rscategorie = mysql_fetch_assoc($rscategorie);
  }
?>
          </select>
          <input type="submit" name="Submit" value="Rechercher">
        </p>
      </form>
Mais je voudrais aussi afficher en fonction du département sélectionné les découvertes qui se trouvent sur une autre table. tb_decouvertes, id_decouverte, decouvertes, ville, departement
Je n'ai pas fait de clé étrangère sur le champ département car il paraît que phpMyAdmin n'en tient pas compte !
Donc si vous pouviez m'aidez encore cette fois-ci ça serait très sympa ! J'ai déjà cherché mais je ne m'embrouille avec tout ce code !

Encore merci d'avance ! :wink:
y a un début à tout !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 mars 2006, 10:43

Hello !

C'est surtout la requête qu'il faudrait que tu nous montre si ton soucis vient de là ;)

Tu n'as effectivement (pour l'instant du moins) pas besoin de déclarer explicitement une clé étrangère dans mysql, vu que l'intégrité des données c'est pas encore son rayon. Cela dit, il te faut quand même un lien entre tes deux tables (à priori ce serait departement) :)

Il te faut donc lier les deux tables, soit directement dans le WHERE (FROM table1, table2 WHERE table1.departement = table2.departement) soit dans le FROM avec une jointure externe (FROM table1 LEFT OUTER JOIN table2 ON table1.departement = table2.departement)

Le premier ne te ramène que les résultats qui ont une correspondance dans table2 (si pas de découverte associée, pas de résultat) le second te ramène tous les résultats (s'il n'y a pas de découverte associée, la ligne est quand même ramené avec des valeur null là où il n'en a pas trouvé)

Eléphant du PHP | 72 Messages

27 mars 2006, 10:53

Désolé !
La requête :
mysql_select_db($database_connexion, $connexion);
$query_rs2departement = "SELECT distinct departement FROM tb_evenements ORDER BY departement ASC";
$rs2departement = mysql_query($query_rs2departement, $connexion) or die(mysql_error());
$row_rs2departement = mysql_fetch_assoc($rs2departement);
$totalRows_rs2departement = mysql_num_rows($rs2departement);

mysql_select_db($database_connexion, $connexion);
$query_rs2evenement = "SELECT distinct evenement FROM tb_evenements";
if(!empty($evenement2))
$query_rs2evenement.="WHERE evenement=$evenement2"; //on ne ramène que sur l'événement
$query_rs2evenement.=" ORDER BY evenement ";
$rs2evenement = mysql_query($query_rs2evenement, $connexion) or die(mysql_error());
$row_rs2evenement = mysql_fetch_assoc($rs2evenement);
$totalRows_rs2evenement = mysql_num_rows($rs2evenement);
y a un début à tout !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 mars 2006, 11:04

Y a pas de soucis :) (t'en a pas assez de tomber sur moi pour te répondre ? ;))

Bon p'tite question.. tes découvertes, tu veux les faire apparaitre comment ? sous la forme de menu déroulant comme ceux des départements et événements ? ou bien dans le résultat de ta recherche ? (vu qu'apparament là, ce sont les requêtes de génération de ton formulaire que tu as donné)

Une petite remarque sinon tant que j'y suis :
$query_rs2evenement = "SELECT distinct evenement FROM tb_evenements"; 
if(!empty($evenement2)) 
  $query_rs2evenement.="WHERE evenement=$evenement2"; //on ne ramène que sur l'événement 
$query_rs2evenement.=" ORDER BY evenement ";

Si $evenement2 n'est pas vide, la requête ne sert à rien puisque tu va ramener une liste ne contenant que l'événement qui est égal à $evenement2.. autant utiliser $evenement2 directement quand tu l'as déjà :)

Eléphant du PHP | 72 Messages

27 mars 2006, 11:42

Salut Ryle ! :wink:

:oops: J'dois pas être réveillée, je n'avais pas fais gaffe que c'était toi !!! hem hem !!! Dure journée à l'horizon !!! Mais si tôt aussi, manque d'habitude ! :wink:

Mes découvertes n'apparaissent seulement qu'au résultat.
Et pour ta 2ème constatation, ben euh je n'ai pas vraiment compris ! :? Mais bon venant de ma part tu ne seras vraiment surpris ! :wink:
y a un début à tout !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 mars 2006, 14:35

C'est vrai que quand le matin commence avant 14h j'ai du mal.. pis c'est d'autant plus pénible maintenant qu'on a changé d'heure ;)
Mes découvertes n'apparaissent seulement qu'au résultat.
C'est ta requête de recherche alors qu'il faudrait que tu me donnes pour illustrer ça clairement, et éventuellement le tableau où tu affiches tes résultats :)
Et pour ta 2ème constatation, ben euh je n'ai pas vraiment compris ! :? Mais bon venant de ma part tu ne seras vraiment surpris ! :wink:
Ben en fait, suppose que $evenement2 soit égal à "5", ta requête va donc donner ceci :

Code : Tout sélectionner

SELECT distinct evenement // tous les evenements distinct FROM tb_evenements // de la table tb_evenements WHERE evenement = 5 // pour lesquel evenement = 5 ORDER BY evenement // trier par événement
Soit en résumé : "retourne moi la valeur des evenements qui ont pour valeur 5" :) La requête va donc juste te retourner l'événement "5", ce qui est normal vu que c'est ce que tu lui demandes, mais du coup c'est un traitement un peu inutile ;)

Ca n'empêche pas du tout le bon fonctionnement et tu peux tout à fait le garder comme ça, c'est juste que ça fait un peu bizare :)

Eléphant du PHP | 72 Messages

27 mars 2006, 15:00

Hem hem ça se complique, bon comme je te le disais auparavant Ryle je veux afficher mes découvertes par rapport au département sélectionné mais pas dans le même tableau ! (en fait je pense afficher un 2ème tableau sur la même page pour ce résultat si toutefois c'est possible).
J'ai essayé ce que tu m'as dit, mais j'ai du m'emmêler les pinceaux
mysql_select_db($database_connexion, $connexion);
$query_rsdepartement2 = "SELECT distinct departement FROM tb_evenements, tb_decouvertes
WHERE tb_evenements.departement=tb_decouvertes.departement";
$rsdepartement2 = mysql_query($query_rsdepartement2, $connexion) or die(mysql_error());
$row_rsdepartement2 = mysql_fetch_assoc($rsdepartement2);
$totalRows_rsdepartement2 = mysql_num_rows($rsdepartement2);
Car j'ai ce message d'erreur :Champ: 'departement' dans field list est ambigu
Ou alors il faut que je change le nom de mes champs departement (ça fout peut-être la zone !)
y a un début à tout !

Eléphant du PHP | 72 Messages

28 mars 2006, 09:35

Hello everybody ! :D

Bon j'ai fait quelques changements, tout d'abord dans ma bdd afin de ne pas avoir le même nom pour les champs département et ainsi éviter encore des erreurs.
J'ai ma requête :
mysql_select_db($database_connexion, $connexion);
$query_rsdepartement2 = "SELECT distinct departementeven FROM tb_evenements, tb_decouvertes WHERE tb_evenements.departementeven=tb_decouvertes.departementdec";
$rsdepartement2 = mysql_query($query_rsdepartement2, $connexion) or die(mysql_error());
$row_rsdepartement2 = mysql_fetch_assoc($rsdepartement2);
$totalRows_rsdepartement2 = mysql_num_rows($rsdepartement2);
Mais cela ne m'affiche qu'un seul résultat au niveau des découvertes !
ma page résultat :
mysql_select_db($database_connexion, $connexion);
$query_rs2departement = "SELECT distinct departementeven FROM tb_evenements ORDER BY departementeven ASC";
$rs2departement = mysql_query($query_rs2departement, $connexion) or die(mysql_error());
$row_rs2departement = mysql_fetch_assoc($rs2departement);
$totalRows_rs2departement = mysql_num_rows($rs2departement);

mysql_select_db($database_connexion, $connexion);
$query_rs2evenement = "SELECT * FROM tb_evenements ORDER BY evenement ASC";
$rs2evenement = mysql_query($query_rs2evenement, $connexion) or die(mysql_error());
$row_rs2evenement = mysql_fetch_assoc($rs2evenement);
$totalRows_rs2evenement = mysql_num_rows($rs2evenement);

mysql_select_db($database_connexion, $connexion);
$query_rsdecouvertes = "SELECT * FROM tb_decouvertes";
$rsdecouvertes = mysql_query($query_rsdecouvertes, $connexion) or die(mysql_error());
$row_rsdecouvertes = mysql_fetch_assoc($rsdecouvertes);
$totalRows_rsdecouvertes = mysql_num_rows($rsdecouvertes);

$maxRows_Recordset2 = 5;
$pageNum_Recordset2 = 0;
if (isset($HTTP_GET_VARS['pageNum_Recordset2'])) {
  $pageNum_Recordset2 = $HTTP_GET_VARS['pageNum_Recordset2'];
}
$startRow_Recordset2 = $pageNum_Recordset2 * $maxRows_Recordset2;

$query_Recordset2 = "SELECT evenement, descriptif, villeeven, datedebut, datefin "; 
$query_Recordset2.= " FROM tb_evenements "; 
$query_Recordset2.= " WHERE MONTH(datedebut)<=$num_mois AND MONTH(datefin)>=$num_mois "; 
if(!empty($evenement2)) {// si un événement est séléctionné, on ne ramene que les enregistrements associés à celui-ci 
  $query_Recordset2.= " AND evenement='$evenement2' "; 
} 
// tu pourras aussi envisager un if similaire ici, si un jour tu veux faire une recherche sur tous les départements 
$query_Recordset2.= " AND departementeven='$departement2' "; 

$query_limit_Recordset2 = sprintf("%s LIMIT %d, %d", $query_Recordset2, $startRow_Recordset2, $maxRows_Recordset2); 
$Recordset2 = mysql_query($query_limit_Recordset2, $connexion) or die(mysql_error()); 
// traitement du résultat déplacé dans la boucle while 

if (isset($HTTP_GET_VARS['totalRows_Recordset2'])) { 
  $totalRows_Recordset2 = $HTTP_GET_VARS['totalRows_Recordset2']; 
} else { 
  $all_Recordset2 = mysql_query($query_Recordset2); 
  $totalRows_Recordset2 = mysql_num_rows($all_Recordset2); 
} 
$totalPages_Recordset2 = ceil($totalRows_Recordset2/$maxRows_Recordset2)-1; 

$queryString_Recordset2 = ""; 
if (!empty($HTTP_SERVER_VARS['QUERY_STRING'])) { 
  $params = explode("&", $HTTP_SERVER_VARS['QUERY_STRING']); 
  $newParams = array(); 
  foreach ($params as $param) { 
    if (stristr($param, "pageNum_Recordset2") == false && 
        stristr($param, "totalRows_Recordset2") == false) { 
      array_push($newParams, $param); 
    } 
  } 
  if (count($newParams) != 0) { 
    $queryString_Recordset2 = "&" . implode("&", $newParams); 
  } 
} 
$queryString_Recordset2 = sprintf("&totalRows_Recordset2=%d%s", $totalRows_Recordset2, $queryString_Recordset2); 
?>
Hé bien si quelqu'un peut m'éclairer, merci d'avance.
y a un début à tout !

Eléphant du PHP | 72 Messages

29 mars 2006, 12:07

Bonjour !

Personne pour m'aider ? :cry:
Ou une autre solution, je suis partante ! :wink:

Merci d'avance !
y a un début à tout !