Formulaires - Récup d'une clé

Invité
Invité n'ayant pas de compte PHPfrance

15 févr. 2006, 18:06

voici mon problème:
Suite à une formation PHP, je continu le projet qui avait été proposé, la solution m'avait déjà été indiqué. Mais voilà, suite à une reprise de ce projet et plus particulièrement sur le point suivant, je sèche.
Pourtant le problème est simple de meme que sa solution, mais bon, quch doit m'échapper. Dans le code qui suit, il s'agit de récupéré la clé (déclaré en innoDB) d'une table sans l'afficher ds le formulaire (plus précisément au niveau de la balise <option>), je crois qu'il s'agit simplement de rajouter une instruction HTML à ce niveau, et il me semblait que c'était du style ..file... ?, mais après avoir un peut tout essayer je reste sur ma faim, impossible de récupérer la clé id_produit, id_catégorie en respectant le code qui suit.
(les instructions concernées (incomplètes ou liées) sont indiqués dans le code par: // ==> ?/?/?).
En remerciant d'avance les personnes qui pourrait éclairer ma lanterne.
<?php
//consult_produit-1-0.php

//Récup données formulaire:
$produit    = $_POST['produit'];
$categorie  = $_POST['categorie'];
$id_produit = $_POST['id_produit'];                                 // ==> ?/?/?
$id_categorie = $_POST['id_categorie'];                           // ==> ?/?/?

//içi, gestion $erreur ...

if (isset($_POST['Submit'])){
if ($erreur == 0)
{
$sql = "SELECT nom_produit,prix,reference FROM produit
        WHERE id_produit=$id_produit                               // ==> ?/?/?
        AND id_categorie=$id_categorie";                          // ==> ?/?/?
$result = mysqli_query($link,$sql);
echo $sql;

while ($rows = mysqli_fetch_assoc($result))
  {
  ?>
  <div id="contenu_2">
  <table class="table2" border="1" >
  <tr><th>Catégorie</th>
      <th>Produit</th>
      <th>Prix</th>
      <th>réference</th></tr>
  <tr>
     <td><font face="Verdana">
          <?php echo $rows['categorie']; ?></font></td>
     <td> <div align="right"><font face="Verdana">
          <?php echo $rows['nom_produit']; ?></font></div></td>
     <td> <div align="right"><font face="Verdana">
          <?php echo $rows['prix']; ?></font></div></td>
     <td> <div align="right"><font face="Verdana">
          <?php echo $rows['reference']; ?></font></div></td>
   </tr>
   </table>
   </div>
  <?php } //while
}

// Formulaire:
?>
<form name="form1" method="post" action="consult_produit_1_0.php">
  <table class="table" cellpadding="5" width="400" border="1"">
    <tr>
      <td align="center">produit: </td>
      <td align="right">
        <select id="produit" name="produit">
        <?php
        $sql = "SELECT id_produit,nom_produit FROM produit ";
        $result = mysqli_query($link,$sql);
        while ($rows = mysqli_fetch_assoc($result))
        {
        ?>
        <option> <?php echo $rows['nom_produit']; ?></option> 
                                                                            <-- // ==> ?/?/? -->
                                                                            <-- id_produit ? 
        <?php } ?>                                             
        </select>
      </td>
    </tr>
    <tr>
      <td align="center">categorie: </td>
      <td align="right">
        <select id="categorie" name="categorie">
        <?php
        $sql = "SELECT id_categorie,nom_categorie FROM categorie ";
        $result = mysqli_query($link,$sql);
        while ($rows = mysqli_fetch_assoc($result))
        {
        ?>
        <option><?php echo $rows['nom_categorie']; ?></option> 
                                                                          <-- // ==> ?/?/? -->
        <?php } ?>                                                 <-- // id_categorie ?-->
        </select>
      </td>
    </tr>
    <tr>
      <td colspan="2" align="center">
        <input type="submit" name="Submit" value="Valider" />
      </td>
    </tr>
 </table>
</form>
[/php]

Eléphanteau du PHP | 38 Messages

15 févr. 2006, 19:03

il te manque au niveau de l'option l'attribut value, qui donne pour chaque option d'une liste déroulante la valeur correspondante....
        <?php
        $sql = "SELECT id_produit,nom_produit FROM produit ";
        $result = mysqli_query($link,$sql);
        while ($rows = mysqli_fetch_assoc($result))
        {
        ?>
        <option value="<?php echo $rows['id_produit'];?>"> <?php echo $rows['nom_produit']; ?></option>
                                                                            <-- // ==> ?/?/? -->
                                                                            <-- id_produit ?
        <?php } ?> 
tu fais la même chose pour l'id de catégorie dans la liste des catégories
voilà...

Petit nouveau ! | 6 Messages

15 févr. 2006, 21:30

Tout d'abord, merci pour ta réponse.
J'avais déjà testé ce code. Au cas ou, j'ai repris ton code en faisant bien attention à la syntaxe ... mais je ne récupère tjs pas la clé ?.
Etant débutant en php, il est possible alors qu'il y est une précision à apporter
dans le reste du code ?, mais je ne vois pas quoi - peut-etre au niveau du
$_POST ?.

Eléphanteau du PHP | 38 Messages

16 févr. 2006, 09:33

Regarde la source de ta page HTML et vérifies que tu aies bien des valeurs dans la liste déroulante pour l'attribut value de la balise option...
si tu n'as rien, vérifie la syntaxe de ta requête... d'ailleurs tu n'as pas de connexion ou tu l'as volontairement masqué pour le forum ?

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

16 févr. 2006, 11:26

Si aucune valeur n'est indiquée dans la balise option, c'est le libellé qui est utilisé par défaut :

Code : Tout sélectionner

<select name="monSelect"> <option>monLibelle</option> ... </select>
monSelect aura pour valeur monLibelle

Code : Tout sélectionner

<select name="monSelect"> <option value="monId">monLibelle</option> ... </select>
monSelect aura pour valeur monId

Le problème, c'est que lors de la récupération des données du formulaire, tu distingues id et libellé, alors que le champ le select ne peut te renvoyer qu'une seule valeur (ou alors faut les concaténer, c'est un peu plus compliqué).

Si tu suis l'exemple d'IDNoires (qui est la meilleure chose à faire), comme tes selects s'appellent 'produit' et 'categorie', tes identifiants (les "value" des options selectionnées) seront directement dans $_POST['produit'] et $_POST['categorie'] et non pas dans du $_POST['id_produit'], puisque id_produit n'est pas un champ de ton formulaire :)

(chais pas si je suis très clair, donc n'hésite pas si tu as besoin de plus de précisions :))

Invité
Invité n'ayant pas de compte PHPfrance

16 févr. 2006, 15:47

Je récupère bien les valeurs ds la liste déroulante du formulaire.

A ce propos, pour contourner provisoirement le problème, voici les petites modifications que j'y avait apportées (bidouille):
<?PHP
//A la ligne:
<option> <?php echo $rows['nom_produit']; ?></option>
//remplacé par:
<option> <?php echo $rows['id_produit']; echo$rows['nom_produit'];?> </option>
//Ce qui me donne ds la liste d'option: N° de clé et nom du produit

//et suite aux $_POST:
$format = "%s %s";
$nb = sscanf($produit, $format, $id_produit, $produit);
$nb = sscanf($categorie, $format, $id_categorie, $categorie);
<?
=> Qui me permet de décomposer le champ (soit la variable $produit) pour récupérer la clé ds $id_produit et le nom ds $produit ....
Je ne sait pas si tous ça parait bien clair, mais la requète qui suit me permet bien de récupérer ds ce cas un tableau avec les résultats de cette dernière.
Evidemment, le seul hic, c'est l'affichage ds la liste de la clé, qui fait un peut désordre (ainsi que le procédé).

En effet, je n'est pas reproduit l'intégralité du code (ds le seul but d'allèger ce dernier) soit: Le code HTML du début de page, appel à la CSS, l'include de connexion à la base, le test d'erreur ($erreur) suivant le $_POST .. n'y figure pas (ces derniers fonctionnent toutefois correctement), le reste est conforme.

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

16 févr. 2006, 16:48

Ce que tu peux faire pour garder ton code et avoir le libellé correct, c'est mettre la valeur que tu affiches dans le value et afficher en plus juste le nom du produit :
<option value="<?php echo $rows['id_produit']; echo$rows['nom_produit'];?>">
  <?php echo $rows['nom_produit']?>
</option> 
C'est pas forcément la solution la plus simple que tu as choisis, mais cela devrait fonctionner correctement comme ça :)

Petit nouveau ! | 6 Messages

16 févr. 2006, 17:03

Désolé, quelques petites erreurs de débutant ds le Forum:

a) jusqu'içi invité = vishnu = moi-même.
b) le message précédent est la réponse à IDnoire (je m'y suis pris en deux fois avant l'envoi de mon post, le message de Ryle apparaissant entre temps).
c) Présentation du code: la mise en forme du code à l'interieur d'un texte ???

Ryle->
Pour le dernier message, je comprend le sens, j'essairai de voir un peut plus concrètement, et y répondrait un peu plus tard, au mieux ce soir, au pire, demain matin (un peu occupé), mais je vois tjrs pas trop la soluce pour le moment.

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

16 févr. 2006, 17:18

No problemo :)

