[JS] Problème limite d'une variable atteinte

Problème limite d'une variable atteinte [JS] - HTML/CSS - Programmation

Marsh Posté le 27-06-2013 à 10:27:21    

Bonjour à tous.

 

Je suis face à un problème assez emmerdant. J'ai une application PHP / MYSQL / AJAX qui jusqu'à ce jour fonctionnait bien.
Elle à pour but de générer des documents officiels de mon taf au format PDF de dossier pro.
On a une liste de dossier activée et des checkbox. Le but est normalement de générer tout d'un coup
Là j'ai environ 1750 dossier à générer , donc 1950 checkbox de coché
Jusque là tout va bien
J'active la génération et boom ca fonctionne pas.
Pas de message d'erreur, pas d'erreur mozilla, ni php, ni mysql, les log sont vide.
J'ai remarquer ensuite que cela vient de JS je m'explique.

 

Je boucle donc sur les checkbox et retient seulement ceux qui sont "checked"
Si c'est le cas j'ajoute dans une variable JS l'ID du dossier suivi d'un "/" jusqu'à ce que la boucle se termine.

 

Après j'envois à une requete PHP (via Ajax) cette variable pour le traitement.

 

J'ai donc remarqué que ma variable arrêtait de se compléter au bout d'un moment. J'ai compter le nombre de caractère et il s'arrête a 10000 caractères
j'en déduit donc que 10000 est la limite maximal de stockage pour une variable JS

 

Ma question est, est ce que je peux contourner ce problème si oui , comment ?

 

merci par avance.

 

pour permettre de mieux comprendre voici le bout de code de la boucle

 
Code :
  1. var i;
  2. var demande_id="";
  3. var nb="";
  4. var tabDemande ="";
  5. var tabInput = document.getElementsByTagName("input" );
  6. var n= tabInput.length;
  7. for (i=0; i<n; i++){
  8.   if ( tabInput[i].type == "checkbox" ){
  9.    if (tabInput[i].checked == "1" ){
  10.     nb = tabInput[i].name.length
  11.      demande_id = tabInput[i].name.substring(8,nb);
  12.     if (tabDemande == "" ){
  13.      tabDemande = demande_id+'/';
  14.     } else {
  15.      tabDemande = tabDemande+demande_id+'/';
  16.     }
  17.    }
  18.   }
  19.  }


Dans l'exemple c'est tabDemande qui s'arrête à 10000 Caractères
ID = 5 caractères
la séparation = 1 caractères
soit 6 caractère multiplié par 1727 dossiers au total ce qui donne 10362 caractères

 

Et le faire sur 2 ou 3 variable différente cela me gène assez faudrait une solution en 1 shot.
Thx

Message cité 1 fois
Message édité par hyptnos le 27-06-2013 à 10:30:13
Reply

Marsh Posté le 27-06-2013 à 10:27:21   

Reply

Marsh Posté le 27-06-2013 à 11:15:15    

Bonjour,  
 
Pourquoi ne pas utiliser des variables tableaux ?
 
Cordialement

Reply

Marsh Posté le 27-06-2013 à 11:33:19    

Bonjour
 
En effet c'est ce que j'essai pour le moment de faire.
 

Code :
  1. var i;
  2. var demande_id="";
  3. var nb="";
  4. var tabDemande = new Array;
  5. var tabInput = document.getElementsByTagName("input" );
  6. var n= tabInput.length;
  7. var count = 1;
  8.  for (i=0; i<n; i++){
  9.   if ( tabInput[i].type == "checkbox" ){
  10.    if (tabInput[i].checked == "1" ){
  11.     nb = tabInput[i].name.length
  12.      demande_id = tabInput[i].name.substring(8,nb);
  13.     tabDemande[count] = demande_id;
  14.     count++;
  15.    }
  16.   }
  17.  }


 
J'ai bien un tableau avec 1720 ligne de stocker
 
reste maintenant le passage dans PHP car normalement j'envoyais ma variable via ajax a une page PHP
je décomposait la variable grâce au séparateur pour faire un traitement de lot de chaque dossier (ID).
 
Faut que je vois donc maintenant comment PHP interprète le tableau Javascript que je lui envoie.

Reply

Marsh Posté le 27-06-2013 à 11:40:25    

il va falloir sérialiser votre variable tableau pour pouvoir le transmettre.
J'ai déjà eu a le faire entre JS et PHP
http://www.siteduzero.com/informat [...] -serialize


Message édité par thorak83 le 27-06-2013 à 11:40:50
Reply

Marsh Posté le 27-06-2013 à 12:07:03    

hyptnos a écrit :

J'ai donc remarqué que ma variable arrêtait de se compléter au bout d'un moment. J'ai compter le nombre de caractère et il s'arrête a 10000 caractères
j'en déduit donc que 10000 est la limite maximal de stockage pour une variable JS


C'est pas le cas: http://jsfiddle.net/DVrkV/

 

Et http://jsfiddle.net/DVrkV/2/ montre ce que je comprend de ton truc avec 2000 inputs (pour un résultat de 18000 caractères), fonctionne sous Firefox, Safari et Chrome [:spamafote]

Message cité 1 fois
Message édité par masklinn le 27-06-2013 à 12:07:45

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-06-2013 à 12:07:05    

C'est un tableau simple associatif du type
1 => 00000
2 => 00001
3 => 00002
 
du coup cela se passe tres car PHP le reconnais comme une variable simple mais avec des virgules de séparation du coup cela change rien presque a mon code php initial ou je faisais un traitement avec le séparateur que j'avais inclus (le /) donc j'ai modifié le traitement pour qu'il prenne la virgule comme séparateur (vu que c'est que des nombre)
 
