Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/10/2011, 12h47   #1
Invité de passage
 
Homme Vivien
Étudiant
Inscription : mai 2007
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Vivien
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2007
Messages : 8
Points : 0
Points : 0
Par défaut Un post qui fonctionne 9 fois sur 10

Bonjour,

Je travail actuellement sur un outil de gestion des factures non conformes. Il est basé sur les technologies xHtml 1.0 strict, CSS 2, Javascript ( avec JQuery 1.6.1), et Php 5.3.3. L'outil est déjà en production depuis plusieurs mois et j'essaye d'y apporter des améliorations et notamment d'y corriger les bugs. Il y en a un qui me résiste et dont je n'arrive pas à trouver la source.

C'est au moment de la création d'une lettre de non conformité.

L'utilisateur rentre les données dans un formulaire :

fichier "creer_lettre.php" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<form method="post" action="creation_lettre.php" id="form-lettre">
   <label for="unchamp">Un champ :</label>
   <input type="text" name="unchamp" id="unchamp" />
   <!-- 23 champs dont :
      - des input de type :
         - text,
         - radio,
      - des button de type button
      - des select et
      - un textarea.
      Le tout est dynamisé par du javascript :
      - datepicker,
      - aide à la saisie avec liste de l'historique correspondant
      à ce qui est déjà tapé dans le champ,
      - champs qui se cachent en fonction des cases cochées...
      Mais pas de bouton ni d'input submit
   -->
</form>
<button id="envoie-form-lettre">Cr&eacute;er</button>
Au moment où l'utilisateur clique sur le bouton "Créer" le script Javascript ci-dessous est appeler pour vérifier l’intégrité des données saisies.

fichier "verif_lettre.js" :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
var bErr = false;
var sErrMsg = "";
if(/*vérification contenu ok*/) {
   /* On colore en vert */
} else {
   /* On colore en rouge */
   // On indique qu'il y a une erreur
   bErr = true;
   // On indique l'erreur dans le message
   sErrMsg += "Le truc est pas saisie.\n";
}
/* Une vingtaine de teste plus bas */
// Si il y a une erreur
if(bErr) {
   alert("Certains champs sont mal saisies ou non renseignés :\n" + sErrMsg);
} else {
   // On envoie le formulaire
   $('#form-lettre').submit();
}
Le formulaire est traité dans creation_lettre.php.

fichier "verif_lettre.js" :

Code :
1
2
3
4
5
6
7
8
9
10
 
<?Php
   // On analyse le formulaire
   $unchamp = $_POST['unchamp'];
   $date = BDD::convert_date2bdd($_POST["date"]);
   /* [...] */
 
   // On envoie dans la base de donnée
   BDD::get()->query('INSERT INTO lettre VALUES( '.$unchamp.', \''.date.'\')');
?>
Ce script marche parfaitement bien environ 9 fois sur 10. Mais environ 1 fois sur 10 il enregistre une ligne blanche dans la base de donnée.

J'ai donc utilisé une classe de gestion d'erreur que j'ai fait pour un autre outil et qui récupère l’environnement au moment du problème et me le transmet par mail. J'ai ensuite fait un trigger_error(); non fatale à la fin de la fonction de traitement du formulaire pour comparer l'environnement quand tout fonctionne bien et quand ça bug.

Le problème vient tous simplement que environ 1 fois sur 10 la super globale $_POST est vide ! Comment est-ce possible que les données ne soient pas transmises de façon aléatoire ?

Quelqu'un aurais une idée ?


Apparemment, le contenu du formulaire ne serait pas en cause car les utilisateurs quand ils rencontrent le problème refont la saisie et tous fonctionne correctement.

Si vous avez besoin d'informations complémentaires, n’hésitez pas à me demander.

pistes déjà explorées :

Réponse de Maraumax :
Citation:
Ce n'arrive pas simplement quand le client n'a pas javascript d'activé sur son poste ?
Sans JavaScript le bouton d'envoi serait inactif et donc le formulaire ne serait même pas envoyé.

De plus, tous les utilisateurs sont sur le même système d'exploration, une version appelé Neptune de Windows XP customisé par un sous-traitant.

Il utilise donc tous principalement Mozilla Firefox 3.5.3 sinon Internet Explorer 6.0.X. Les utilisateurs n'ont pas la main sur le parametrage et ne peuvent désactiver JavaScript.

Les utilisateurs sont tous sur le même réseau interne.

Néanmoins, j'ai l'impression qu'avec mon ordinateur de développement(Ubuntu 11.04 et Mozilla Firefox 7.0.1), l'erreur ne se produit jamais. J'ai une connexion externe.

La prestation n'est pas formidable mais je ne pense pas du moins je n'espère pas que le problème vienne de là.

Réponse de Desolation :
Citation:
Au hasard : l'utilisation d'apostrophe dans une chaîne ne perturbe pas le bon fonctionnement ?
L'encodage (accentuation) et les apostrophes sont traités dans le script qui analyse le formulaire.

