現在の位置: ホーム> 最新記事一覧> トランザクション処理でmysqli_stmt :: $ insert_idと組み合わせて正しい挿入IDを取得するにはどうすればよいですか?

トランザクション処理でmysqli_stmt :: $ insert_idと組み合わせて正しい挿入IDを取得するにはどうすればよいですか?

gitbox 2025-06-03

1.トランザクションおよび挿入ID取得の課題

複数の挿入操作を実行したり、トランザクションでデータを挿入したりすると、特にマルチスレッドまたはマルチユーザーの同時アクセスの場合、 mysqli-> insert_idを介して自動侵入IDを直接読み取ることが不正確である可能性があります。プリプロセッシングステートメントの$ insert_idプロパティを使用して、現在のステートメントの影響を受けたIDIDが取得されるようにすることができます。

2。mysqli_stmt :: $ insert_idの紹介

mysqli_stmt :: $ insert_idは、 PHP 8.1以降のバージョンに追加された新しい属性です。これは、前処理ステートメントを実行した後、自己増加IDを取得するために特に使用されます。 $ mysqli-> insert_idよりも正確で安全です。


3。サンプルコード

次の例は、トランザクションでmysqli_stmtを使用して挿入操作を実行し、挿入レコードのIDを取得する方法を示しています。

 <?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");

// トランザクションを開始します
$mysqli->begin_transaction();

try {
    // 前処理挿入ステートメント
    $stmt = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");

    $username = 'alice';
    $email = '[email protected]';

    $stmt->bind_param("ss", $username, $email);

    // 挿入を実行します
    $stmt->execute();

    // 挿入します ID
    $insertId = $stmt->insert_id;

    echo "新しく挿入されたユーザーIDはい: " . $insertId . "\n";

    // トランザクションを送信します
    $mysqli->commit();

    $stmt->close();
} catch (Exception $e) {
    // ロールバックトランザクションが発生しました
    $mysqli->rollback();
    echo "トランザクションは失敗しました,ロールバック。エラーメッセージ: " . $e->getMessage();
}

$mysqli->close();
?>

4。キーポイントの概要

  • トランザクションで挿入操作を実行するときは、最初に$ mysqli-> begin_transaction()を呼び出して、トランザクションを開始します。操作が完了したら、 $ mysqli-> commit()を呼び出して送信します。失敗した場合は、 $ mysqli-> rollback()を呼び出してロールバックします。

  • MySQLI_STMT PREPROCESSINGステートメントを使用して挿入を実行して、SQL注入のリスクを回避します。

  • 挿入が成功したら、 $ stmt-> insert_idを介してこの挿入の自動インクリメントIDを取得して、精度を確保します。

  • データの一貫性と整合性を確保するために、例外処理中にトランザクションをロールバックする必要があります。


5。互換性の説明

mysqli_stmt :: $ insert_idは、 PHP 8.1以降でのみ利用可能です。 PHPの古いバージョンを使用している場合は、 $ mysqli-> insert_idを使用することを検討できますが、同時実行の問題に注意してください。