Я работаю над сценарием регистрации пользователей PHP, и по некоторым причинам я не хочу вставлять все пользовательские данные в одну таблицу, поэтому я разделил таблицу на несколько меньших, и вот мой код:

<?php

$conn->autocommit(FALSE);

$stmt1 = $conn->prepare("INSERT INTO members (username,password,salt) VALUES (?,?,?);");
$stmt2 = $conn->prepare("INSERT INTO members_details (first_name,last_name,gender) VALUES (?,?,?);");
$stmt3 = $conn->prepare("INSERT INTO members_following DEFAULT VALUES;");
$stmt4 = $conn->prepare("INSERT INTO members_skills DEFAULT VALUES;");

$stmt1->bind_param("sss",$username,$hashed_password,$salt);
$stmt2->bind_param("ssi",$first_name,$last_name,$gender);
$stmt1->execute();
$stmt1->close();
$stmt2->execute();
$stmt2->close();
$stmt3->execute();
$stmt3->close();
$stmt4->execute();
$stmt4->close();

$conn->close();
?>

Q1: Все таблицы имеют uid автоматического увеличения. Я знаю, что запросы sql выполняются последовательно, но если два человека регистрируются одновременно, возможно ли, что один из пользователей получит uid другого?

Q2: Возможно ли, что один из запросов в серии приведет к ошибке для первого пользователя, а следующий пользователь получит неправильный uid? Могу ли я что-нибудь сделать, чтобы откатить изменения, внесенные в базу данных, в случае такой ошибки?

0
Maziyar 18 Фев 2018 в 15:36

1 ответ

Лучший ответ

Я покопался и пришел к идее. Я думаю, это более законный подход:

Я должен создать таблицу "members" с идентификатором автоматического увеличения. Выполните первый запрос:

"INSERT INTO members (username,password,salt) VALUES (?,?,?);"

Поэтому я получаю автоматически сгенерированный идентификатор с помощью mysqli_insert_id (), затем я запускаю следующие запросы, используя сгенерированный идентификатор. Итак, мой код будет примерно таким:

$stmt1 = $conn->prepare("INSERT INTO members (username,password,salt) VALUES (?,?,?);");

$stmt1->bind_param("sss",$username,$hashed_password,$salt);
$stmt1->execute();
$stmt1->close();

$generated_id = mysqli_insert_id($conn); //returns auto generated id in stmt1


$stmt2 = $conn->prepare("INSERT INTO members_details (uid,first_name,last_name,gender) VALUES (?,?,?,?);");

$stmt2->bind_param("issi",$generated_id,$first_name,$last_name,$gender);
$stmt2->execute();
$stmt2->close();
$conn->close();
?>

Таким образом, идентификатор для каждого пользователя остается уникальным, и нет никаких шансов, что пользователь получит идентификатор, созданный для другого пользователя.

0
Maziyar 18 Фев 2018 в 17:36