Page 1 sur 2

Pb récupération tableau de variable : ça veut pas !

Posté : 08 avr. 2006, 21:04
par leroimarco
Bonsoir à tous,

Bon, je vous soumets mon script pour un petit problème dé récupération de tableau avec $_POST. En fait, j'aimerais, lorsque le formulaire a été validé, faire réafficher, non pas le contenu des champs, mais le nom des champs contenus dans le formulaire et qui sont enregistrés dans le tableau nommé $tableau.

Le but de tout ça est de créer des fonctions de création de formulaire et que la récupération des champs et le test des valeurs soit un maximum automatisé. La partie après la vérif de validation de formulaire est encore peu développée, c'est normal. Pour l'instant, je veux juste afficher le contenu de mon tableau passé dans la superglobale.

Ce qui cloche pour le moment est que avant la validation du formulaire, mon tableau affiche bien les noms des champs créés mais après la validation, je n'ai pas les infos dans le tableau (variable $tt). Qu'est-ce que j'ai mal fait ???

Voici le code, volontairement épuré :
<?php
function FormCreate($class, $action, $formname='Form', $method='POST', $encryption='') {
  echo '<form method="' . $method . '" action="' . $action . '" name="' . $formname . '" class="' . $class . '">' . "\n";
}

function FormEnd() {
  echo '</form>';
}

function FormInput ($label, $name, $size, $maxlenght, $needed) {
  global $tableau;
  $tableau[$name] = $needed;

  $result_forminput  = '<label for="' . $name . '">' . $label . '</label>' . "\n" . '<input type="text" id="' . $name;
  $result_forminput .= '" value="';
  $result_forminput .= isset($_POST['$name'])?$_POST['$name']:NULL;
  $result_forminput .= '" size="' . $size . '" maxlenght="' . $maxlenght . '" />';
  $result_forminput .= ($needed=='1')?"*":NULL;
  $result_forminput .= "\n";

  echo $result_forminput;
}

function FormSubmit($namesubmit, $labelsubmit) {
  $result_formsubmit  = '<input type="submit" class="checkform" ';
  $result_formsubmit .= 'name="' . $namesubmit . '" value="' . $labelsubmit . '" />';
  echo $result_formsubmit;
}

?>
<? //////////////////   FIN DE DESCRIPTION DES FONCTIONS   //////////////////////////// ?>

<?
$tableau='';

$action=(isset($_POST['envoi']))?$_POST['envoi'] : Null;

if($action) {
  if(isset($_POST['table'])) {
    $tt = explode('-', $_POST['table']);
    var_dump($tt);
    print_r($tt);
           }
}

?>

<html>
<head>
</head><body>
<?php

FormCreate('css', 'formulaire2.php', 'Formulaire');
FormInput('Age du capitaine : ', 'age_capitaine', '50', '10', 0);
FormInput('Adresse : ', 'adresse', '30', '10', 1);
FormInput('Salaire : ', 'salaire', '50', '10', 0);
var_dump($tableau);
?>
<input type="hidden" name="table" value="<?php echo (implode('-', $tableau)); ?>">
<?
FormSubmit('envoi', 'Valider');
FormEnd();
?>
</body>
</html>
Merci d'avance de vos idées ou suggestions pour résoudre ce problème.

Bonne soirée à tous et bon week end.

JM

Posté : 08 avr. 2006, 21:11
par Cyrano
TU pourrais avoir les noms des champs dans une boucle foreach :
foereach($_POST as $champ => $valeur)
{
    //... instruction
}
À chaque tour de boucle, tu auras le nom du champ dans $champ et la valeur inscrite dans $valeur, et il te restera éventuellement à stocker tout ça dans un tableau.

Attention, ça va également enregistrer les boutons submit, reset et autres...

Posté : 08 avr. 2006, 21:18
par leroimarco
En fait, via $_POST, j'ai passé, dans un champ caché, le contenu de mon tableau, transformé préalablement avec implode(). Contenu que je restitue en tableau ensuite avec explode(). Mais ce tableau ne contient apparemment plus la même chose qu'avant la validation du formulaire. Normalement, je devrais, après l'étape du explode(), retrouver mon tableau complet, non ???

Posté : 08 avr. 2006, 21:46
par Cyrano
explode() devrait restituer très exactement ce que implode() a linéarizé: si ton tableau était complet au départ, il doit à nouveau être complet à la sortie.

Posté : 08 avr. 2006, 21:50
par leroimarco
ok, merci bien à toi Cyrano de t'être penché (une fois de plus) sur mon souci :wink:

Je vais essayer de creuser la question car effectivement, mon tableau ne semble pas être aussi complet après validation qu'avant :shock:

Cela vient peut être d'un problème de variable globale mais je ne vois pas lequel.

As-tu essayé le script pour voir le résultat affiché ?

