【问题标题】:delete or undo the first query if the second query did not work如果第二个查询不起作用,则删除或撤消第一个查询
【发布时间】:2021-04-08 17:39:53
【问题描述】:

我对此感到困惑。有什么方法可以测试所有查询是否正常工作并且不返回错误?如果是这样,执行它们或返回一些东西。

我正在构建一个注册方法,它有 2 个部分:登录信息(用户名、密码)和通常的员工信息(姓名、电子邮件等)。

注册方法将员工信息插入employee 表,然后获取主键并将其与login 表中的登录信息一起插入

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());
    }
}

【问题讨论】:

  • 你以错误的架构方式进行操作,登录和注册应该在同一张桌子上
  • @Psycho 为什么登录和注册应该在同一张桌子上?员工详细信息可能会在程序中其他不需要登录详细信息的区域使用 - 同样登录/注销、密码重置和暂停帐户等登录功能无需了解用户个人资料详细信息
  • 是的,如果您将表类型定义为 InnoDB,您可以撤消上一次插入。 see this question
  • 好的,我明白了
  • @imposterSyndrome 感谢大家提供信息。

标签: php mysql mariadb


【解决方案1】:

您在此处查找的内容称为交易。 PDO 文档有一些explanation on them。总之,您需要执行以下操作。

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 时的状态。

【讨论】:

  • 谢谢。是的,这就是我一直在寻找的。好名字顺便说一句。 :)
  • 只是一些注意事项:如果您有自动递增的主键,那么如果您在使用 rollback 操作时发生任何异常,则可能会丢失一些键。我之所以提到这一点,是因为我在这里遇到了一些问题。
猜你喜欢
  • 2015-03-16
  • 2018-12-18
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2020-01-24
相关资源
最近更新 更多