SQLが2回実行される状況に陥ってしまう原因と対処法

このQ&Aのポイント
  • 質問文章でPHPのプログラムを実行する際に、SQLが2回実行されてしまう問題が発生しています。
  • 原因としては、同じプログラムの他の部分で同様な実行が行われている可能性があるため、それが原因ではないか確認することが必要です。
  • また、XAMPP環境では問題が発生しないが、ロリポップ上で再現するということから、環境依存の可能性も考えられます。
回答を見る
  • ベストアンサー

1回しか実行していないはずが、2回SQLが実行?

リンクをクリックするとPHPで以下のようなINSERT文が中で実行されるプログラムを記述しました。 実行したところ、当然画面には「*」が一つだけ表示されるのですが、 なぜがSQL自身が2回実行されてしまう状況に陥りました。 echo "*"; $sql0 = 'INSERT INTO wakuwaku (customer_id,comment ,up_date,type,var_id) VALUES ( ?,?, ?, ?,?)'; $message = "わくわくが追加"; $type0 = array('integer','text', 'timestamp', 'text','integer'); $data0 = array($target_custid,$message,$upp_date,"iine_click",$target_id); $sth0 = $mdb2->prepare($sql0, $type0, MDB2_PREPARE_MANIP); $res0 = $sth0->execute($data0); 別の部分で同様な実行をしている可能性を考えて、上記の$messageをAAA等の他の文字列に 変えたところ、変えた文字列で2重実行されたので、はやり上記のSQLがなぜか2回実行されているようです。 まわりにfor文などはなく、*が一回しか表示されていないことからも、 プログラム自体の実行は1巡だけだとおもうのですが、なぜSQL部分だけ2重に実行されるのでしょうか。 ちなみに、エラーの表示はありません。 さらに、自端末のXAMPP環境下では、上記の問題は発生せず、 なぜか、ロリポップ上で動かすと、再現するようです。 いろいろ切り分けを行ったのですが、正直お手上げです。 切り分け方法を含めて、アドバイスいただけると幸いです。 よろしくお願いいたします。

  • mmei
  • お礼率74% (120/161)
  • MySQL
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

連投失礼します。 詳細報告がどこかに無いかと思って、「firefox 2回実行」で検索したら以下の記事が見つかった。 私の状況と同じ。デバッグ文字列を最初に出力してて、htmlとして不整だからって、なんで再実行するんでしょうね? http://blog.nanbu.com/blog/blog1/detail-284.html

mmei
質問者

お礼

早々のアドバイスありがとうございます。早速ブラウザを変えて何度かためしたのですが、結果変わらずです・・・。 ちなみに、SQLの投入時刻を調査したところ、二重投稿の間隔は4-6秒程度あいていることがわかりました。

その他の回答 (1)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

ブラウザのせいってことはないですか? 以前に、FireFox2 で、post送信ではなくリンクから開いたページでinsert を行おうとすると、リンク先のページ情報取得(ナビ取得というやつかな?)を先におこなうらしくて、一回しかクリックしてないのに2回実行になったことがあった。御質問の状況と同じく、localhost ではなく、本番サーバーへアップした場合におきたように記憶してます。 opera9では、そういったことはおきなかった。最近では、operaしか使ってないので、ちょっと記憶がやや不確かですけど。

