- PR -

insertが2回実行される(Perl&MySQL)

1
投稿者投稿内容
boo
会議室デビュー日: 2004/02/27
投稿数: 9
投稿日時: 2004-03-27 15:39
perlにてテーブル(MySQL)へ1レコード追加される
inert文を発行した所、2レコード追加される現象が発生しており
解決策がわからず悩んでおります。
ご情報等御座いましたらご教授をお願い致します。


<環境>
開発環境:RedhatLinux9(Apache2.0.4)
     perl5.8
     mySQL3.23


<現象>
下記果物テーブルにキー項目'3'、品名'みかん'のレコードを追加する
CGIを実行するとエラーが発生。

before
[果物テーブル]
キー 品名
1 リンゴ
2 スイカ

'3'、'みかん'レコードを追加するCGIを実行

after
[果物テーブル]
キー 品名
1 リンゴ
2 スイカ
3 みかん

エラーが発生。しかし、みかんレコードは追加されていた


<perlのinsertロジック>
use DBI;
$db = DBI->connect(DB, ユーザ, パスワード, {RaiseError => 1});

$sql = "insert into 果物テーブル(キー,品名) values('3','みかん')";
$sth = $db->prepare($sql);
$sth->execute;
$sth->finish;


<行った調査内容>
・キー項目値を自動採番に変更
キー項目値を自動採番するロジックを追加しCGIを実行。
before
[果物テーブル]
キー 品名
1 リンゴ
2 スイカ

最終レコードのキー項目'2'に1加算し'3','みかん'レコードを追加するCGIを実行

after
[果物テーブル]
キー 品名
1 リンゴ
2 スイカ
3 みかん
4 みかん

身に覚えのない'4','みかん'レコードが作られていた。
2回insertが実行されている!?

・insertロジック実行回数調査
insertロジックが2回走っていると思い、insertロジックを通った回数を
変数にセットし画面表示を行った。

insertロジックは1回だけしか動いてない。
でも2レコード追加されている。

・MySQLでinsertを実行
MySQLのコマンドライン上で1レコード追加するinsertを発行。

正しく1レコードだけインサートされる。


以上

不足な情報が御座いましたら、ご指摘をお願い致します。
宜しくお願いします。
藍空
常連さん
会議室デビュー日: 2003/06/24
投稿数: 49
投稿日時: 2004-03-27 20:12
Apache経由でCGIとして実行されたのであれば、以下のようなこと
が考えられるのではないでしょうか?

insertロジックを通った回数の測定方法として、CGI内でのみ有効
な変数で計測したのであれば、insertロジックが1回しか呼び出
されなかったとしても、そのCGIが2回呼び出されているという可
能性が考えられます。

利用するクライアント(ブラウザ)やタイミングなど条件によって
は、クライアント側から同じリクエストが再送されてしまうこと
が考えられると思いますので、Apacheのログなどで2回そのCGIが
呼び出されていないかご確認されてはいかがでしょうか?
boo
会議室デビュー日: 2004/02/27
投稿数: 9
投稿日時: 2004-03-29 14:03
藍空様こんにちわ。
返信が遅くなり申し訳御座いませんでした。

apacheのログを解析した所、ご指摘の通り
CGIが2回実行されておりました。
CGIのソースを解析した所
2回実行される原因が判明しました。

登録ボタン(INPUT type="image")を押すことにより
Insert処理が実行されるよう組んでいましたが
INPUTのtypeを"button"に変更する事で解決しました。

可能であれば”button”でなく”image”を使用したいのですが
”image”を使用しても2回実行されない方法が御座いましたら。
ご情報を頂けますでしょうか
宜しくお願いします。

boo
会議室デビュー日: 2004/02/27
投稿数: 9
投稿日時: 2004-03-29 15:24
>可能であれば”button”でなく”image”を使用したいのですが
>”image”を使用しても2回実行されない方法が御座いましたら。
>ご情報を頂けますでしょうか
>宜しくお願いします。

お世話になっております。
先ほどの上記、質問事項ですが
IEの不具合である事がわかりました。
↓情報元です。
http://support.microsoft.com/default.aspx?scid=kb;ja;822276

”image”を使用しない方向で考えてみます。
有難う御座いました。
1

スキルアップ/キャリアアップ(JOB@IT)