$link = mysqli_connect('127.0.0.1', 'my_user', 'my_pass', 'my_db');
mysqli_query($link, "INSERT INTO mytable (1, 2, 3, 'blah')");
$id = mysqli_insert_id($link);
Vedi mysqli_insert_id()
.
Qualunque cosa tu faccia, non inserire e quindi eseguire un "SELECT MAX(id) FROM mytable
". Come dici tu, è una race condition e non ce n'è bisogno. mysqli_insert_id()
ha già questa funzionalità.
Un altro modo sarebbe eseguire entrambe le query in una volta sola e utilizzare MySQL
LAST_INSERT_ID()
metodo, in cui entrambe le tabelle vengono modificate contemporaneamente (e PHP non ha bisogno di alcun ID), come:
mysqli_query($link, "INSERT INTO my_user_table ...;
INSERT INTO my_other_table (`user_id`) VALUES (LAST_INSERT_ID())");
Nota che ogni connessione tiene traccia dell'ID separatamente (quindi, i conflitti sono già prevenuti).