Page 1 sur 1

Form avec très grand nombre de variables : comment récupèrer ?

Posté : 15 août 2017, 04:11
par Couin
Hello,

Voilà, je galère sévèrement sur une formulaire dans lequel je dois pouvoir passer un grand nombre de variables.

Pour se mettre dans le contexte, j'ai un fichier messages.html dans lequel sont ajoutés des dédicaces sur le site d'une webradio.
J'ai besoin de pouvoir manipuler ce fichier pour, par exemple, supprimer ou corriger une dédicace.
L'idée étant de ne pas passer par le ftp pour le faire mais via une interface admin.
Le contenu est de forme :
JANIO JUAZEIRO CE a écrit le 08/08/2017 à 20:58:46 : BOA TARDE!!! RADIO NOTA 10 ---- JANIO JUAZEIRO CE a écrit le 02/08/2017 à 23:48:57 : OTIMA RADIO PARABENS AOS ORGANIZADORES ---- Atjeplog a écrit le 28/07/2017 à 20:51:51 : Yeah euro!! ---- 
etc etc etc
Pour travailler les dédis, j'ouvre et décompose le fichier pour en faire faire un form contenant un tableau avec plusieurs champs :
Date, Heure, Auteur, et Message. Puis une case à cocher pour supprimer une dédi.
Jusque là ça va.

Le souci étant qu’actuellement le fichier a environ 700 dédis, ce qui fait qu'à taux de 5 variables par dédi, le transfert des variables à la validation du form ne se fait pas entièrement.
Evidement, je ne peux pas modifier le max_input_vars sur le php du serveur.

A force de chercher une solution, je suis tombé sur un script, qui à priori passe tout d'un coup et redécompose à l'arrivée.
J'en mets ici les parties pertinentes :

