簡體   English   中英

在插入多個表的情況下表索引干擾

[英]Table indexing interference in case of inserting into multiple tables

我正在使用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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM