$_POST et boucle

Fermé
Kai-Ho - 30 mars 2014 à 00:40
 Utilisateur anonyme - 30 mars 2014 à 18:51
Bonjour,

Il m'arrive quelque chose de curieux... Un script qui fonctionnait bien et après quelques modifs mineures, j'ai une incompréhension totale sur une erreur...

J'ai créé un formulaire avec une méthode "$_POST", sachant que la totalité des données sont récupérées via une boucle, du genre:


<form name='ThisForm' action='register_ptt.php' enctype='multipart/form-data' method='post'>

for ($ligne=1;$ligne<=100;$ligne++)

<input type='text' name='total_e_$ligne' id='total_e_$ligne' size='4' value='$total_e'>


</form>

La particularité du formulaire est de s'enregistrer au déchargement de la page via 'onbeforeunload'.

Et pour récupérer toutes les données.


for ($ligne=1;$ligne<=100;$ligne++)
{
$total_e = intval($_POST["total_e_".$ligne]);
}
Je vous fait grâce pour le moment du reste du code mais là, il m'arrive une chose étonnante...
Les 34 premières boucles fonctionnent à merveille et ensuite j'ai une erreur (Wampserver).
Notice: Undefined Index : total_e_35.

Et je ne comprends absolument pas pourquoi cette 35ème ligne (et les suivantes) bloque...
Une idée ?

Merci d'avance....


3 réponses

Bonjour

Étonnant en effet...
As-tu essayé de faire print_r($_POST) pour voir ce que tu recevais réellement ?
As-tu aussi essayé d'envoyer ta page 'normalement' c'est à dire avec un bouton plutôt que sur onbeforeunload ?
0
Oui, je viens de le faire...
Et au milieu de la boucle 35, je n'ai plus la suite des données. Est-ce que ça peut être du à la très grande quantité de données que j'envoie ?
0
Utilisateur anonyme
30 mars 2014 à 12:57
Oui, je viens de le faire
Qu'as-tu fait exactement ? le print_r n'a pas à être dans une boucle. Tu fais simplement print_r($_POST) au début de ton script pour voir si tu as bien tes 100 variables ou seulement 35.
Il est possible que ça vienne du volume de données, mais je suis un peu étonné. 35 variables, ce n'est pas énorme, (sauf si tu nous apprends que tu as 50 variables dans chaque boucle).
0
Ah, j'avais oublié de le préciser...
Il y a une bonne quinzaine de données par boucle...
Et en effet, en supprimant certaines données par boucle, je vais jusqu'à la boucle 44...

Existe-t-il une solution pour contrer ce genre de phénomène?
0
Utilisateur anonyme
30 mars 2014 à 16:23
Une bonne quinzaine de données, 35 boucles, ça fait 525 variables.
HTTP n'impose de taille max à un header, mais d'autres logiciels peuvent le faire : Apache limite à 8koctets par défaut.
Si on répartit ces 8 k sur tes 525 variables, ça fait une moyenne de 15 caractères par variable (nom de la variable + valeur + séparateurs) : ça peut être ça. Un peu bizarre quand même, normalement Apache devrait renvoyer une erreur au lieu de ne prendre qu'une partie des données.
Il est possible que ce soit le navigateur que tu utilises qui limite la longueur, j'avoue n'avoir aucune idée à ce sujet.

La réponse à ce problème, c'est de faire un formulaire raisonnable. Tu présentes vraiment à tes visiteurs un formulaire de 100 fois 15 champs ? Sérieusement ?
0
C'est un tableau remplit par des opérateurs...
Ce ne sont que des chiffres, alors ce n'est quand même pas la mer à boire pour Apache...

De plus, je crois que le comportement sur le serveur n'est pas le même que le Wamp de mon PC.
0
Utilisateur anonyme
30 mars 2014 à 18:51
Ce n'est pas la mer à boire pour Apache, mais si ça dépasse les limites pour lesquelles il est prévu, ça ne marche pas épicétou.
Quand je parlais de formulaire raisonnable, je pensais plutôt aux opérateurs. Ça leur fait potentiellement 1500 informations à introduire avant de valider un formulaire, avec le risque de plantage et donc un gros volume de saisie perdu à chaque fois.
Si tu tiens absolument à tout faire en un seul formulaire, ce qui à mon avis n'est pas une bonne idée, tu peux toujours découper l'envoi des données en plusieurs tranches avec Ajax.
0
mpmp93 Messages postés 6652 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
30 mars 2014 à 10:26
Bonjour,

Il faut utiliser foreach:

foreach ($_POST AS $post) {
    if (is_numeric($post)) {
        $total = $total + (int) $post;
    }
}


A+
0