कुछ सामान्य नोट:bindParam()
का प्रयोग न करें जब तक आप ऐसी प्रक्रिया का उपयोग नहीं करते हैं जो पैरामीटर के मान को संशोधित करती है, इसलिए use bindValue()
का उपयोग करें . बाइंडपरम () तर्क मान को संदर्भित चर के रूप में स्वीकार करता है। इसका मतलब है कि आप नहीं कर सकते $stmt->bindParam(':num', 1, PDO::PARAM_INT);
- यह एक त्रुटि उत्पन्न करता है। साथ ही, लेनदेन को नियंत्रित करने के लिए पीडीओ के अपने कार्य हैं, आपको प्रश्नों को मैन्युअल रूप से निष्पादित करने की आवश्यकता नहीं है।
पीडीओ का उपयोग कैसे किया जा सकता है, इस पर कुछ प्रकाश डालने के लिए मैंने आपके कोड को थोड़ा फिर से लिखा:
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
}
}