Transmission de variable par POST

Petit nouveau ! | 6 Messages

11 août 2006, 15:46

Bonjour,

Je suis entrain de réaliser un site qui comportera une série de photo que l'on pourra selectionner par "Auteur", "Theme" , "Region", "Mots cles" etc.

J'ai donc crée une base Mysql. Pas de pb de ce côté. La table Auteur par exemple est constitué dans champ d'index, du champ Nom et du champ prénom.

Maintenant j'essaie de faire un petit utilitaire pour saisir les données dans la database.

Typiquement, l'utilisateur choisi (par exemple) un nom d'auteur dans une liste déroulante et après un click sur le bouton de validation je vais rechercher l'index correpondant au nom.

Voici le le code simplifié
**************************************************
en tête du fichier - inclusion des parametres de connection
et connexion à la base données
**************************************************
<html>
<head>

<?PHP
     include "ref.inc.php"  ;
     include "connect.inc.php" ;
    connexion();

/**************************************************
Ci dessous, je teste l'existence des variables
Si exite, j'en recupere la valeur
Sinon, j'initialise à chaine nulle ou à zero
**************************************************/
if (isset($_POST["SEL_AUTEUR"])) $SEL_AUTEUR = $_POST["SEL_AUTEUR"]; else $SEL_AUTEUR = "";
if (isset($_POST["IDX_AUTEUR"])) $IDX_AUTEUR = $_POST["IDX_AUTEUR"]; else $IDX_AUTEUR = 0;


/**************************************************
La, c'est pour le débogage, pour afficher les données transmises
**************************************************/
while (list($cle,$val) = each($_POST))
     { echo "Cle : " . $cle . "    Valeur : " . $val . "<BR>";
     }
?>

</head>
<BODY>

/**************************************************
J'ouvre un formulaire qui s'appelle lui même
**************************************************/
<form name="form_selection" ACTION = "formulaire.php" METHOD = "POST">
<table width="100%" border="3">
<tr> <td>Auteurs</td></tr>

<tr> <td>

/**************************************************
Je cree dynamiquement une liste d'option en faisant appel à la table
Le groupe If($full-nom == $SEL_AUTEUR ....... 
permet de "se souvenir" de l'option qui a été selectionnée
avant le rappel du formulaire, pour en faire l'option par défaut
et pour rechercher l'index correspondant.
**************************************************/
   <?PHP
      $sql = "SELECT nom,prenom, idx_auteur FROM `auteur` order by nom";
      $id_res = mysql_query($sql,$id_con);
      echo "<select name='SEL_AUTEUR' size = 5 >";
      while ($res = mysql_fetch_array($id_res, MYSQL_NUM))
         {
         $full_nom = $res[1]. " " . $res[0];
         if ($full_nom==$SEL_AUTEUR)
            {
            echo "<option selected>".$full_nom."</option>";
            $IDX_AUTEUR = $res[2];
            }
         else
            echo "<option>".$full_nom."</option>";
        }
      echo "</select>";
/**************************************************
Toujours pour le debogage, j'affiche l'index à côté du nom choisi
**************************************************/
      echo "idx_auteur = " . $IDX_AUTEUR;
      echo "</TD> </TR>";

      echo "<TR> <TD>";

/**************************************************
Et enfin je renseigne un champ texte (pour le moment) mais
qui sera HIDDEN par la suite de façon à transmettre la valeur de l'index avec le prochain POST
**************************************************/
      echo "<input type = 'TEXT' NAME = 'IDX_AUTEUR' VALUE = '$IDX_AUTEUR ' >";
      echo "<BR>" , "<Input type ='submit' Value='Refresh'>";
   ?>
</td> </tr> </table> </form>


</body>
</html>

-----------------------------------------------------------------------
Le probleme, c'est que le POST ne me renvoie pas cet index correctement,
Au premier clic j'obtiens

Cle : SEL_AUTEUR Valeur : Jacques
Cle : IDX_AUTEUR Valeur : 0

La valeur de l'index n'est trasmise qu'au second clic.

Quelqu'un voit-il pourquoi ce bug ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 août 2006, 15:48

