php - 插入多个表时表索引干扰

标签 php mysql

我正在编写一个 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?

问题 2:是否有可能该系列中的一个查询导致第一个用户出错,而下一个用户得到错误的 uid?如果发生此类错误,我可以做些什么来回滚对数据库所做的更改吗?

最佳答案

我做了一些挖掘,并提出了一个想法。我想这是一个更合理的考虑方法:

我应该创建一个带有自动增量 ID 的“成员”表。 运行第一个查询:

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

因此,我通过 mysqli_insert_id() 获取自动生成的 id,然后我将使用生成的 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();
?>

因此每个用户的 ID 保持唯一,并且用户不可能获得为另一个用户生成的 ID。

关于php - 插入多个表时表索引干扰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48851754/

相关文章:

php - 如何将sql数据放入php表中

php - 选择列值相同的行

PHP/mySQL登录不成功

c# - 错误 : Connection Entity Framework with MySQL C#

sql - 如何在 MYSQL 中优化此查询?需要做什么

php - 不小心用 PHP 设置了错误的 chmod

php - 在 PHP 中搜索 MySQL 表

mysql - 查询以查找数据库架构上的外键

MySQL ROUND 函数使用 round half down 而不是 half up

php - 如何在我的查询中使用日期格式?