今まで見たことのない問題に遭遇しました。コードが多すぎて大きすぎてクラスが多すぎるので、あまり詳しく説明しなくてすみません。興味深い点はこれです:
$copy = clone $this;
$copy->workerid = $new_workerid;
if ( $copy->mysql_create_row( $this->pending_table ) )
return $copy;
これは期待どおりに実行されます。データベースにアクセスすると、テーブルPendingに新しいエントリが表示されます。
ただし、複数のクエリを連続して実行すると、次のようになります。
$copy = clone $this;
$copy->workerid = $new_workerid;
if ( $copy->mysql_create_row( $this->pending_table ) )
if ( $this->mysql_delete_row( $this->pending_table ) )
if ( $this->mysql_create_row( $this->cancelled_table ) )
return $copy;
次に、説明のつかない理由で、間違ったid列がテーブルの1つに挿入されました。特定のメソッドでは、$ copy-> mysql_create_rowは、とりわけ、これを行います。
if ( $con = db_connect() ) {
$res = mysqli_query( $con, "INSERT INTO $table (`workerid`,`time`,`location`,`tasks`) VALUES ('$this->workerid','$this->datetime','$this->location','$this->tasks');" )
or error_log( "mysql_create_row Error: " . mysqli_error( $con ) );
if ( $res ) {
$this->contactid = mysqli_insert_id( $con );
foreach ( $this->attendees as $att ) {
$att->__setContactId( $this->contactid );
if ( !$att->mysql_create_row( $this->attendee_table ) ) {
error_log( " Contact->mysql_create_row Error: Did not create attendee MySQL row" );
return false;
}
オブジェクトメソッド$att->mysql_create_row($ this-> attendee_table)による委任は同じように機能し、単なるINSERTクエリです。
ここで、意味がありません。新しく挿入された$copyオブジェクトは$copy-> mysql_create_rowに正しいIDを挿入しますが、$att->mysql_create_rowは挿入しません!!! 古いIDを挿入します。さらに、$ att-> mysql_create_rowからクエリをエコーアウトすると、正しい(新しいID)がエコーアウトされます!!!
しかし、実際のデータベースにアクセスすると、古いIDが挿入されています。これは私にはまったく意味がありません。
カスタムの__clone()メソッドを作成しようとしましたが、参照ではなくコピーがあることを確認してください(phpを酷評します)が、それでも同じエラーが発生します。
問題は、削除または新しい挿入を行わない場合は問題がないため、連続するクエリにあるようです。
削除は正常に機能し、2番目の挿入もエラーなしで正常に機能します。
クエリが正しいIDをエコーしているときに、MySQLi APIに間違ったIDを挿入させる可能性があるのは何ですか?なんらかのバックグラウンド/マルチスレッドの破損しかできませんでしたが、この種のことを制御できないため、問題に取り組む方法すらわかりません。
$ att-> mysql_create_rowからクエリをエコーアウトすると、次のようになります。
クエリIDの前:305
'INSERTINTO
XXXXXXXX
。attendees
( 、、、、、、、、、、、、 )値( '305'contactid
、 'Mr'title
、 'Alex'forenames
、 'Werner'surname
、 ''relationship
、'M'、 '29/08/1981'、 '0gender
'age
、arrived
' '、''、' 0');'left
supervised
ics_number
クエリIDの後:305
しかし、実際にデータベースにアクセスすると、挿入される値は古いid値(たとえば294)です。テーブル列は自動インクリメントではなく、一意でもプライマリでもありません。単にint(11)です。
いったい何がこれを引き起こしているのでしょうか?