Posté : 08 avr. 2006, 22:00
par leroimarco
J'ai peut être un début de piste. Quand j'exécute le script et que je visualise la source, voilà ce que j'obtient :

Code : Tout sélectionner

<html> <head> </head><body> <form method="POST" action="formulaire3.php" name="Formulaire" class="css"> <label for="age_capitaine">Age du capitaine : </label> <input type="text" id="age_capitaine" value="" size="50" maxlenght="10" /> <label for="adresse">Adresse : </label> <input type="text" id="adresse" value="" size="30" maxlenght="10" />* <label for="salaire">Ton salaire : </label> <input type="text" id="salaire" value="" size="50" maxlenght="10" /> array(3) { ["age_capitaine"]=> int(0) ["adresse"]=> int(1) ["salaire"]=> int(0) } <input type="hidden" name="table" value="0-1-0"> <input type="submit" class="checkform" name="envoi" value="Valider" /></form> </body> </html>
Au vu de ce que me donne le var_dump sur le tableau

Code : Tout sélectionner

array(3) { ["age_capitaine"]=> int(0) ["adresse"]=> int(1) ["salaire"]=> int(0)
Est-ce que ce que j'envois dans le value

Code : Tout sélectionner

<input type="hidden" name="table" value="0-1-0">
est normal ???

Posté : 08 avr. 2006, 22:02
par Cyrano
Non puisque le champ "table" n'est pas dans le tableau affiché qui ne contient que age_capitaine, adresse et salaire

Posté : 08 avr. 2006, 22:19
par leroimarco
](*,) j'ai pas tout compris là :? Le champ table est censé stocker le contenu intégral de mon tableau $tableau. Ce champ table est lui passé dans le $_POST[]. Mais pourquoi l'implode de mon tableau donne '0-1-0' ?

Posté : 08 avr. 2006, 22:44
par Cyrano
Ok, alors autant pour moi, j'avais pas fait le lien entre table et ton tableau de valeurs. Donc dans ce cas effectivement, c'est correct.

Ceci dit, puisque tu pars déjà d'un tableau ($_POST), pourquoi ne pas utiliser serialize() et unserialize(), ça simplifierait encore plus les manipulations

Posté : 08 avr. 2006, 22:49
par leroimarco
Pas de soucic :wink:
Ok, je vais essayer avec ces 2 fonctions. Mais je pensais que implode et explode étaient plus adaptées aux tableaux.

Par contre, si la syntaxe est correcte, je ne m'explique toujours pas pourquoi l'implode du tableau me retourne "0-1-0" et pas "age_capitaine-0-adresse-1-salaire-0 ... #-o

Posté : 08 avr. 2006, 22:50
par jpaul
Me semble que ton problème vient du fait que tu fais ton implode au moment où tu affiches le formulaire et non au moment où tu le valide.
Quand tu fas l'implode, les champs du formulaire ne sont pas encore mofifiées non ?

Posté : 08 avr. 2006, 22:52
par Truc
Mais pourquoi l'implode de mon tableau donne '0-1-0' ?
Pour la simple raison que c'est ce que tu lui fournis:
$tableau[$name] = $needed; 
et que vaut $needed ?
FormInput('Age du capitaine : ', 'age_capitaine', '50', '10', 0);
ici 0 puis 1 et enfin 0 :wink:

En passant regarde aussi ceci:
$_POST['$name']
je ne pense pas que la variable sera interprétée comme tu l'espères.

Posté : 08 avr. 2006, 23:09
par leroimarco
oki, merci à vous deux pour ces infos :merci:

Par contre, je précise que effectivement, le formulaire n'est pas validé mais ce que contient $tableau, c'est bien le nom du champ (et pas ce qui est saisi par l'utilisateur :wink: ) puisque l'objectif est de récupérer les champs utilisés pour créer ce formulaire. $tableau reçoit donc comme paramètre le nom du champ et l'argument $needed (qui vaut 0 ou 1) et qui indique au script si le champ devra impérativement être renseigné par l'utilisateur ou s'il est seulement facultatif. Vilà vilà.

Donc, je ne comprends pas encore le résultat de mon implode mais ce doit être la fatigue :)

Posté : 08 avr. 2006, 23:12
par leroimarco
Mais pourquoi l'implode de mon tableau donne '0-1-0' ?
Pour la simple raison que c'est ce que tu lui fournis:
$tableau[$name] = $needed; 
Alors comment faire pour que l'implode contienne ce que je voudrais qu'elle contienne, à savoir 'age_capitaine-0-adresse-1-salaire-0' :-k ??

Posté : 08 avr. 2006, 23:30
par Truc
soit tu places dans le tableau ce que tu veux y voir:
$tableau[$name] =$name.'-'.$needed;
et ensuite l'implode dans le champ caché.


Soit au lieu d'utiliser implode utiliser les fonctions que Cyrano t'a montrées