Code : Tout sélectionner

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> </head> <body> <?php if($_SERVER["REQUEST_METHOD"]==="POST" && !empty($_POST["data"])) { $vars = explode("&", $_POST["data"]); $data = array(); foreach($vars as $var) { parse_str($var, $variable); assign_var($_POST, $variable); } echo "<pre>"; var_dump($_POST); echo "</pre>"; } function assign_var(&$target, $var) { $key = key($var); if(is_array($var[$key])) assign_var($target[$key], $var[$key]); else { if($key==0) $target[] = $var[$key]; else $target[$key] = $var[$key]; } } ?> <form id="myForm" method="POST"> //// Tableau pour afficher les champs de toutes les dédis depuis le fichier messages.html </form> <style> input { margin: 0px 0; } </style> <script type="text/javascript"> (function(){ $(function(){ $("#myForm").submit(function(event) { var $this = $(this); var data = $this.serialize(); $this.find("input, textarea, select, button").remove(); $this.append("<input type='hidden' class='data' name='data'/>"); $this.find("input.data").val(data); }); }); })(jQuery); </script> </body> </html>
En effet, les données sont toutes transmises (le format est un peu bizarre mais je pense qu'avec un urldecode je devrais résoudre ce souci.

Si je mets

Code : Tout sélectionner

echo "<pre>"; echo $var; echo "</pre>";
à la place de

Code : Tout sélectionner

echo "<pre>"; var_dump($_POST); echo "</pre>";
Les variables s'affichent d'une manière un peu plus ordonnées (me^me si les valeurs sont pas encore super lisibles, cf. ce dont je parlais juste au dessus) . Par exemple :

Code : Tout sélectionner

date_0=08%2F08%2F2017 heure_0=20%3A58%3A46 auteur_0=JANIO+JUAZEIRO+CE+ message_0=BOA+TARDE!!!+RADIO+NOTA+10 date_1=02%2F08%2F2017 heure_1=23%3A48%3A57 auteur_1=JANIO+JUAZEIRO+CE+ message_1=OTIMA+RADIO+PARABENS+AOS+ORGANIZADORES date_2=28%2F07%2F2017 heure_2=20%3A51%3A51 auteur_2=Atjeplog message_2=Yeah+euro!!
Le problème auquel je suis confronté, c'est comment utiliser les variables qu'il m'affiche ?

J'ai fais pour tester, une boucle for sur 100 dédis :

Code : Tout sélectionner

for($i = 0; $i <= 99; ++$i) { $message = $message_[$i]; echo $message; }
Il me dit 100 fois que la variable message_ n'existe pas.

Je change donc pour

Code : Tout sélectionner

for($i = 0; $i <= 99; ++$i) { $message = ${'message_'.$i} echo $message; }
Il y a du mieux dans le sens où il y a le numéro de message (message_0 jusqu'à message_99) mais il me dit que ca existe toujours pas (donc 100 erreurs).

Je teste en voulant afficher par exemple le message de la troisième dédi, sans boucle for.

Code : Tout sélectionner

echo $message_2;
Idem, la variable message_2 n'existe pas.

Je ne sais plus du tout où chercher, pourtant que je sens que je suis pas loin :(

C'est en vous remerciant par avance si vous avez une solution :)

Merci
Couin

Re: Form avec très grand nombre de variables : comment récupèrer ?

Posté : 15 août 2017, 14:01
par or 1
une solution est de faire 700 formulaires et de soumettre le formulaire en ajax qui doit être changé, idem pour le bouton pour supprimer.

des exemples sur https://api.jquery.com/jquery.post/

Re: Form avec très grand nombre de variables : comment récupèrer ?

Posté : 18 août 2017, 00:50
par Couin
Bonjour ,

Merci pour l'idée, je vais regarder cela :)

En revanche, je reste toujours intéressé par une idée pour récupérer les variable du script de mon premier post :)

Merci

Re: Form avec très grand nombre de variables : comment récupèrer ?

Posté : 21 août 2017, 10:06
par FredBty
Bonjour,
essayes ça plutôt :

Code : Tout sélectionner

for($i = 0; $i <= 99; ++$i) { $message = $_POST['message_'.$i]; echo $message; }

Re: Form avec très grand nombre de variables : comment récupèrer ?

Posté : 25 août 2017, 01:41
par Couin
Hello,

il me semble que j'avais testé ceci en premier, j'ai retesté, dans le doute, mais j'obtiens les mêmes erreurs , disant que la variable message_0 , message_1 etc etc etc n'existe pas

Merci pour le coup de palme :)

Re: Form avec très grand nombre de variables : comment récupèrer ?

Posté : 25 août 2017, 10:15
par @rthur
Fait un var_dump($_POST); et tu veras ce qui est envoyé exactement comme variable en POST

Re: Form avec très grand nombre de variables : comment récupèrer ?

Posté : 25 août 2017, 17:55
par tesmet
Je pense qu'il suffirait de parse_str($_POST['data'], $data); pour avoir tout ce qui est désiré dans $data.

Mais s'il faut aussi structurer le tableau selon les indices et comme il ne semble pas y avoir de tableau dans le POST, que donnerait ces modifications ?

Code : Tout sélectionner

if(/*$_SERVER["REQUEST_METHOD"]==="POST" && */!empty($_POST["data"])) { $vars = explode("&", $_POST["data"]); $data = array(); foreach($vars as $var) { parse_str($var, $variable); list($var, $index) = explode('_', key($variable)); $data[$index][$var] = $variable[key($variable)]; } echo "<pre>"; var_dump($data); echo "</pre>"; } /*function assign_var(&$target, $var) { $key = key($var); if(is_array($var[$key])) assign_var($target[$key], $var[$key]); else { if($key==0) $target[] = $var[$key]; else $target[$key] = $var[$key]; } }*/
Parce que la fonction assign_var() me semble incorrecte, mais j'ai pas testé non plus.

Re: Form avec très grand nombre de variables : comment récupèrer ?

Posté : 26 août 2017, 02:54
par Couin
Hello,

Alors pour répondre à @rthur, la (première, par exemple) ligne :
08/08/2017 | 20:58:46 | JANIO JUAZEIRO CE | BOA TARDE!!! RADIO NOTA 10 ---- <b>JANIO JUAZEIRO CE
( le | symbolisant le changementment de colonne de mon tableau du form)


Me donne :
date_0=08%2F08%2F2017

heure_0=20%3A58%3A46

auteur_0=JANIO+JUAZEIRO+CE+

message_0=BOA+TARDE!!!+RADIO+NOTA+10+----+%3Cb%3EJANIO+JUAZEIRO+CE+

Donc je comprends pas pourquoi si je fais un echo $message_0; il me dit que la variable n'existe pas :(



Pour répondre à tesmet, voici ce que me donne le résultat du form , sur les deux premières lignes du tableau des dédis que j'envoie :
array (size=717)
0 =>
array (size=4)
'date' => string '08/08/2017' (length=10)
'heure' => string '20:58:46' (length=8)
'auteur' => string 'JANIO JUAZEIRO CE ' (length=18)
'message' => string 'BOA TARDE!!! RADIO NOTA 10' (length=26)
1 =>
array (size=4)
'date' => string '02/08/2017' (length=10)
'heure' => string '23:48:57' (length=8)
'auteur' => string 'JANIO JUAZEIRO CE ' (length=18)
'message' => string 'OTIMA RADIO PARABENS AOS ORGANIZADORES' (length=38)

Mais je ne sais toujours pas récupérer les variables :( Je suis encore plus perdu qu'avant :( Ouiiinnnnn

Merki pour vos aides :)

Re: Form avec très grand nombre de variables : comment récupèrer ?

Posté : 26 août 2017, 04:43
par Couin
Re,

J'ai enfin compris pourquoi ca marchait pas . En fait :
message_0=BOA+TARDE!!!+RADIO+NOTA+10+----+%3Cb%3EJANIO+JUAZEIRO+CE+
n'est pas la variable $message_0 mais la 4ème valeur du array $vars.

En fouillant un pneu , je suis parvenu à obtenir ce que je veux par un explode par le caractère = , puis utilisation de variables dynamiques que j'ai trouvé dans le manuel php.

Je mets ici la partie modifiée , au cas où quelqu'un veuille faire quelque chose d'aussi tordu lol

Code : Tout sélectionner

if($_SERVER["REQUEST_METHOD"]==="POST" && !empty($_POST["data"])) { $vars = explode("&", $_POST["data"]); $data = array(); $nbvar = 0; foreach($vars as $var) { parse_str($var, $variable); assign_var($_POST, $variable); $nbvar++; } for($i = 0; $i < $nbvar; ++$i) { $varvalue = explode("=", $vars[$i]); $a = $varvalue[0]; $$a = $varvalue[1]; $nbdedis = preg_replace("/[^0-9]/","",$a); } for($i = 0; $i <= $nbdedis; ++$i) { $date = urldecode(${'date_'.$i}); $heure = urldecode(${'heure_'.$i}); $auteur = urldecode(${'auteur_'.$i}); $message = urldecode(${'message_'.$i}); echo $date." à ".$heure." ".$auteur." a écrit: ".$message."<br>"; } }
En tout cas merki pour les coups de mains :-D

Et bon OuiK !

Re: Form avec très grand nombre de variables : comment récupèrer ?

Posté : 01 mars 2019, 15:59
par Couin
une solution est de faire 700 formulaires et de soumettre le formulaire en ajax qui doit être changé, idem pour le bouton pour supprimer.

des exemples sur https://api.jquery.com/jquery.post/
Helloooo !

De par le nombre de lignes, le temps de traitement devenait de plus en plus long .
Et ayant mis un peu le nez dans JS depuis quelques semaines pour d'autres fonctions, j'ai modifié le système.
Dans un premier temps, je ne supprime plus les lignes indésirables, mais je les désactive pour qu'elles ne soient plus affichées sur le site coté visiteur.
Aussi, quand une ligne est désactivé, je la passe en écriture blanche sur fond noir. Si je réactive la ligne elle revient en noir sur fond blanc. Pour cela, je regarde la couleur de fond d'un des inputs, et je l'inverse pour toute la ligne.
Pour cela, je change les propriétés de chaque "input text" lors d'un onclick sur une icone "oeil barré" en fin de ligne .

Code : Tout sélectionner

<script> function hide(id) { myColor = document.getElementById("message_" + id).style.backgroundColor; if ( myColor == "rgb(255, 255, 255)") { document.getElementById("date_" + id).style.backgroundColor = "#000000"; document.getElementById("date_" + id).style.color = "#FFFFFF"; document.getElementById("heure_" + id).style.backgroundColor = "#000000"; document.getElementById("heure_" + id).style.color = "#FFFFFF"; document.getElementById("auteur_" + id).style.backgroundColor = "#000000"; document.getElementById("auteur_" + id).style.color = "#FFFFFF"; document.getElementById("address_" + id).style.backgroundColor = "#000000"; document.getElementById("address_" + id).style.color = "#FFFFFF"; document.getElementById("message_" + id).style.backgroundColor = "#000000"; document.getElementById("message_" + id).style.color = "#FFFFFF"; enabled = 0; } else { document.getElementById("date_" + id).style.backgroundColor = "#FFFFFF"; document.getElementById("date_" + id).style.color = "#000000"; document.getElementById("heure_" + id).style.backgroundColor = "#FFFFFF"; document.getElementById("heure_" + id).style.color = "#000000"; document.getElementById("auteur_" + id).style.backgroundColor = "#FFFFFF"; document.getElementById("auteur_" + id).style.color = "#000000"; document.getElementById("address_" + id).style.backgroundColor = "#FFFFFF"; document.getElementById("address_" + id).style.color = "#000000"; document.getElementById("message_" + id).style.backgroundColor = "#FFFFFF"; document.getElementById("message_" + id).style.color = "#000000"; enabled = 1; } $.ajax({ type: 'POST', url: 'dedichange.php?type=enabled', data: { dedi_id: id , dedi_enabled: enabled } }); } function message(id,value) { $.ajax({ type: 'POST', url: 'dedichange.php?type=message', data: { dedi_id: id , dedi_message: value } }); } function couleur(id,value) { document.getElementById("tdcouleur_" + id).style.backgroundColor = value; $.ajax({ type: 'POST', url: 'dedichange.php?type=couleur', data: { dedi_id: id , dedi_couleur: value } }); } </script>
La fonction hide appelle ensuite la page qui modifiera la base de données.
Les fonction message et couleur font de même , pour quand on corrige un message, faute de frappe par exemple, et pour changer la couleur du texte affiché sur le site.

Dans la partie html, chaque input text a son id sous la forme

Code : Tout sélectionner

id="date_<? echo $id; ?>"
(l'$id étant celui de la ligne de la DB).
Pour le champs du message , un petit

Code : Tout sélectionner

onchange="message(<? echo $id; ?>,this.value)">
(Même chose pour le champs de couleur).

Et l’icône "oeil barré" à la fin , dans la balise img :

Code : Tout sélectionner

onclick="hide(<? echo $id; ?>)"
Et la page qui effectue les modifs sur la DB (bien sur, je ne mets pas la ligne de connexion à la DB ici masi il faut penser à la mettre :P ) :

Code : Tout sélectionner

$id = $_POST['dedi_id']; if ( $_GET['type'] == 'enabled' ) { $enabled = $_POST['dedi_enabled']; $sql = "UPDATE dedis SET enabled = '$enabled' WHERE id = '$id'"; } if ( $_GET['type'] == 'message' ) { $message = addslashes($_POST['dedi_message']); $sql = "UPDATE dedis SET message = '$message' WHERE id = '$id'"; } if ( $_GET['type'] == 'couleur' ) { $couleur = $_POST['dedi_couleur']; $sql = "UPDATE dedis SET couleur = '$couleur' WHERE id = '$id'"; } mysqli_query($dbwrite,"SET NAMES 'utf8'"); mysqli_query( $dbwrite, $sql );
Voilà voilà, comme ça si il y en a qui cherchent à faire ce genre de bidouille (bon je dis pas que c’est le plus propre mais c’est sûrement mieux qu'avant et c'est surtout bien plus rapide).

Bon Ouik :)