cependant le passage AJAX ne doit plus etre en GET à cause de la limite URL, du coup j'ai fait un passage en POST et ça roule :)

Reply

Marsh Posté le 27-06-2013 à 12:10:31    

À noter que le code posté reste immonde, et que pour transférer un minimum proprement ton truc tu peux (devrais) sérialiser et désérialiser en JSON.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-06-2013 à 12:16:29    

masklinn a écrit :


C'est pas le cas: http://jsfiddle.net/DVrkV/

 

Et http://jsfiddle.net/DVrkV/2/ montre ce que je comprend de ton truc avec 2000 inputs (pour un résultat de 18000 caractères), fonctionne sous Firefox, Safari et Chrome [:spamafote]

 

Pourtant j'ai fait un copie coller de la variable dans un éditeur de texte et le compteur reste bien bloqué à 10000 caractère (sur une ligne).
Donc je comprend pas vraiment où se situe le soucis.

 

Edit : cela viendrai plus d'un soucis de concaténation (+=) apparemment.

Message cité 1 fois
Message édité par hyptnos le 27-06-2013 à 12:19:17
Reply

Marsh Posté le 27-06-2013 à 12:17:00    

masklinn a écrit :

À noter que le code posté reste immonde, et que pour transférer un minimum proprement ton truc tu peux (devrais) sérialiser et désérialiser en JSON.


 
Je ne me suis pas encore pencher sur le JSON, faudrait que je m'y mette un de c'est jour :s

Reply

Marsh Posté le 27-06-2013 à 12:56:44    

hyptnos a écrit :

 

Pourtant j'ai fait un copie coller de la variable dans un éditeur de texte et le compteur reste bien bloqué à 10000 caractère (sur une ligne).
Donc je comprend pas vraiment où se situe le soucis.

 

Edit : cela viendrai plus d'un soucis de concaténation (+=) apparemment.


Nope, voici une version qui utilise la concaténation de chaînes au lieu d'un tableau pour faire son accumulation: http://jsfiddle.net/DVrkV/4/


Message édité par masklinn le 27-06-2013 à 12:59:40

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-06-2013 à 12:56:44   

Reply

Marsh Posté le 27-06-2013 à 13:07:15    

Bon bah alors je ne comprend pas du tout ce qui se passe car malheureusement avec l'exemple donné au tout début la variable s'arrêtait belle et bien à 10000 caractères.
Le pourquoi du comment je n'en saurais rien. J'ai pu voir (difficilement) que d'autre personne ont eu des problèmes similaire de blocage à 10 000 caractères, sans non plus savoir pourquoi.

Reply

Marsh Posté le 27-06-2013 à 15:15:09    

Franchement je vois pas pourquoi vous essayez tellement de bidouiller quelque chose qui ne marche pas.
 
Et puis faire du traitement en Javascript c'est quand même abuser, limite dangereux quand même
 
Le traitement doit se faire coté serveur
 
Il faut SERIALISER en php

Message cité 2 fois
Message édité par thorak83 le 27-06-2013 à 15:18:25
Reply

Marsh Posté le 27-06-2013 à 18:45:59    

thorak83 a écrit :

Franchement je vois pas pourquoi vous essayez tellement de bidouiller quelque chose qui ne marche pas.

 

Et puis faire du traitement en Javascript c'est quand même abuser, limite dangereux quand même

 

Le traitement doit se faire coté serveur

 

Il faut SERIALISER en php


Vu le niveau de tes contributions, tu devrais te calmer un peu [:petrus75]

 

Le JSON, c'est de la sérialisation [:petrus75]

 

Et "sérialiser en PHP" ça ne veut strictement rien dire [:petrus75]


Message édité par masklinn le 27-06-2013 à 18:46:51

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-06-2013 à 08:47:18    

thorak83 a écrit :

Franchement je vois pas pourquoi vous essayez tellement de bidouiller quelque chose qui ne marche pas.
 
Et puis faire du traitement en Javascript c'est quand même abuser, limite dangereux quand même
 
Le traitement doit se faire coté serveur
 
Il faut SERIALISER en php


 
 
Je ne fais pas de traitement coté JAVASCRIPT.
Justement j'envois tout à PHP pour que ce soit lui qui gère tout ce qu'il y à a gérer. A l'origine tout fonctionnais bien les ID etait stocker dans une variable JS séparer d'un "/" et le tout envoyer à PHP via Ajax. hier j'ai rencontrer un Bug, un grand nombre de dossier par rapport à d'habitude à fait que cela ne fonctionnait plus. Et comme dit, j'ai juste remarquer que m'a variable JS arrêtais de se remplir à partir de 10000 caractères. POurquoi ? Comment ? j'en sais rien !! Mais je traitement pas mes dossiers en JS non plus j'ai jamais dis cela. Le seul traitement ici la c'est la récupération des Checkbox Coché et récupérer leur valeur c'est tout.
 
Après j'ai pas dis que ce que j'avais fait était bon, était parfait ou quoique ce soit.  
Le JSON ne m'ait pas venu à l'esprit car je n'ai pour le moment pas eu le temps de me pencher dessus, il est vrai qu'il faudrait que je m'y mette.  
 
Donc oui là c'est un peu du bidouillage (quoique le stockage d'ID dans un tableau JS est tout de même plus propre que dans une simple variable) mais ça fonctionne. Mais je ne peux pas à ce jour tout retoucher sur cette application. J'ai des contraintes technique qui me brident considérablement la maintenance et l'évolution de cette application. La je devais trouver une solution rapide et simple à mettre en place car les dossiers devaient être à tout pris générer.
 
De toute façon j'ai contourner le soucis, même si c'est pas ce qu'il y à de mieux, pour le moment cela fonctionne

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed