如果第二个查询不起作用,则删除或撤消第一个查询
我对此感到困惑。有什么方法可以测试所有查询是否都有效并且不返回错误?如果是这样,请执行它们或返回一些东西。
我正在构建一个注册方法,它有 2 个部分:loginInfo(用户名、密码)和通常的员工信息(姓名、电子邮件等)。
signup 方法将员工信息插入employee表中,然后获取 PRIMARY 键并将其与login表中的 loginInfo 一起插入
该login表有一个UNIQUE列,这应该在重复时返回错误。问题是employee插入的login信息没有信息。
我怎么解决这个问题?
我的代码:
public function signUp($personInfo, $employeeInfo, $loginCredit){
try {
$stmt = $this->pdo->prepare("INSERT
INTO `$this->employeeTable`
(`name`, `birthDay`, `phnNmb`, `email`, `address`, `idnNmb`, `insNmb`, `bankInfo`)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?);
");
$stmt->execute([
$personInfo["name"],
$employeeInfo["birthDay"],
$personInfo["phnNmb"],
$personInfo["email"],
json_encode($employeeInfo["address"]),
$employeeInfo["idnNmb"],
$employeeInfo["insNmb"],
json_encode($employeeInfo["bankInfo"])
]);
$employeeId = $this->pdo->lastInsertId();
$insertloginCredit = $this->pdo->prepare("INSERT INTO `$this->loginTable` (`empId`, `userName`, `userPass`) VALUES ($employeeId, ?, ?);");
$insertloginCredit->execute($loginCredit["userName"], md5($loginCredit["userPass"]));
echo "done";
} catch (PDOException $err) {
die($err->getMessage());
}
}
回答
您在此处寻找的内容称为交易。PDO 文档对它们有一些解释。总之,您需要执行以下操作。
try{
$this->pdo->beginTransaction();
$stmt1 = $this->pdo->prepare(...);
$stmt1->execute(...);
$stmt2 = $this->pdo->prepare(...);
$stmt2->execute(...);
$this->pdo->commit();
} catch (PDOException $e) {
$this->pdo->rollBack();
}
该rollBack函数会将数据库恢复到beginTransaction调用时的状态。