Pour coller du PHP => balises
 et non pas [CODE]

Et j'ai aussi modifié la façon dont tu insères les commentaires car ça foirait toute la coloration

Petit nouveau ! | 6 Messages

11 août 2006, 15:52

OK, c'est noté. J'avais cru comprendre que la balise Code était générique

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 août 2006, 15:53

Lors du premier affichage de la page, regarde ce que donne cette ligne dans le code source HTML généré :
     echo "<input type = 'TEXT' NAME = 'IDX_AUTEUR' VALUE = '$IDX_AUTEUR ' >"; 

Petit nouveau ! | 6 Messages

11 août 2006, 16:05

Je sens que je me suis mal ou pas completement expliqué

Ca donne forcemment Zéro, puisque c'est la valeur d'initialisation.

Par contre au deuxième appel, avec la variable nom, je detecte bien la valeur de "NOM" selectionné au premier en appel et transmis par le POST et j'en déduit la valeur IDX_AUTEUR qui devrait renseigner le champ correspondant. Et là j'ai toujours "un tour de retard" que je ne comprend pas.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 août 2006, 16:08

Au premier clic j'obtiens

Cle : SEL_AUTEUR Valeur : Jacques
Cle : IDX_AUTEUR Valeur : 0

La valeur de l'index n'est trasmise qu'au second clic.
Je croyais que ça t'intriguait

Bref, autant pas se prendre la tête pour rien : à quoi sert ce champ texte (hidden ou pas) :?: À part te compliquer la vie :)

Tu peux très bien afficher un nom et transmettre un id avec une liste déroulante.

Code : Tout sélectionner

<select name="id_auteur"> <option value="1">Barjavel René</option> <option value="2">Camus Albert</option> <option value="3">Ellroy James</option> </select>
Tu récupères ta valeur ainsi :
$num_auteur = $_POST['id_auteur'];
echo 'Vous avez choisi l\'auteur n°'.$num_auteur;
C'est tout de suite plus clair non ?

Petit nouveau ! | 6 Messages

11 août 2006, 16:09

OK, je crois que j'ai pigé. C'est un pb de chronologie. En fait, il faudrait que je renseigne le champ IDX_AUTEUR entre le moment ou l'utilisateur clic sur un nom et le rappel le formulaire.

PHP sait-il faire ça ? ou bien il faut passer par du Javascipt avec un truc du genre onChange par exemple ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 août 2006, 16:14

En fait, il faudrait que tu expliques peut-être plus clairement en français à quoi va servir ce truc, et ce que tu veux comme étapes. Parceque je ne suis pas sûr d'avoir bien compris, pour moi, ce n'a pas à être aussi tordu.

1 - TU sélectionnes ID et NOMS dans ta base, et tu construit une bête liste déroulante
2 - L'utilisateur positionne la liste, et soumet le formulaire
3 - TU récupères l'id de l'auteur choisi, et tu en fais ce que tu veux

Avec ce ssytème, pas besoin de champ supplémentaire.

Est-ce que tu as besoin de faire autre chose qui nécessiterait un truc plus tordu ? :)

Petit nouveau ! | 6 Messages

11 août 2006, 16:22

Compris

Est ce que ça veut dire que l'on peut faire des listes déroulantes avec plusieurs colonnes (comme dans access par ex)

Ou alors, je colle les deux informations dans la même chaine que je m'arrange pour "exploder" après.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 août 2006, 16:30

Non, pas plusieurs colonnes. Mais tu peux avoir une chaîne affichée, et une valeur numérique. C'est classiquement ce qu'on fait pour présenter des noms à l'utilisateur (produits, personnes etc.) et manipuler derrière des identifiants.

Code : Tout sélectionner

<select name="id_auteur"> <option value="1">Barjavel René</option> <option value="2">Camus Albert</option> <option value="3">Ellroy James</option> </select>
Dans cet exemple, l'utilisateur voit choisir grâce au nom qu'il verra, mais toi tu récupéreras 1, 2 ou 3.

Petit nouveau ! | 6 Messages

11 août 2006, 16:50

Super,

Pourquoi faire simple quand on peut faire compliquer :D

Merci