Cela dit, moi ça m'empêche de continuer ;p

En fait, en relisant ton code, je suis en train de me rendre compte qu'a aucun moment tu n'as besoin de récupérer le libellé du produit où de la catégorie, et que seul l'id t'interesse (pour la requête). Dans ce cas, la meilleure façon d'utiliser le select est de mettre l'identifiant de ton produit dans le value (cet attribut étant envoyé au serveur lorsque le formulaire est validé) et son nom dans la zone texte (celle-ci n'est envoyée que si l'attribut value n'est pas spécifié).

Tu peux donc reprendre la modif que t'a donné IDNoires
<option value="<?php echo $rows['id_produit'];?>"> <?php echo $rows['nom_produit']; ?></option>
et côté traitement php, tu le gère comme ceci :
$id_produit    = $_POST['produit']; 
$id_categorie  = $_POST['categorie']; 
tu n'auras ainsi pas besoin de t'embêter à parser le résultat envoyé par le select pour y séparer l'identifiant du nom, puisque celui-ci t'enverra directement l'id :)

Petit nouveau ! | 6 Messages

16 févr. 2006, 17:23

bon, décidément un peu complexe. La case "m'avertir lorsqu'une réponse est postée" est bien coché, mais je n'est pas de réponse quand c'est le cas, n'est-ce pas en temps réel ?.. Sinon pour le reste je réitère mon dernier message. A un peu plus tard, j'dois partir.

Petit nouveau ! | 6 Messages

17 févr. 2006, 15:20

Résolu - Tous fonctionne (dernier message décisif)- Encore beaucoup de chemin à parcourir ! (site perso + maitrise PHP) et peut de temps.
J'ai apparemment un peut de difficultés ds certains mécanismes du PHP.
Comment met-on l'étiquette [résolu] ?

Tous mes remerciements pour vos réponses. :P