関連するQ&A

  • MDB2のプリぺアドステートメントについて

    MDB2のプリぺアドステートメントを使用してテーブルデータを取得する際に、 下記のように、$types で型指定をするのが一般的のようですが、 この型指定をせずにデータを取得する事は可能なのでしょうか? (公式マニュアルでは指定したものしか見当たらなかったもので…) ------------------------------------------- $sql = "select * from table where id = ? and name = ?"; $types = array('integer', 'text'); $sth = $mdb2->prepare($sql, $types, MDB2_PREPARE_RESULT); $data = array(1, 'hoge'); $res = $sth->execute($data); ------------------------------------------- また、指定せずに取得出来るのであれば、 指定した場合と指定しなかった場合で何が違うのかも教えて頂けると幸いです。 以上、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • MDB2 プリペアードステートメントについて

    顧客情報管理システムを開発居しています。 下記のコードはMDB2を使用して、既に入力された情報を変更するための物をテストのため簡略化した物(のはず)ですが、$res = $sth -> execute ($data);の部分でエラーが発生してしまいます。 おそらくプリペアードステートメントの問題だと思い調べてみましたがお手上げです。。 知っている方からすればかなり馬鹿らしい間違いだと思いますが。。。 教えて下さい。 ちなみにmySQLを使用しています。 <?php //DBへの接続に必要な処理は完了し、$mdb2と言うオブジェクトは既に存在している。 $sql = "UPDATE customer_list SET name = ?,post = ?,address = ?,email = ? WHERE code = ?"; $typ = array("text","integer","text","text","integer"); $sth = $mdb2 -> prepare($sql,$typ); $data = array($_POST['name'],$_POST['post'],$_POST['add'],$_POST['email'],$_POST['code']); echo $data; $res = $sth -> execute ($data); ?>

    • ベストアンサー
    • PHP
  • 実行したSQLの結果を返す方法

    VBでSQLを発行、及び実行をし、 MDBを更新する処理を作成しています。 各SQLの実行(SELECT、INSERT、DELETE等)が 成功or失敗したかどうかを判定するには どのようにすれば良いのでしょうか? ソースのイメージとしては↓のような感じです。 Dim db As DAO.Database 'DB設定 Set db = OpenDatabase(DB名) 'SQL実行 db.Execute (DB内で作成したSQL) 【実行したSQLの正常終了の判定】 【実行メッセージ(成功or失敗)出力】

  • mysql insert文

    恐れ入ります。 input 送信で、perl にてレコードをinsertしたいのですが、なかなかうまくいきません。 <form action="./xxx.cgi" method="post"> <input type ="hidden" name=num></input> <input type="text" name="col1"></input> <input type="text" name="col2"></input> <input type="text" name="col3"></input> <input type="submit" value="登録"> </form> として送信して、 $sql = "insert into kensou(num,col1,col2,col3) "; $sql.="values('$form{num}','$form{col1}','$form{col2}','$form{col3}')"; # SQL実行 $sth = $db->prepare($sql); if(!$sth->execute){ print "SQL失敗\n"; exit; } で受け取ろうとしているのですが、うまくいきません。 どなたかご教授いただけないでしょうか。

  • PHP+PDO+MYSQL で実行されたSQL文の取得について

    PHP+PDO+MYSQL で実行されたSQL文の取得について PEARのDBからPDOへの移行をしていましてデバック用のSQL文取得で困っています。 $sql = "SELECT * FROM sample where id = ? And id2 = ?" PEARのDBでは $db->query($sql,array(1,5)); $db->last_query; で実行したSQL文を取得することは可能でした。 PDOの場合 $sql_result = $pdo->prepare($sql); $sql_result->execute(array(1,5)); でリプレースフォルダ(クォート処理?)を利用してSQLを実行出来るようですが、 実行したSQLを確認する方法がマニュアル等を読みましたがどうしても分かりません。 どなたかご存知の方がいらっしゃいましたらご教授お願い致します。

    • ベストアンサー
    • PHP
  • 一回の処理で、2回以上データベースに対してアクセスできない??(perlDBIを使用)

    質問があるのですが、よろしくお願いします。 use DBI; $dbuser = 'root'; $passwd = 'abc'; $db = DBI->connect('DBI:mysql:DB:localhost',$dbuser, $passwd); $prepare = "select MAIL from user where USER_ID = $userid"; $sth->prepare("$prepare"); $sth->execute; @user = $sth->fetchrow_array; $sth->finish; while( ($key, $value) = each %in ){ $sth = $db->prepare("UPDATE user SET $key = '$value' where USER_ID = $in{userid}"); $sth->execute; $sth->finish; } $db->disconnect; という処理を行わせたいのですが、どうもUPDATE文の辺りで、処理が止まってしまっているようなのです。select文はしっかり実行されている形跡があるのですが、1回の処理で2回以上データベースに対してアクセスすることは出来ないのでしょうか? どなたか分かる方いらっしゃいましたらご教授のほどよろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLが応答しなくなっているのか、CGIが読み込み中のままになってしまいます。

    SQLを約1600回実行したら、5秒後にページを再読み込みします。 print "<html><body onload=\"setTimeout('location.reload()',5000)\">"; foreach ... {   ...   # 約1600回繰り返す   @result = select("SQL文");   ... } sub select{   my @result = ();   my($dbh, $sth);   $dbh = DBI->connect('DBI:mysql:データベース:localhost', "ID", "パスワード") or return 0;   $sth = $dbh->prepare("$_[0]");   $sth -> execute() or return 0;   $num_rows = $sth->rows;   $num_of_fields = $sth->{NUM_OF_FIELDS};   $result[0] = $sth->rows;   for ($i=1; $i<=$num_rows; $i++) {     @fetchrow_array = $sth->fetchrow_array;     $result[$i] = join ',', @fetchrow_array   }   $sth -> finish();   $dbh -> disconnect();   return @result; } 最初の1,2回は期待通りに動くのですが、 2,3回ほど再読み込みをすると、「読み込み中」のままになってしまいます。 (期待通りに動く場合、1回の読み込みは20秒程度です。) タスクマネージャを見ると、 期待通りに動いているときは、CPU使用率が60%くらいになっていますが、 「読み込み中」のままの時は1%程度になっています。 SQLサーバーから応答がなくなっているのでしょうか? (簡単なSQLにしてみても同じでした。) 原因がわかる方、よろしくお願いします。 WindowsXP SP2 Apache1.3 ActivePerl5.6 MySQL3.23

    • ベストアンサー
    • CGI
  • レコード削除・sqlインジェクション対策

    このようなSQL文は危険でしょうか? $sql = "delete テーブル名 where id = :id"; $stmt = $dbh->prepare($sql); $stmt->execute(array(":id" => $_POST['id'])); 上記の例だと、$_POST['id']は、 ちゃんとエスケープできているのでしょうか?

    • ベストアンサー
    • MySQL
  • ハッシュのキー追加について

    とある既存プログラムに機能追加したいのですが上手くいきません。 ハッシュだとは思うのですが、%だったり$だったりしてよくわからなくなってしまいました。 どこがおかしいか教えていただけないでしょうか。 <概要> もともとあった(1)と(3)の処理の間に、(2)を行う <ソース> (1)DBから1レコードを取得する $sql = "select * from tenpo where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); $shop = $sth->fetchrow_hashref(); (2)別TABLEから値を取得し、(1)に追加する $sql = "select todoufuken from area where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); @todoufuken= $sth->fetchrow_array; $shop{place} = $todoufuken[0]; (3)$shopの情報をサブルーチンに渡す ソース略

    • ベストアンサー
    • Perl
  • PDOで文字列が正しく書けない

    PHP5.5(Windows 32bit) with PDO(PostgreSQL) + PostgreSQL 9.3(64bit) + Windows 7 です。 id(integer PK), text1(text), text2(text) の列を持つテーブル test に対して  INSERT INTO test (id, text1, text2) VALUES (41, '\', '<?xml version="1.0"?>') を pgp admin で実行すると正常に行がインサートされます。ところが PDO の prepare にこの SQL を単純に渡して実行すると text2 に <$1xml version="1.0"$2> というおかしな文字列がセットされてしまいます。 どうも 直前の列データが '\' というように、末尾が \ になっている文字列を渡す時だけ 次の列データ '<?xml version="1.0"?>' の中の ? がプレースホルダーとして処理されるっぽいのです。 どう考えてもPDOのバグのような気がするのですが、お心当たりのバグや回避方法などありましたら よろしくお願い致します。

    • 締切済み
    • PHP