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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- MySQL mysqlがインストールされているのかどうか 1 2023/06/05 14:19
- MySQL mysqlがインストールされているのかわかりません 1 2023/06/05 02:26
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- JavaScript Typescript が必要な理由 1 2023/01/07 11:45
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- MySQL MySQL,JavaScript,PHPコードの結果を表示する方法を教えてください。 1 2023/02/13 17:49
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLです。あってますか?↓
-
テーブル名が可変の場合のクエ...
-
SQLです教えてくださいお願いし...
-
SQLです下記の問合せを行うクエ...
-
int(11)の(11)とは何を意味して...
-
SQLです教えてくださいお願いし...
-
下記の問合せを行うクエリを、 ...
-
#1062 - '0' は索引 'PRIMARY' ...
-
SQLでカラムを追加し、条件に合...
-
データベースの接続に失敗して...
-
SQLです。下記の問合せを行うク...
-
select *, `人口(男)`AND`人口(...
-
PhpMyAdminで作成して実行せよ...
-
2つのテーブルを結合するときに...
-
mysqlで INSERT と SELECTの用途は
-
レコードの削除で delete from ...
-
sqlのエラー
-
同一のユーザー、同一商品のと...
-
SQL文のエラー
-
Xサーバーのバックアップで全サ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XAMPPでのMySQL各種設定保存場...
-
csvファイルを自動で取り込み(...
-
別サーバのデータベースの読み込み
-
かねやんMySQLAdmin
-
PHP+MySQLでのINSERTの処理遅延
-
ログインシステムについて
-
データベースファイル(.db)を開...
-
PL/SQLで@ファイル名が反応しま...
-
あるDBから別のDBのテーブルをs...
-
PL/SQLをWindowsのBATファイル...
-
html上でMySQLにアクセス(Java...
-
sql*loader 数値のロード
-
同じSQL文で極端に検索が遅くな...
-
数字で「そ」と「り」
-
mysqlにおけるホストのパーセン...
-
create databaseがうまくいきま...
-
SQLServerのselect文でデータ数...
-
作成したレコードセットのCSV出...
-
バッチファイルではパスワード...
-
mySQLのデータベースにhtmlのコ...
おすすめ情報