Est-il possible que les apostrophes posent problème sur la partie xHtml / JavaScript ?
FoxNounours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 13h48   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 156
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 156
Points : 8 524
Points : 8 524
tu ne fais pas de vérification lorsque $_POST est vide ?
tu ne protèges pas tes valeurs (pas d’échappement) ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 14h11   #3
Invité de passage
 
Homme Vivien
Étudiant
Inscription : mai 2007
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Vivien
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2007
Messages : 8
Points : 0
Points : 0
Merci de ta réponse.

Les valeurs sont protégées par l'encodage. J'encode les apostrophes en appelant la fonction "htmlentities" avec "ENT_QUOTES" en second argument.

Pour la vérification du nombre d'élément dans "$_POST", Je ne teste leurs existences uniquement lorsqu'ils ne sont pas obligatoire. Pour les champs obligatoires qui seraient absents je laisse mon gestionnaire d'erreur s'en charger. Normalement, dans ce cas de figure le script est interrompu et un message d'erreur est retourné, mais afin de quantifier la fréquence du bug et d'avoir une photographie du contexte au moment où il s'est manifesté, je n'interrompt pas le script volontairement.
FoxNounours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 14h19   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 156
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 156
Points : 8 524
Points : 8 524
Citation:
Envoyé par FoxNounours Voir le message
Les valeurs sont protégées par l'encodage. J'encode les apostrophes en appelant la fonction "htmlentities" avec "ENT_QUOTES" en second argument.
.
je te déconseille fortement de faire ça, dans ta base les données doivent être exactement les mêmes qu'a la saisie
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 14h26   #5
Invité de passage
 
Homme Vivien
Étudiant
Inscription : mai 2007
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Vivien
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2007
Messages : 8
Points : 0
Points : 0
Convertir une seule fois les données à la saisie et pouvoir les afficher directement ensuite économise les ressources de mon serveur.

Pourquoi dans ma base, les données doivent être exactement les mêmes que celles saisies ?

Penses-tu que cela pourrait empêcher une super globale comme "$_POST" de s'initialiser ?
FoxNounours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 14h35   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 156
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 156
Points : 8 524
Points : 8 524
Citation:
Envoyé par FoxNounours Voir le message
Pourquoi dans ma base, les données doivent être exactement les mêmes que celles saisies ?
pour l'intégrité de tes données et la réutilisation de celle çi

Citation:
Envoyé par FoxNounours Voir le message
Penses-tu que cela pourrait empêcher une super globale comme "$_POST" de s'initialiser ?
ça c'est autre chose, si le javascript est déactive ou qu'il y'a une erreur au niveau du navigateur, même si t'as pas de bouton de submit, le simple fait de faire la touche Entrée envoie ton formulaire
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 14h56   #7
Invité de passage
 
Homme Vivien
Étudiant
Inscription : mai 2007
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Vivien
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2007
Messages : 8
Points : 0
Points : 0
La touche entrée n'a pas d'effet sur les ordinateur des utilisateurs , je viens d'essayer. Et si cela fonctionnerait ça n'expliquerait en rien le fait que les informations saisies ne soient pas transmise.

Ce que je ne comprends pas, c'est comment une page qui contient un formulaire avec des balises "<select></select>" quand on l'envoie, appel un script Php avec un $_POST vide.
FoxNounours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 14h59   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 156
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 156
Points : 8 524
Points : 8 524
Citation:
Envoyé par FoxNounours Voir le message
La touche entrée n'a pas d'effet sur les ordinateur des utilisateurs , je viens d'essayer.
quand t'es dans un champs si, de ton coté est ce t'arrive a faire qu'a un moment ça ne marche pas ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 15h16   #9
Invité de passage
 
Homme Vivien
Étudiant
Inscription : mai 2007
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Vivien
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2007
Messages : 8
Points : 0
Points : 0
J'ai essayé, mais je n'es jamais réussit depuis mon ordinateur de développement qui ne tourne pas sur le même OS et qui a une autre connexion.
FoxNounours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 09h36   #10
Invité de passage
 
Homme Vivien
Étudiant
Inscription : mai 2007
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Vivien
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2007
Messages : 8
Points : 0
Points : 0
Les testes sont finis et impossible de faire planter l'application sur mon PC avec un réseau externe.

Je pense que ça vient soit du réseau interne soit de la version du navigateur. Hélas, je n'est pas la main dessus !
FoxNounours est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 10h40   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 156
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 156
Points : 8 524
Points : 8 524
Citation:
Envoyé par FoxNounours Voir le message
Les testes sont finis et impossible de faire planter l'application sur mon PC avec un réseau externe.

Je pense que ça vient soit du réseau interne soit de la version du navigateur. Hélas, je n'est pas la main dessus !
si ta page sert uniquement au formulaire, fait un syteme de log, quand le _POST est vide, envoie tout le contenu de _SERVER dans un fichier daté, (tu peux meme voir si c'est en AJAX ou pas)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h18.


 
 
 
 
Partenaires

Hébergement Web