1

テーブルの行をコピー/複製してから、新しい行の「id」値を返す必要があります。私の「id」列は自動インクリメント フィールドです。

$sth = $dbh->prepare("DROP TEMPORARY TABLE IF EXISTS tmp_users;
                      CREATE TEMPORARY TABLE tmp_users
                          SELECT * FROM users 
                          WHERE user_id = $user_id
                      UPDATE tmp_users 
                          SET id = NULL;
                      INSERT INTO users 
                          SELECT * FROM tmp_users;
                      DROP TEMPORARY TABLE IF EXISTS tmp_users;");

$sth->execute();

これを行うと$id_new = $dbh->lastInsertId();「0」が返されますが、理由はわかりません。何か案は?

4

1 に答える 1

0

CREATE TEMPORARY TABLEクエリに構文エラーがあります。ステートメントの最後にセミコロンがありません:

CREATE TEMPORARY TABLE tmp_users
    SELECT * FROM users 
    WHERE user_id = $user_id
UPDATE tmp_users 
    SET id = NULL;

ステートメントが「問題なく実行される」と信じている場合でも、上記の抜粋の最後にセミコロンが1 つしかないことは明らかです。つまり、 2 つの別個のandステートメントではなく、構文エラーのある単一のステートメントです。CREATEUPDATE

PDO は複数ステートメントのクエリをうまく処理できず、エラーを報告していないようです。次のテストを実行しました。

$sth = $dbh->prepare("INSERT INTO test VALUES ('test1');
                      INVALID STATEMENT;
                      INSERT INTO test VALUES ('test2');");
$sth->execute();

ご覧のとおり、2 つの有効なステートメントの間に無効なステートメントが含まれていますINSERT。上記のコードを実行した後、テスト テーブルには'test1'値が挿入されただけですが、'test2'挿入は実行されず、PDO によってエラーは報告されませんでした。

構文エラーCREATE TEMPORARY TABLEにより、テーブルが実際に作成されず、残りのステートメントも正しく機能しなくなります。したがって、テーブルに新しい行が挿入されusersず、最後に挿入された ID も取得されません。

更新:これは、この PDO の動作に関する実際のPHP バグ レポートです。明らかにまだ解決されていません。

于 2012-10-28T16:27:36.323 に答える