Một số lưu ý chung:Không sử dụng bindParam()
trừ khi bạn sử dụng thủ tục sửa đổi giá trị của tham số Do đó, hãy use bindValue()
. bindParam () chấp nhận giá trị đối số như một biến được tham chiếu. Điều đó có nghĩa là bạn không thể thực hiện $stmt->bindParam(':num', 1, PDO::PARAM_INT);
- nó phát sinh lỗi. Ngoài ra, PDO có các chức năng riêng để kiểm soát các giao dịch, bạn không cần phải thực hiện các truy vấn theo cách thủ công.
Tôi đã viết lại mã của bạn một chút để làm sáng tỏ cách PDO có thể được sử dụng:
if($_POST['groupID'] && is_numeric($_POST['groupID']))
{
// List the SQL strings that you want to use
$sql['privileges'] = "DELETE FROM users_priveleges WHERE GroupID=:groupID";
$sql['groups'] = "DELETE FROM groups WHERE GroupID=:groupID"; // You don't need LIMIT 1, GroupID should be unique (primary) so it's controlled by the DB
$sql['users'] = "DELETE FROM users WHERE Group=:groupID";
// Start the transaction. PDO turns autocommit mode off depending on the driver, you don't need to implicitly say you want it off
$pdo->beginTransaction();
try
{
// Prepare the statements
foreach($sql as $stmt_name => &$sql_command)
{
$stmt[$stmt_name] = $pdo->prepare($sql_command);
}
// Delete the privileges
$stmt['privileges']->bindValue(':groupID', $_POST['groupID'], PDO::PARAM_INT);
$stmt['privileges']->execute();
// Delete the group
$stmt['groups']->bindValue(":groupID", $_POST['groupID'], PDO::PARAM_INT);
$stmt['groups']->execute();
// Delete the user
$stmt['users']->bindParam(":groupID", $_POST['groupID'], PDO::PARAM_INT);
$stmt['users']->execute();
$pdo->commit();
}
catch(PDOException $e)
{
$pdo->rollBack();
// Report errors
}
}