Variable avec index dans POST

Eléphant du PHP | 92 Messages

25 août 2008, 10:05

Bonjour,
Je voudrais manipuler des formulaires en PHP et j'ai un problème lors du traitement des noms d'éléments.

Si je crée un champ avec un nom simple ("toto"), il est accessible sans problème via $_POST[toto]. Par contre, si je veux utiliser un nom de la forme tableau à index ("toto[1]"), je dois manipuler la variable POST via $_POST[toto][1].

Or, je voudrais automatiser tout ça via des fonctions de création et traitement de formulaire. J'ai une fonction du style cree_champ($nom_champ) qui me crée un élément <input name="toto[1]"/> quand je lui envoie "toto[1]" pour $nom_champ. Sauf que je ne peux pas récupérer la valeur POST : si je veux afficher $_POST[$nom_champ], la variable sera traitée comme $_POST[toto[1]] au lieu de $_POST[toto][1].

Comment traiter ce problème, sachant que je veux pouvoir passer un nom de champ à indexes multiples ("toto[1][2]...[n]") au besoin ?

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

25 août 2008, 11:11

Si tu connais le nom du champ, il te suffit simplement de considérer le fait que $_POST['toto'] est un tableau dont tu peux traiter les différents index à l'aide d'un foreach. Par exemple :
if (isSet($_POST['toto']) && is_array($_POST['toto'])) {
  foreach ($_POST['toto'] as $key => $value) {
    // traitement
  }
}
Nota : ne pas oublier les ' ou " autour du nom de l'index lorsque c'est une chaine. Si tu fais $_POST[toto], php va aller chercher la constante nommé toto et utiliser sa valeur comme index si elle est définie, ou bien si elle n'est pas définie, considérer que l'erreur se situe entre la chaise et le clavier et qu'il s'agit peut être en réalité de la chaine "toto" ;). Autant faire ça proprement et dire directement à php ce que tu attends de lui plutôt que de le laisser essayer des trucs et voir si ça fonctionne :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 92 Messages

25 août 2008, 11:41

Merci pour la réponse.

Je ne connais pas le nom des champs, justement ; le but est de faire une classe "formulaire" que je peux manipuler dans tous les sens, en donnant n'importe quel nom à mes champs.

Je voudrais pouvoir tester la valeur de $_POST[$nom_champ], que $nom_champ soit "toto", "truc[a]", machin[a][1][bbb]", etc.

La seule possibilité qui m'est venue à l'esprit serait de convertir $nom_champ de façon à ce qu'il devienne (par rapport aux exemples précédents) ['toto'], ['truc']['a'], ['machin']['a']['1']['bbb'] et de le passer à $_POST, mais je ne vois pas comment faire. J'ai essayé de bidouiller avec du code du genre

Code : Tout sélectionner

$tab="['machin']['a']['1']['bbb']"; $test="_POST".$tab; echo $$test;
mais évidemment, ça ne marche pas : PHP traite à priori le "$_POST['machin']['a']['1']['bbb']" comme une chaîne et pas comme le tableau $_POST avec ses sous-tableaux.

J'ai essayé aussi de transformer la chaîne en tableau de clés pour le passer à $_POST

Code : Tout sélectionner

$tab=array('machin'=>array('a'=>array('1'=>array('bbb'=>'')))); echo $_POST[$tab];
mais ça marche pas plus.