0

今まで見たことのない問題に遭遇しました。コードが多すぎて大きすぎてクラスが多すぎるので、あまり詳しく説明しなくてすみません。興味深い点はこれです:

$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 XXXXXXXXattendees ( 、、、、、、、、、、、、 )値( '305' contactid、 'Mr' title、 'Alex' forenames、 'Werner' surname、 '' relationship、'M'、 '29/08/1981'、 '0 gender' agearrived' '、''、' 0');'leftsupervisedics_number

クエリIDの後:305

しかし、実際にデータベースにアクセスすると、挿入される値は古いid値(たとえば294)です。テーブル列は自動インクリメントではなく、一意でもプライマリでもありません。単にint(11)です。

いったい何がこれを引き起こしているのでしょうか?

4

1 に答える 1

2

問題はmysql_last_insert_id、最後に挿入された行のIDを取得するために使用していることである可能性があります。複数の行を挿入しているため、正しいIDを取得できない可能性があります。

mysql_last_insert_id呼び出しを最後の挿入のIDを返すクエリに置き換えselect、問題が解決したかどうかを確認します。

于 2013-03-26T21:24:20.987 に答える