पीटर और रिचर्ड्स के उत्तर पहले से ही सही हैं, लेकिन लेन-देन संरचना से कोड में एक छोटी सी गलती है (और मैं कोई टिप्पणी नहीं जोड़ सकता)।
$connection->beginTransaction()
try
. के बाहर होना चाहिए -catch
खंड मैथा। जब आप प्रारंभ करते हैं beginTransaction()
try
. में -ब्लॉक और आपके डेटाबेस ऑपरेशन एक अपवाद फेंकते हैं, catch
-ब्लॉक सक्रिय लेनदेन से कुछ नहीं जानता है। तो, आपको वही त्रुटि मिलती है:
तो संरचना भी ऐसी होनी चाहिए:
- कनेक्शन प्राप्त करें।
- लेन-देन शुरू करें
$connection->beginTransaction()
. के साथ - खोलें
try
-catch
ब्लॉक.
try
-ब्लॉक में $connection->commit()
. होता है डीबी ऑपरेशंस के बाद।
catch
-ब्लॉक में $connection->rollback()
. होता है थ्रो एक्सेप्शन से पहले।
तो आपका कोड इस तरह दिखना चाहिए:
$tags_input = array(6,4,5);
$conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8',
DB_USER, DB_PASSW, array(
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
} catch (Exception $e) {
die("Unable to connect: " . $e->getMessage());
}
//Begin Transaction
$conn->beginTransaction();
try {
$sql = "INSERT INTO projects (id, pr_id, enabled) VALUES ( :val0, :val1, :val2)";
$stmt = $conn->prepare($sql);
if(count($tags_input)>0){
for($i = 0;$i<count($tags_input);$i++){
$stmt->bindValue(':val0', 57);
$stmt->bindValue(':val1', $tags_input[$i]);
$stmt->bindValue(':val2', 'Y');
$result = $stmt->execute();
}
}
$res1 = $conn->commit();
} catch (Exception $e) {
$conn->rollBack();
echo "Failed: " . $e->getMessage();
}