Lorsque je fais un INSERT dans ma base de donnée avec des informations passés par un formulaire HTML tout se passe bien lorsque j'utilise Firefox. Par contre lorsque je passe par Internet Explorer, l'information est stockée en base avant même que l'INSERT soit executé... et le INSERT le stocke une deuxième fois... (problème au niveau des temps de traitement de la requete)
J'ai trouvé quelques sujet à ce propos sur certains forums en anglais mais aucune solution.
Je sais bien que le traitement se fait côté serveur et que le navigateur n'a rien à voir avec le PHP, mais quelqu'un a-t-il déjà été confronté à ce problème.
Je ne poste pas le code, je ne pense pas que ce soit utile, c'est vraiment quelque chose de basique, il n'y a rien de spécial.
Merci d'avance !
Message édité par Mattius007 le 03-06-2006 à 17:12:04
Un bug ligne 17 ??? je vois pas dsl, tu peu préciser. Quoiqu'il en soit c'est pas mon code mais j'ai contacté la personne et elle n'a tjs pas trouvé... Je sais bien que sa s'execute côté serveur... merci qd même...
Je savais que j'allais passer pour un blaireau ^^
Demain je met en place tout ce petit monde sur une Debian (finalisation de mon projet) je vous tiendrais au courant, je pense qu'il n'y aura plu de problème, en tout cas je l'espère... Au pire je vous poste tout mon code, parce que moi je comprend pas, j'ai passé toute la journée à mettre des test dans tous les sens sans résultat cohérent...
Mais je vous jure que c'est ce qu'il se passe... Peut-être que si je réinstalle EasyPhp... on verra sa demain.
Petit détail : En local comme je le disais sa marche sans problème avec Firefox, et sa insert des fois 2x des fois 1x avec IE mais de façon totalement aléatoire, mais plus souvent 1x... A distance (réseau local), sur un autre PC avec lequel j'accède aux serveurs d'EasyPhp installé sur mon PC, sa insert 1x avec Firefox et sa insert A CHAQUE FOIS 2x avec IE...
Voila comment j'ai procéder pour comprendre que sa insert avant l'insertion: J'ai créé une fonction qui va lire et retourne la dernière entrée, soit en simplifié getLastInsertedRow().
ensuite dans le code j'ai fait comme cela (en simplifié) :
Code :
echo getLastInsertedRow();
$temp =" INSERT INTO " . TBL_EVENT . " (utc, do, eventGroupID, ...) VALUES ('$utc', '$do', '$eventGroupId', ...)";
$res = sql_query( $temp, 1 ) ; // fonction crée par moi qui affiche ou non la requete, si erreur->sans importance
echo $temp;
echo getLastInsertedRow();
Or, AVEC IE, il se trouve que les entrées retournées par la 1ère execution de la fonction getLastInsertedRow() sont celle que j'ai posté via mon formulaire. Ce sont les même valeurs que j'ai dans la requête (echo $temp) ainsi que les valeurs retournées par la 2ème execution de la fonction... après il y a 2x les entrées en base mais UNIQUEMENT avec IE. INCOMPREHENSIBLE...
Avec Firefox j'ai un fonctionnement normal, la première fonction me donne la dernière entrée. La requete ($temp) et la deuxième execution de ma fonction ont eux les mêmes valeur. L'entrée n'est qu'un seule fois en base...
Encore une chose : lorsque je met en commentaire la ligne:
$res = @sql_query( $temp, 1 ) ;
il n'insert pas du tout, bien-entendu ^^ et la fonction me retourne 2x la même valeur, normal!
Bref si c pr répondre des truc bidons genre ta requête est erroné c'est pas la peine, vous pouvez vous abstenir...
Message édité par Mattius007 le 01-06-2006 à 20:55:54
désolé pr le @ il sert à rien dans ce cas (je l'ai copié d'un autre endroit...) et pr la fonction sql_query() faites comme si c'était mysql_query( $temp ), sa revient exactement au même...
Je m'excuse , il est évident que si mes explications et données sont floues vous ne pourrez pas m'aider. Demain je vous donne une version toute simple du code et des types ainsi que propriétés de ma base de donnée.
Quel est le bug de notre collègue à la ligne 17, que je lui transmette ?
d'abord 1 ptite remarque: KangOl tu n'est pas bien renseigné le NAVIGATEUR web (en l'occurence FF ou IE) a une importance dans ce cas.
Situation:
tu execute une requète INSERT a partire d'un formulaire présent sur une page web.
la requète est executer dans la page elle-même, et cette même page est recharger une fois le code éxécuté.
Avec FireFox: 1 seul INSERT, tout fonctionne correctement
Avec IE: 2 Insert consécutif contenant les mêmes info
Explications:
Alors oui, le code PHP est executer coté server, mais l'evenement déclencheur est un submit sur le formulaire en question. Si la page se recharge automatiquement et qu'elle n'est pas 'protégé', le simple fait de presser F5 (rafraichir) va recharger la page et donc inserer une 2ème fois toutes les info en Base.
Situation concernant IE et FireFox: tout le monde sait (sauf peut-être KangOl ) que IE et Firefox n'interprète pas le code HTML de la même manière...
D'ou la situation suivante: ce qui fonctionne sous IE ne fonctionera pas de la même manière sous FireFox ! ça y est, KangOl ... tu vois ou je veux en venir ....
non ...
Simple: Si une erreur c'est glisser dans le HTML, il se peut que Firefox ne la detecte pas alors que IE le fasse (ou inversement ...). C'est EXACTEMENT ce qui qe passe!!
En fait, IE va se heuter a une erreur HTML qu'il n'arrive pas a interpreter correctment et recharger la page automatiquement et instantanément sans rien demander a personne .... le PHP est donc recharger (avec la page) et la requête executé une seconde fois d'ou un double INSERT.
Cette erreur n'a rien a voir avec PHP, ni même avec MySQL. C'est une simple erreur d'interpretation du code HTML sous IE!
J'admet que certains newbie sont un peu stupide et pose souvent des questions sans intérêt, mais lorsqu'on vois la réponse de certains modérateur, on se demande parfois qui est le plus stupide ...
allez, sans rancune
Message édité par ben68190 le 02-06-2006 à 15:41:19
Je suis juste modérateur, je n'ai pas la science infuse D'ailleurs, je le dit moi même : je suis un pointeur. (comprenne qui pourra)
Ensuite, merci pour cette leçon. Je savais qu'IE était assez chiant en ce qui concerne l'interpretation de l'html mais de la a en demander plusieurs fois la meme page
Et encore merci pour cette info, cela permetterai de peut etre expliquer des problèmes de lenteur que j'ai dans un code...
Alors voilà la soluce !!! ENFIN !!! Sa faisait 2 jours jsuis dessus et je dois rendre le projet très bientot !!!
Comme d'habitude c'était vraiment un tout petit truc tout bidon :
J'ai retourné le code dans tous les sens, posé des test partout, des cookies qui s'incrémentent, des valeurs en base qui s'incrémentent, des paramètre supplémentaires dans le INSERT (DELAYED, ON DUPLICATE KEY), sans succès, j'en arrivais tjs au même résultat... puis j'ai lu le mess de ben68190, j'ai alors pris ma source html et j'ai utilisé le parseur du W3C ainsi qu'un parseur en java que j'ai trouvé ss licence GNU, j'ai fait des recherches de balises avec mon prog de dévellopement PHP fétiche (NOTEPAD++)<- pub inside ^^ pour voir si il y en avait tjs un nombre pair, des guillements simple, double, j'ai refait l'indentation de ma source ligne par ligne...500 ... bref j'en passe, finalement, j'ai tout nettoyé, y avait quelques trucs, mais sans plus... une dizaine d'erreurs...
Ensuite j'ai commencé le nettoyage sévère, j'ai viré le css, j'ai viré les variable qui ne me servaient a rien (pour l'insert), j'ai viré les objet, les méthodes inutiles, les case ds mes switch, j'ai viré les return... ensuite j'ai viré les tr, td, table, bref je me suis retrouvé avec une <FORM ...> <INPUT...></FORM> et un INSERT en dur (plu de variable ds l'INSERT), mais j'ai gardé la hierarchie des fichier et dossier que j'avais mis en place... et la tjs pareil, sa marchai po... l'insert se faisait parfois 2fois ss IE et tjs 1x ss Firefox... vous allez rire, voici le formulaire qui me restait, les "connaisseurs" (ceux qui ne disent pas "aucun rapport avec le navigateur", direct, sans chercher à comprendre, le blaireau c'est pas moi en fait ) vont vite comprendre (c'était concaténé dans une variable, d'où les \" -> pour que KangOl, le pointeur qui n'a pas la science infuse comprenne bien)
bref le <input type="image" ... > (non KangOl je n'ai pas mis le "..." dans la balise ^^) s'occupe déjà d'executer l'action associée au formulaire... et en plus le javascript demande une DEUXIEME FOIS d'executer l'action, mais au "même moment", théoriquement... la fonction associée au paramètre passé par la méthode GET (&formName=createEvent) qui s'occupe de l'INSERT est alors executé 2x MAIS CÔTE SERVEUR, sans renvoyer la page au client, ce qui explique l'inutilité de l'incrémentation de mon cookie (côté client qui n'était incrémenté) et le fait que l'envoi de la page (une fois la fonction executée deux fois) m'indique par la méthode que j'ai décrit dans un de mes post, que l'insert c'est bien fait avant l'insert. ^^
J'explique le fait que le problème ne se posait que sur Internet Explorer car Firefox à "bloqué" ce "bug" (je ne vois pas trop à quoi celà pourrait servir...) et M$ ne l'a pas fait. Par contre je n'explique pas le phénomène aléatoire du problème... mais bon, c'est M$ faut pas trop en demander.
Voilà par quoi j'ai remplacé ma balise INPUT (tjs dans une variable, d'où les \" ) :
Voilà je pense que c'est totalement incompréhensible pour ceux qui débutent mais ceux qui ont se problème pourront s'en inspirer, je l'éspère...
Sinon je voudrais juste encore rajouter que j'ai vraiment été déçu par l'attitude d'un modérateur (ah non pointeur dsl) de ce forum, qui comme un flic qui vient de recevoir son uniforme, ne se sent tout simplement plu pisser, comme on dit... Sa donne vraiment une mauvaise image de ce site, qui est vraiment très bien, mais sa ne m'"enpêchera" bien sur pas de revenir car comme tout le monde le sait, il y a des B0uf0ns partout.
Message édité par Mattius007 le 03-06-2006 à 17:08:26
et le fait que je sois modérateur m'empeche de dire des conneries ?
arrêtes stp !
J'ai juste dit que cela ne venait pas du navigateur... Et effectivement cela ne viens pas du navigateur dans ce cas mais bien de ton code. Et ici, IE a un comportement logique (quoi que discutable).
et je vais expliquer la blague sur le pointeur :
En C++, il existe plusieurs moyen de passer des paramètre a une fonction. En plus du passage par valeur, il y le passage par pointeur et le passage par référence. En affirmant que je suis un pointeur, cela veux dire que je ne suis pas un référence. Voila pour le jeu de mot stupide.
et je le répete, c'est pas parce que je suis modérateur que je suis infaillible.
KangOl> Tes phrases courtes et sèches peuvent données un ton rêche et acerbe à ce que tu postes. Certe, ton rôle de modérateur t'impose de tout lire et de répondre télégraphiquement, mais certains ne font pas l'effort de reconnaître ton statut particulier. A leur décharge, il faut aller chercher l'info, ce n'est pas tout de suite évident.