アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHP + MySQLのINSERTについて、不可解な現象が出ましたので、知っている方がいたら教えてください。

PHPでMySQLのデータ読み書きのプログラム(コマンドラインではなく、ブラウザで表示する)を書いたところ、PHPのプログラムの流れよりも、MySQLの書き込みが済んでしまっているような現象が発生しました。

プログラムソースの抜粋を以下に記述します。

################# PHPのプログラム抜粋開始 ##########

~ DB接続処理 ~

//==================================================
// STEP1:既に存在するデータを表示
//--------------------------------------------------
$sqltable= 'test';
$sqlcommand= "SELECT datadayo FROM $sqltable";
$sqlresult= mysql_query($sqlcommand, $sqllink) or die('ERROR');
while($tmpsqlread = mysql_fetch_array($sqlresult))
{
echo "$tmpsqlread[datadayo]<br>";
}

//==================================================
// STEP2:データ追加
//--------------------------------------------------
$sqlcommand= "INSERT INTO $sqltable (autoid,datadayo) VALUES (NULL,'書き込んだデータ')";
$sqlresult= mysql_query($sqlcommand, $sqllink) or die('クエリの送信に失敗しました。');


~ DBクローズ処理 ~

################# PHPのプログラム抜粋終り ##########




フローとしては、最初にSTEP1が処理されてSTEP2が処理されるはずです。


■プログラム開始の時の条件
データベースをCREATEした直後にこのプログラムを流す。(つまり空の状態)

■予想した結果
1.STEP1において、まだデータベースは空の状態なので、echo文では何も表示されない。
2.STEP2において書き込まれる。
3.再度このプログラムを流す
4.STEP1において、上記2で書き込んだデータが表示される。

■実際の結果
STEP1において、まだデータベースは空の状態のはずなのに、echo文で「書き込んだデータ」が表示される。



今まで、何度もこの手のプログラムを作成しましたが、このような現象は初体験です。
書き込みタイミングの遅延による現象ではなく、むしろ書き込みが早すぎる事による(PHPの処理が来る前にMySQLが処理されている)現象です。



PHPのバージョンは
PHP 5.2.11 with Suhosin-Patch 0.9.7 (cli)

MySQLのバージョンは
Ver 14.14 Distrib 5.1.39

です。



どなたか、ご存知の方、ご教授いただけたら幸いです。

A 回答 (2件)

単に2回実行されているということはありませんか?



私も以前似たようなケースでハマったことがあり、その際はとあるセキュリティソフトがURLを先読みしていたのが原因でした。
(セキュリティソフトがURLを先読みした後、自分がクリックするから2回実行される)

mysql_queryを自分の関数で置き換えてログを取る等、どのような順番でSQL文が発行されているのかロギングして原因を調査するのが良いと思います。
    • good
    • 0

いくつかの流れでやっている処理でしょうか?


$sqlresultをmysql_free_result()で開放していますか?

http://www.php.net/manual/ja/function.mysql-free …

この回答への補足

以下のように、書き込む処理(DB接続処理その2)の前に読み込むだけのDB接続(DB接続処理その1)をしても、なぜかSTEP0の段階で、STEP2で書かれるはずのデータを読み込めています。
DB接続を完全に分けていても、同じ現象が発生します。


################# PHPのプログラム抜粋開始 ##########


//==================================================
// DB接続処理その1(書き込まれる処理の無いSQL文)
//--------------------------------------------------
DBをここでオープン。記述は割愛してます。
//==================================================
// STEP0:既に存在するデータを表示
//--------------------------------------------------
$sqltable= 'test';
$sqlcommand= "SELECT datadayo FROM $sqltable";
$sqlresult= mysql_query($sqlcommand, $sqllink) or die('ERROR');
while($tmpsqlread = mysql_fetch_array($sqlresult))
{
echo "$tmpsqlread[datadayo]<br>";
}
mysql_free_result($sqlresult);
//==================================================
// DBクローズその1
//--------------------------------------------------
DBをここでクローズ。記述は割愛してます。


//==================================================
// DB接続処理その2
//--------------------------------------------------
DBをここでオープン。記述は割愛してます。
//==================================================
// STEP1:既に存在するデータを表示
//--------------------------------------------------
$sqltable= 'test';
$sqlcommand= "SELECT datadayo FROM $sqltable";
$sqlresult= mysql_query($sqlcommand, $sqllink) or die('ERROR');
while($tmpsqlread = mysql_fetch_array($sqlresult))
{
echo "$tmpsqlread[datadayo]<br>";
}
mysql_free_result($sqlresult);

//==================================================
// STEP2:データ追加
//--------------------------------------------------
$sqlcommand= "INSERT INTO $sqltable (autoid,datadayo) VALUES (NULL,'書き込んだデータ')";
$sqlresult= mysql_query($sqlcommand, $sqllink) or die('クエリの送信に失敗しました。');
//==================================================
// DBクローズその2
//--------------------------------------------------
DBをここでクローズ。記述は割愛してます。


################# PHPのプログラム抜粋終り ##########

補足日時:2011/07/21 15:38
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

> $sqlresultをmysql_free_result()で開放していますか?

全てのSELECT文において、値を取得した直後に開放しましたが現象は変わりませんでした。

$sqltable= 'test';
$sqlcommand= "SELECT datadayo FROM $sqltable";
$sqlresult= mysql_query($sqlcommand, $sqllink) or die('ERROR');
while($tmpsqlread = mysql_fetch_array($sqlresult))
{
echo "$tmpsqlread[datadayo]<br>";
}
mysql_free_result($sqlresult);



> いくつかの流れでやっている処理でしょうか?

はい、そうです。
ウェブ画面で、入力された値に不正(ダブリ)が無いことをSELECT文で確認する等。SELECT文のブロックを経由(STEP1を複数作業)してから、INSERTしています。

似たようなプログラムは何度も記述したことがあり、今までこのような現象は出たことがありません。
更に困ったことに、実はこの現象は毎回発生するのではなく、2~3回に一度発生します。(作業手順が同じにもかかわらず、発生タイミングはランダム)

お礼日時:2011/07/21 15:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!