今日、お客さんにテストしてもらってた CGI で、お客さんから何度も「DB 登録時にシステムエラーが出る」と連絡が来た。
しかし、うちでは何度やっても再現出来ないので、「何か変な使い方してるんじゃねえだろうなあ?」とお客さんを疑い始めたところでハッと気づいた。
Internet Explorer でのみ発生する「Form の二重送信じゃねえの?」と。
で、ソースを見てみたら案の定だ。
今回は、(他人が作った)既存の CGI を改修して新しいサービス用のシステムを作ってるわけで、まあ、特に問題なければ元のソースの内容をなるべく残してるんだけど、Form の Submit のところで、
<input type="submit" name="ADD" value="更 新" onClick="javascrpt:Submit('ADD')">
なんてやってる。
で、JavaScript の方で、
function Submit(ps) {document.form.action.value = ps;document.form.submit();}
みたいにして、action という Form 項目に 'ADD' という文字をセットしてから送信処理を行なっているようだ。
これじゃあ、まず type="submit" のボタンを押すことで送信が行われ、更にその時に実行される JavaScript 側でも送信が行われる。つまり二重送信だ。
結果、DB に登録する時に duplicate error が発生してるんだな。
なんでこんなことしてるんやろ?俺が作ったプログラムじゃないから全然わからんわ(^^;
取り敢えず、
<input type="hidden" name="action" value="ADD"><input type="submit" name="ADD" value="更 新">
にしてみたのだが(元々、<input type="hidden" name="action" value="ADD"> は書かれていた)、これで問題なく動いているようである。今のところ、エラーは発生していない。
ちなみに、こういう現象が発生するのは Internet Explorer だけである。
Form 送信は HTTP のプロトコル的にも(リクエストと一緒だからな)一度だけ行われるもので、他のブラウザ(Firefox や Chrome、Safari など)は二重送信が行われないように、二度目の送信処理は裏でキャンセルするようになっている。
だから、Firefox と Chrome でテストやってた俺んとこじゃ再現出来なかったんだな(^^;
重ねて言うが、二重送信しちゃうのは Internet Explorer だけなのである。
で、ここで、Microsoft 信者は「IE が悪いんじゃない!そういう HTML の書き方がまずいんじゃないか!!」とか言うだろうけど、「Form の二重送信なんかあり得ないんだから、素直に駄目にしておけばいいだけ」なんだよ。
Microsoft には HTTP プロトコルに詳しいヤツがいないんじゃねえかって思うよ、実際。
今日、東京ポッド許可局の10/22のポッドキャスティングを聞いていたら「東京ポッド許可局のサイトは、Internet Explorer については動作保証外にします。Firefox や Safari で見てください」って言うてて笑った。
そう。実はとっくの昔に「Internet Explorer じゃなくたって良い」世の中になってたのである。
つーか、やっぱ、Internet Explorer だけ、変な独自仕様を詰め込んじゃって、インターネット界では特殊な存在になってしまってるんだよね。
まったく、Internet Explorer のおかげで、どれだけ無駄な時間を過ごしたことか・・・
今時 Internet Explorer に固執するのは、変化を望まないXX企業と、「このパソコンにインターネットはついてますか?」的発言をする馬鹿ユーザーくらいしかいねえよ。
さあ、皆、Internet Explorer を捨てて、素敵な未来へ!(笑)
コメントする