0

im confused about this. Is there any way like to test if all queries are working and not returning erros? if so execute them or return something.

I am building a signup method, this have 2 parts: loginInfo(username, password) and the usual Employee info (name, email, etc..).

The signup method inserts the Employee info into employee table, then it gets the PRIMARY key and insert it alongside with the loginInfo in the login table

the login table has an UNIQUE column, this should return error on duplicated. The problem is that the employee info are inserted without a login information.

How can i solve this problem?

My code:

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());
    }
}
xDw.Co
  • 41
  • 5
  • you are doing it in a wrong architectural way, login and registration should be on the same table – Farhan Ibn Wahid Apr 08 '21 at 18:00
  • 1
    @Psycho why should login and registration be on the same table? The employee details are likely used elsewhere in the program in areas which don't require the login details - equally login functions such as logging in/out, password resets and suspending accounts have no need to know about the user profile details – imposterSyndrome Apr 08 '21 at 18:28
  • Yes, you can undo your last insert if you define table type as InnoDB. [see this question](https://stackoverflow.com/questions/2918831/how-can-i-undo-a-mysql-statement-that-i-just-executed) – Ehsan Apr 08 '21 at 18:34
  • okay I understand – Farhan Ibn Wahid Apr 09 '21 at 07:11
  • @imposterSyndrome thx guys for the information. – xDw.Co Apr 09 '21 at 20:47

1 Answers1

5

What you're looking for here is called a transaction. The PDO docs have some explanation on them. In summary, you'd want to do the following.

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

The rollBack function will restore the database to the state it was in when beginTransaction was called.

CerebralFart
  • 3,336
  • 5
  • 26
  • 29
  • 1
    Thank you. yeah this is what i was looking for. nice name btw. :) – xDw.Co Apr 09 '21 at 20:52
  • just some notes: if you have auto incremented primary keys then there might be some keys missing if any exception occurs when you use **rollback** operation. I am mentioning this because I faced some issues here. – Raju Ahmed Aug 20 '21 at 19:03