私はPHPとMySQLデータベースでPDOを使用しています。私がしたいのは、挿入が失敗したとき(一意フィールドの重複エントリなど)、例外エラーメッセージがスローされ、変更がロールバックされる(私の場合は自動インクリメントにならない)ときです。なぜこのPDOロールバックが機能しないのですか?
これは私がやったものですが、それは動作しません:
私は間違って行くのですtry {
$email = $_POST['Email'];
$FirstName = $_POST['FirstName'];
$LastName = $_POST['LastName'];
$query="INSERT INTO subscriber (Email,FirstName,LastName,CreateDate) VALUES (?,?,?,CURDATE())";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $email , PDO::PARAM_STR);
$stmt->bindParam(2, $FirstName, PDO::PARAM_STR);
$stmt->bindParam(3, $LastName, PDO::PARAM_STR);
$stmt->execute();
}
catch(PDOException $e) {
die ($e->getMessage().'<a href="addSub.php"> Back</a>');
$conn->rollBack();
}
?
これは編集バージョンです(挿入する部分全体で)、それは間違いありませんか?おかげで、すべての
if($_SERVER['REQUEST_METHOD'] == "POST"){
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->beingTransaction();
try {
$email = $_POST['Email'];
$FirstName = $_POST['FirstName'];
$LastName = $_POST['LastName'];
$query="INSERT INTO subscriber (Email,FirstName,LastName,CreateDate) VALUES (?,?,?,CURDATE())";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $email , PDO::PARAM_STR);
$stmt->bindParam(2, $FirstName, PDO::PARAM_STR);
$stmt->bindParam(3, $LastName, PDO::PARAM_STR);
$conn->commit();
}
catch(PDOException $e)
{
die ($e->getMessage().'<a href="addSub.php"> Back</a>');
$conn->rollBack();
}
try {
$userID = $_SESSION['username'];
$query="INSERT INTO list_sub (SubID,ListID) VALUES ('',$_SESSION[ListID])";
$stmt = $conn->prepare($query);
$conn->commit();
}
catch(PDOException $e)
{
$conn->rollBack();
die ($e->getMessage().'<a href="addSub.php"> Back</a>');
}
$conn = null;
}
これを少し編集して回答を得ましたが、これは実際にはかなりローカライズされています。 'die()'はむしろ、自己記述的です:) –