Tester $_POST si le nom passé est un tableau

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Tester $_POST si le nom passé est un tableau

Re: Tester $_POST si le nom passé est un tableau

par Aureusms » 28 févr. 2010, 13:06

Bah tu boucles sur le is_array()... Non ? Bon je ne l'ai jamais fait mais cela donnerai :

function input($name,$default_value){
if (isset($_POST))
{
foreach ($_POST as $cle => $valeur)
{
if ($cle == $name)
{
while (is_array($valeur))
{
//je fais la supposition que les tableaux n'ont qu'une clef 0 à tester
$valeur = $valeur[0];
}
$value = $valeur;
}
else
$value = $default_value;
}
echo '<input name="'.$name.'" value="'.$value.'"/>'
}
}

Re: Tester $_POST si le nom passé est un tableau

par abelthorne » 26 févr. 2010, 10:54

Je crois que vous n'avez pas bien compris mon problème. ;)

Tout d'abord, ton code ne va à priori pas marcher : si je passe 'titre[0]' comme nom, j'obtiendrai un $_POST de ce genre :

Code : Tout sélectionner

$_POST => titre => [0] = montitre
Or, d'après mes essais, le premier test (que tu fais via if ($cle == $name)) ne va pas passer : il va vérifier si $_POST[titre[0]] existe et pas $_POST[titre]. Mais c'est pas le plus gros problème, je peux le contourner en analysant la chaîne pour extraire le nom et les clés.

On en arrive au vrai problème : dans ton exemple, on teste $_POST['titre']. Si c'est une chaîne, on la prend, si c'est un tableau, on le traite. Mais ça ne va marcher qu'à un seul niveau de profondeur ! Au niveau du foreach ($valeur as $cle1 => $valeur1), il faudrait que ça continue à marcher si $valeur1 est un tableau (et à nouveau, jusqu'à un nombre de profondeurs "infini").

Je cherche du code qui marche si je lui passe par exemple 'titre[0][0][0][0][0][0][0][0][0][0][0][0][0][0]' en nom et qui va alors chercher si la valeur $_POST[titre][0][0][0][0][0][0][0][0][0][0][0][0][0][0] existe.

Re: Tester $_POST si le nom passé est un tableau

par Aureusms » 26 févr. 2010, 00:27

stealth35 t'a donné une piste. Si tu fais :
<?php
function input($name,$default_value){
if (isset($_POST))
{
  foreach ($_POST as $cle => $valeur)
  {
    if ($cle == $name)
    {
       if (is_array($valeur))
       {
          foreach ($valeur as $cle1 => $valeur1)
          {
             if ($cle1 == $name)
                $value = $valeur1;
             else
                $value = $default_value;
          }
       }
       else
         $value = $valeur; 
    }
    else
      $value = $default_value;
  }
  echo '<input name="'.$name.'" value="'.$value.'"/>'
}
}

Re: Tester $_POST si le nom passé est un tableau

par abelthorne » 23 févr. 2010, 16:09

Oui mais comment l'employer pour faire mon test ? Comment remplacer mon if(isset($_POST[$name])) pour lui faire comprendre qu'il doit bidouiller la chaîne qui a la syntaxe d'un tableau (mais qui n'en est pas un) ?

Re: Tester $_POST si le nom passé est un tableau

par stealth35 » 23 févr. 2010, 16:05

is_array ?

Tester $_POST si le nom passé est un tableau

par abelthorne » 23 févr. 2010, 16:03

Bonjour,
J'ai une classe qui me permet de créer/gérer des formulaires. Lorsque je crée un champ, je dois vérifier sa valeur : ou bien c'est une valeur par défaut (formulaire pas encore envoyé), ou bien elle est récupérée depuis $_POST (formulaire posté).
J'ai une syntaxe du genre $mon_form->input('champ_titre','Sans titre') pour me générer une balise <input name="champ_titre" value="Sans titre"/>. Si le formulaire a été posté, la valeur devient alors $_POST['champ_titre'].

Dans la méthode form->input, j'ai un test de ce genre :

Code : Tout sélectionner

function input($name,$default_value){ if(isset($_POST[$name])) $value=$_POST[$name]; else $value=$default_value; echo '<input name="'.$name.'" value="'.$value.'"/>' }
Et là, je bloque : comment gérer le test si le nom a une syntaxe de tableau ? Pour mettre un champ dans une boucle (traitement de plusieurs éléments similaires) en lui passant un nom du genre 'champ_titre[0]' ?
J'obtiens alors bien un tableau $_POST de cette forme :
$_POST['champ_titre'][0]='titre du machin 1'
$_POST['champ_titre'][1]='titre du machin 2'
[...]


Or, ma méthode input va alors chercher à tester $_POST['champ_titre[0]'] au lieu de $_POST['champ_titre'][0] et ne marchera pas.

Comment me dépatouiller de ça, pour "transformer" ma chaîne de la forme 'champ_titre[0]' en tableau à clés multiples 'champ_titre', '0', etc. ?

Bien sûr, je cherche un moyen qui soit adapté à n'importe quel cas, sans supposer qu'il y aura au maximum une profondeur de tableau, par exemple ; c'est-à-dire qui marche si je passe 'champ_titre[0]' mais aussi si je passe 'champ_titre[0][nom][type_de_dromadaire]'.