複数の挿入操作を実行したり、トランザクションでデータを挿入したりすると、特にマルチスレッドまたはマルチユーザーの同時アクセスの場合、 mysqli-> insert_idを介して自動侵入IDを直接読み取ることが不正確である可能性があります。プリプロセッシングステートメントの$ insert_idプロパティを使用して、現在のステートメントの影響を受けたIDIDが取得されるようにすることができます。
mysqli_stmt :: $ insert_idは、 PHP 8.1以降のバージョンに追加された新しい属性です。これは、前処理ステートメントを実行した後、自己増加IDを取得するために特に使用されます。 $ mysqli-> insert_idよりも正確で安全です。
次の例は、トランザクションで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();
?>
トランザクションで挿入操作を実行するときは、最初に$ mysqli-> begin_transaction()を呼び出して、トランザクションを開始します。操作が完了したら、 $ mysqli-> commit()を呼び出して送信します。失敗した場合は、 $ mysqli-> rollback()を呼び出してロールバックします。
MySQLI_STMT PREPROCESSINGステートメントを使用して挿入を実行して、SQL注入のリスクを回避します。
挿入が成功したら、 $ stmt-> insert_idを介してこの挿入の自動インクリメントIDを取得して、精度を確保します。
データの一貫性と整合性を確保するために、例外処理中にトランザクションをロールバックする必要があります。
mysqli_stmt :: $ insert_idは、 PHP 8.1以降でのみ利用可能です。 PHPの古いバージョンを使用している場合は、 $ mysqli-> insert_idを使用することを検討できますが、同時実行の問題に注意してください。