
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
です。
どなたか、ご存知の方、ご教授いただけたら幸いです。
No.2ベストアンサー
- 回答日時:
単に2回実行されているということはありませんか?
私も以前似たようなケースでハマったことがあり、その際はとあるセキュリティソフトがURLを先読みしていたのが原因でした。
(セキュリティソフトがURLを先読みした後、自分がクリックするから2回実行される)
mysql_queryを自分の関数で置き換えてログを取る等、どのような順番でSQL文が発行されているのかロギングして原因を調査するのが良いと思います。
No.1
- 回答日時:
いくつかの流れでやっている処理でしょうか?
$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のプログラム抜粋終り ##########
アドバイスありがとうございます。
> $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回に一度発生します。(作業手順が同じにもかかわらず、発生タイミングはランダム)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mysqlがインストールされている...
-
#1062 - '0' は索引 'PRIMARY' ...
-
データベースの接続に失敗して...
-
[XAMPP Control Panel v3.2.4] ...
-
下記の問合せを行うクエリを、P...
-
テーブル名が可変の場合のクエ...
-
テーブル作成時のカラムについて
-
同一日に複数レコードがある場...
-
MAMP 99ドル約1.6万円 高い...
-
あってますか?SQL
-
WHERE `年月日` = '晴' OR `年...
-
SQLです教えてくださいお願いし...
-
SQLを作ったのですがうまくいき...
-
(初心者)MySQLやmaraDBで、crea...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
SQLです教えてください。
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
webアプリケーションリリース後...
-
csvファイルを自動で取り込み(...
-
MySQLのビット演算
-
XAMPPでのMySQL各種設定保存場...
-
PHP+MySQLでのINSERTの処理遅延
-
データベースファイル(.db)を開...
-
PL/SQLで@ファイル名が反応しま...
-
PL/SQLをWindowsのBATファイル...
-
sql*loader 数値のロード
-
あるDBから別のDBのテーブルをs...
-
mysqlにおけるホストのパーセン...
-
同じSQL文で極端に検索が遅くな...
-
utf8bomとutf8mb4の違いがいま...
-
メンテナンスプランについて
-
create databaseがうまくいきま...
-
MySQL4.1系でPHPが文字化けして...
-
SQLServerのselect文でデータ数...
-
【初心者です】SQLPLUSでのバッ...
-
複数行をINSERTで『ORA-00911: ...
-
数字で「そ」と「り」
おすすめ情報