0

つまり、2つのInnoDBテーブル、従業員、および会社があります。try / catchブロックを使用して、トランザクションに2つのクエリを挿入します。ただし、最初のクエリで明示的な間違いをした場合(従業員ではなく従業員という間違ったテーブル名を入力した場合)、データベースはもちろんそのクエリの行を挿入しませんが、2番目のクエリは実行されてコミットされますロールバックする代わりにデータベース(最初のクエリの挿入に失敗したため)。

結果は従業員のテーブルですが、会社のテーブルは新しいレコードになります。ここで何が欠けていますか?最初のクエリが挿入されていないので、ロールバックするべきではありませんか?

$employee_id = 2;
$employee_name = 'Marky Mark';

try {
   $dbh->beginTransaction();
   $query = "INSERT INTO employee (employee_name) VALUES (:employee_name)";
   $insert_emp = $dbh->prepare($query);
   $insert_emp->execute(array(':employee_name' => $employee_name));

   $Employee_id = $dbh->lastInsertId();


   $query = "INSERT INTO companies (company_name,employee_id) VALUES ('SO',:Employee_id)";
   $insert_emp_comp = $dbh->prepare($query);
   $insert_emp_comp->execute(array(':Employee_id' => $Employee_id));
   $dbh->commit();
} catch (Exception $e) {
   $dbh->rollBack();
   echo "Failed: " . $e->getMessage();
}
4

1 に答える 1

5

PDOは、デフォルトでは例外をスローしません。例外をスローするように構成する必要があります。

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

PDOがエラーを処理する方法の詳細については、このページを確認してください。

于 2012-04-13T18:30:52.307 に答える