Récupérer données menu déroulant php

Bonjour à vous,

J'ai un menu déroulant sur page en php:


 //requête SQL: 
$sql = "SELECT * 
        FROM categories"; 
  
//exécution de la requête: 
$requete = mysql_query($sql) or die( mysql_error());?> 

<p><b>Ajouter un produit dans:</b></p>   
<form action="produits.php" method="post">   
<select name="categories">   
<?php 
while ($result = mysql_fetch_array($requete)) { 
echo '<option value="'.$result['ID_categorie'].'">',$result['nom_categorie'],'</option>'; 
} 
?> 
</select>   
<input type="submit" value="Valider">   

</form> 



J'aimerais, que selon la catégorie sélectionnée dans ce menu déroulant, cela récupère sur une autre page, les produits se trouvant dans la table, en fonction de la catégorie sélectionnée. ( J'ai déjà lié les tables dans ma base SQL )

Voilà où j'en suis sur la page qui récupère le choix du menu déroulant:


$categorie = $_POST['categories']; 

$sql = "SELECT * FROM produits WHERE ID_categorie = '$categorie'";  

$requete = mysql_query($sql) or die( mysql_error()); 



Seulement après, je ne sais pas comment faire l'affichage :(

15 réponses

  1. salut, voilà une solution possible:
    <?php
     //requête SQL: 
    $sql = "SELECT * FROM categories"; 
      
    //exécution de la requête: 
    $requete = mysql_query($sql) or die( mysql_error());
    
    ?> 
    
    <p><b>Ajouter un produit dans:</b></p>   
    <form action="produits.php" method="post">   
    <select name="categories">   
    <?php 
    while ($result = mysql_fetch_array($requete)) { 
    echo '<option value="'.$result['ID_categorie'].'">'.$result['nom_categorie'].'</option>';  //la tu avait mis des virgules au lieu des points pour concatener
    } 
    ?> 
    </select>   
    <input name="valider" type="submit" value="Valider">   
    
    </form> 
    
    
    page produits.php
    
    <?php
    if(isset($_POST['valider'])){ //le bouton valider a été cliqué
    $categorie = $_POST['categories']; 
    
    $sql = "SELECT * FROM produits WHERE ID_categorie = '$categorie'";  
    
    $requete = mysql_query($sql) or die( mysql_error()); 
    
    //affichage
    echo '<table border="1">'; //tableau
    echo '<tr><th>Nom catégorie</th><th>autre valeur</th><th>une_autre_valeur</th></tr>'; //ligne des titres ATTENTION même nbr de colonnes que ci dessous
    while ($result = mysql_fetch_array($requete)) {
    	echo '<tr>'; //ligne
    	echo '<td>'.$result['nom_categorie'].'</td>'; //colonne
    	echo '<td>'.$result['autre valeur'].'</td>';
    	echo '<td>'.$result['une_autre_valeur'].'</td>';
    	//bien sur tu peux ne mettre qu'une seulle colonne
    	echo '</tr>'; //fin ligne
    }
    echo '</table>'; 
    }
    ?>
    1
    1. Bonjour et merci pour la réponse,

      Malheureusement, certainement dû à une compréhension de ma part, rien ne s'affiche dans la page produit quand je valide, c'est toujours vide.

      Mes tables se présentent comme cela:

      catégorie(ID_catégorie, nom_catégorie)
      produits (ID_produit, nom_produit, #id_categorie)
      0
      1. <?php
         //requête SQL: 
        $sql = "SELECT * FROM categories"; 
          
        //exécution de la requête: 
        $requete = mysql_query($sql) or die( mysql_error());
        
        ?> 
        
        <p><b>Ajouter un produit dans:</b></p>   
        <form action="produits.php" method="post">   
        <select name="categories">   
        <?php 
        while ($result = mysql_fetch_array($requete)) { 
        echo '<option value="'.$result['ID_categorie'].'">'.$result['nom_categorie'].'</option>';  //la tu avait mis des virgules au lieu des points pour concatener
        } 
        ?> 
        </select>   
        <input name="valider" type="submit" value="Valider"> <!-- ATTENTION as tu bien modifé cette ligne-->   
        
        </form> 
        
        <?php
        if(isset($_POST['valider'])){ //le bouton valider a été cliqué
        $categorie = $_POST['categories']; 
        
        $sql = "SELECT * FROM produits WHERE id_categorie = '".$categorie."'";  //attention le nom du champ id_produit doit avoir la même casse
        
        $requete = mysql_query($sql) or die( mysql_error()); 
        
        //affichage
        echo '<table border="1">'; //tableau
        echo '<tr><th>ID produit</th><th>Nom produit</th></tr>'; //ligne des titres ATTENTION même nbr de colonnes que ci dessous
        while ($result = mysql_fetch_array($requete)) {
        	echo '<tr>'; //ligne
        	echo '<td>'.$result['ID_produit'].'</td>'; //colonne
        	echo '<td>'.$result['nom_produit'].'</td>';
        	//bien sur tu peux ne mettre qu'une seule colonne
        	echo '</tr>'; //fin ligne
        }
        echo '</table>'; 
        }
        ?>
        0
        1. Merci à toi, effectivement, j'avais raté la ligne valider...

          Merci encore !
          0
          1. Désolé de relancer un sujet déjà résolu, mais je me demandais comment je pourrais faire une pagination à partir de ça du coup.

            J'y arrive bien de manière "classique", mais là du coup, vu que les produits ne sont jamais les mêmes, ma pagination merde. :(
            0
            1. J'y arrive bien de manière "classique" que veux tu dire pr la ?

              donnes ta partie de code concernée
              0
              1. Peut être, pour faire plus clair, j'ai cette erreur lors de l'enregistrement:

                erreur sq: Cannot add or update a child row: a foreign key constraint fails ('site_dynamique'.'produits', CONSTRAINT 'produits_ibfk_1' FOREIGN KEY ('id_categorie') REFERENCES 'categories' ('ID_categorie') ON DELETE NO ACTION ON UPDATE CASCADE)
                --
                0
                1. je ne vois pas le rapport entre ce message d'erreur ( au moment de l'enregistrement) et la pagination

                  Ce que tu entends par pagination, c'est bien le fait de limiter le nombre d'affichage des produits par page (5 par exemple) et en cliquant sur page suivante on a les produits suivants ,
                  0
                  1. Oulala, je me suis trompé de post, sérieux je suis grave...

                    En fait je voulais dire que j'arrive bien à faire pagination sur un jeu d'enregistrement, mais pas sur un affichage en fonction d'un choix.

                    Par exemple, j'ai sélectionne le choix1 dans ma liste déroulante, cela va afficher tous les produits qui se trouvent dans le choix1.

                    Seulement là la pagination ne fonctionne pas
                    0
                    1. C'est le code par défaut de dream:

                      
                      $currentPage = $_SERVER["PHP_SELF"];
                      
                      $maxRows_produits = 10;
                      $pageNum_produits = 0;
                      if (isset($_GET['pageNum_produits'])) {
                        $pageNum_produits = $_GET['pageNum_produits'];
                      }
                      $startRow_produits = $pageNum_produits * $maxRows_produits;
                      
                      mysql_select_db($database_localhost, $localhost);
                      mysql_query("SET CHARACTER SET 'utf8';")or die(mysql_error());
                      $query_produits = "SELECT produits.ID_produit, produits.nom_produit FROM produits";
                      $query_limit_produits = sprintf("%s LIMIT %d, %d", $query_produits, $startRow_produits, $maxRows_produits);
                      $produits = mysql_query($query_limit_produits, $localhost) or die(mysql_error());
                      $row_produits = mysql_fetch_assoc($produits);
                      
                      if (isset($_GET['totalRows_produits'])) {
                        $totalRows_produits = $_GET['totalRows_produits'];
                      } else {
                        $all_produits = mysql_query($query_produits);
                        $totalRows_produits = mysql_num_rows($all_produits);
                      }
                      $totalPages_produits = ceil($totalRows_produits/$maxRows_produits)-1;
                      
                      $queryString_produits = "";
                      if (!empty($_SERVER['QUERY_STRING'])) {
                        $params = explode("&", $_SERVER['QUERY_STRING']);
                        $newParams = array();
                        foreach ($params as $param) {
                          if (stristr($param, "pageNum_produits") == false && 
                              stristr($param, "totalRows_produits") == false) {
                            array_push($newParams, $param);
                          }
                        }
                        if (count($newParams) != 0) {
                          $queryString_produits = "&" . htmlentities(implode("&", $newParams));
                        }
                      }
                      $queryString_produits = sprintf("&totalRows_produits=%d%s", $totalRows_produits, $queryString_produits);
                      
                      


                      Puis:

                      
                      <table border="0">
                        <tr>
                          <td><?php if ($pageNum_produits > 0) { // Show if not first page ?>
                              <a href="<?php printf("%s?pageNum_produits=%d%s", $currentPage, 0, $queryString_produits); ?>">Premier</a>
                              <?php } // Show if not first page ?></td>
                          <td><?php if ($pageNum_produits > 0) { // Show if not first page ?>
                              <a href="<?php printf("%s?pageNum_produits=%d%s", $currentPage, max(0, $pageNum_produits - 1), $queryString_produits); ?>">Précédent</a>
                              <?php } // Show if not first page ?></td>
                          <td><?php if ($pageNum_produits < $totalPages_produits) { // Show if not last page ?>
                              <a href="<?php printf("%s?pageNum_produits=%d%s", $currentPage, min($totalPages_produits, $pageNum_produits + 1), $queryString_produits); ?>">Suivant</a>
                              <?php } // Show if not last page ?></td>
                          <td><?php if ($pageNum_produits < $totalPages_produits) { // Show if not last page ?>
                              <a href="<?php printf("%s?pageNum_produits=%d%s", $currentPage, $totalPages_produits, $queryString_produits); ?>">Dernier</a>
                              <?php } // Show if not last page ?></td>
                        </tr>
                      </table>
                      
                      
                      0
                      1. ça m'a paru plus simple de te faire ce bout de code que d'adapter celui de dream
                        par contre je n'ai pas testé, bien sur il peut subsister des erreurs

                        <?php
                        	//param modifiables
                        	$nb_par_page=10;
                        	
                        	//
                        if(isset($_POST['valider']) || isset($_GET['page')){ //le bouton valider a été cliqué ou appel par pagination
                        	//nom du script
                        	$currentScript = $_SERVER["PHP_SELF"];
                        	//recup id_produit sélectionné ou passé par l'url
                        	if(isset($_POST['categories']){
                        		$categorie = $_POST['categories'];
                        	}else{
                        		$categorie = $_GET['categ'];
                        	}
                        	//recup page demandée passée par l'URL
                        	if(isset($_GET['page']){
                        		$page_courante=$_GET['page'];
                        	}else{
                        		$page_courante=0;
                        	}
                        	//calcul nombre de pages
                        	$sql = "SELECT * FROM produits WHERE id_categorie = '".$categorie."'"; 
                        	$requete = mysql_query($sql) or die( mysql_error());
                        	$nb_enr=mysql_num_rows($requete);
                        	$nb_pages=ceil($nb_enr/$nb_par_page);
                        	
                        	//calcul limites d'affichage 
                        	$debut=$page_courante*$nb_par_page;
                        	
                        	//requette avec les limites
                        	$sql = "SELECT * FROM produits WHERE id_categorie = '".$categorie."' LIMIT ".$debut.",".$nb_par_page." "; 
                        	$requete = mysql_query($sql) or die( mysql_error()); 
                        
                        	//affichage
                        	echo '<table border="1">'; //tableau
                        	echo '<tr><th>ID produit</th><th>Nom produit</th></tr>'; 
                        	while ($result = mysql_fetch_array($requete)) {
                        		echo '<tr>'; //ligne
                        		echo '<td>'.$result['ID_produit'].'</td>'; //colonne
                        		echo '<td>'.$result['nom_produit'].'</td>';
                        		echo '</tr>'; //fin ligne
                        	}
                        	echo '</table>';
                        
                        		//pagination:
                        	// gestion numeros de page + page courante
                        		$i=0;
                        		$j=1;
                        		
                        		if($nb_enr>$nb_par_page){
                        			while($i<$nb_page){
                        				if($i!=$page_courante){
                        					echo "<a href=\"".$currentScript."?page=".$i."&categ=".$categorie."\">&nbsp; ".$j." &nbsp;</a>"; 
                        					//on passe par l'URL le numero de page demandée (commence à 0) et l'id_produit selectionné
                        				} else {
                        					echo  "<a href=\"".$currentScript."?page=".$i".&categ=".$categorie".\" >&nbsp;<b> ".$j." </b>&nbsp;</a>"; 
                        				   }
                        			$i++;
                        			$j++;
                        			}
                        		}	
                        }
                        ?>
                        0
                        1. Je vais essayer cela,

                          Merci encore pour le temps que tu as consacré :)
                          0
                          1. Bonjour à toi :)

                            Je viens de tester et adapter, cela marche nickel mais il reste un tout petit soucis.

                            La pagination marche bien, mais lors du tout premier affichage, j'ai tous les enregistrements qui s'affichent.

                            Si je clique sur 1,2 etc cela fonctionne, mais lors du premier affichage, j'ai tous par contre.
                            0
                            1. rajoutes cette ligne:

                              //param modifiables
                              	$nb_par_page=10;
                              	$page_courante=0; //init par defaut
                              	//
                              
                              0