मेरे पास एक साइनअप पेज है और मूल रूप से मुझे 4 टेबल में डालने वाले डेटा की आवश्यकता है। मैं पीडीओ के लिए नया हूं और कुछ पर उलझन में हूं।PHP पीडीओ लेनदेन?
असल में यदि कोई भी आवेषण विफल रहता है तो मैं डेटाबेस में कुछ भी नहीं जोड़ना चाहता, यह काफी आसान लगता है।
मेरा भ्रम है, मुझे पहले users
तालिका में उपयोगकर्ता नाम, ईमेल, पासवर्ड इत्यादि डालने की ज़रूरत है, इसलिए मैं पीडीओ का उपयोग करके (सुनिश्चित नहीं कर सकता) यूआईडी माईएसक्यूएल ने अपना उपयोगकर्ता (ऑटोस्कूल द्वारा ऑटो वृद्धि) दिया है। मुझे यूजर यूआईडीएल की आवश्यकता है मेरे उपयोगकर्ता ने अन्य टेबल के लिए दिया है क्योंकि अन्य टेबलों को यूआईडी की जरूरत है ताकि सब ठीक से एक साथ जुड़ा हुआ हो। मेरी टेबल InnoDB हैं और मेरे पास user_profiles (user_uid), users_status (user_uid), users_roles (user_uid) से user.user_uid पर जाने वाली विदेशी कुंजी हैं, इसलिए वे सभी एक साथ जुड़े हुए हैं।
लेकिन साथ ही मैं यह सुनिश्चित करना चाहता हूं कि उदाहरण के लिए users
तालिका में डेटा डालने के बाद (इसलिए मैं यूआईडी MySQL को उपयोगकर्ता दे सकता हूं) कि यदि कोई अन्य आवेषण विफल रहता है तो यह डेटा को हटा देता है users
तालिका में डाला गया था।
मुझे लगता है कि यह सबसे अच्छा है कि मैं अपना कोड दिखाता हूं; मैंने कोड पर टिप्पणी की है और कोड में समझाया है जो इसे समझना आसान बना सकता है।
// Begin our transaction, we need to insert data into 4 tables:
// users, users_status, users_roles, users_profiles
// connect to database
$dbh = sql_con();
// begin transaction
$dbh->beginTransaction();
try {
// this query inserts data into the `users` table
$stmt = $dbh->prepare('
INSERT INTO `users`
(users_status, user_login, user_pass, user_email, user_registered)
VALUES
(?, ?, ?, ?, NOW())');
$stmt->bindParam(1, $userstatus, PDO::PARAM_STR);
$stmt->bindParam(2, $username, PDO::PARAM_STR);
$stmt->bindParam(3, $HashedPassword, PDO::PARAM_STR);
$stmt->bindParam(4, $email, PDO::PARAM_STR);
$stmt->execute();
// get user_uid from insert for use in other tables below
$lastInsertID = $dbh->lastInsertId();
// this query inserts data into the `users_status` table
$stmt = $dbh->prepare('
INSERT INTO `users_status`
(user_uid, user_activation_key)
VALUES
(?, ?)');
$stmt->bindParam(1, $lastInsertID, PDO::PARAM_STR);
$stmt->bindParam(2, $activationkey, PDO::PARAM_STR);
$stmt->execute();
// this query inserts data into the `users_roles` table
$stmt = $dbh->prepare('
INSERT INTO `users_roles`
(user_uid, user_role)
VALUES
(?, ?)');
$stmt->bindParam(1, $lastInsertID, PDO::PARAM_STR);
$stmt->bindParam(2, SUBSCRIBER_ROLE, PDO::PARAM_STR);
$stmt->execute();
// this query inserts data into the `users_profiles` table
$stmt = $dbh->prepare('
INSERT INTO `users_profiles`
(user_uid)
VALUES
(?)');
$stmt->bindParam(1, $lastInsertID, PDO::PARAM_STR);
$stmt->execute();
// commit transaction
$dbh->commit();
} // any errors from the above database queries will be catched
catch (PDOException $e) {
// roll back transaction
$dbh->rollback();
// log any errors to file
ExceptionErrorHandler($e);
require_once($footer_inc);
exit;
}
मैं शायद त्रुटियों या समस्याओं से ऊपर रहा, क्योंकि मैं अभी तक परीक्षण नहीं कर सकते जब तक मैं मेरी समस्या यह पता लगाने की सूचना के लिए अभी तक पीडीओ के लिए नया हूँ और वहाँ।
1) मुझे पता है कि कैसे मैं पहली बार उन तालिका में उन डेटा सम्मिलित तो मैं uid MySQL मेरे उपयोगकर्ता दिया प्राप्त कर सकते हैं कर सकते हैं की जरूरत है
2) तब uid मिल के रूप में मैं इसे अन्य तालिकाओं के लिए की जरूरत है
3) लेकिन साथ ही यदि उपयोगकर्ता तालिका में डालने के बाद किसी भी कारण से कोई क्वेरी विफल हो जाती है तो डेटा भी उपयोगकर्ता तालिका से हटा दिया जाता है।
अद्यतन:
मैं परिवर्तन है कि उपयोगी सदस्यों द्वारा की पेशकश की गई प्रतिबिंबित करने के लिए ऊपर दिए गए कोड को अपडेट किया है।
ए) '$ dbh-> startTransaction(); 'और कोशिश/पकड़ ब्लॉक के बाहर की रेखा पहले - लेनदेन शुरू होने तक आप कुछ भी रोलबैक नहीं कर सकते हैं। बी) इसके साथ क्या काम नहीं कर रहा है? सामान्य रूप से lastInsertId का उपयोग करें। – Niko
@ निको, मैं इसे एक पल में करूँगा, धन्यवाद phplover – PHPLOVER
@ निको, मैंने आपके द्वारा किए गए परिवर्तन को दर्शाने के लिए उपर्युक्त कोड संपादित किया है, क्या मैं पूछ सकता हूं कि '$ dbh-> startTransaction(); क्यों हो सकता है कोशिश ब्लॉक भी? थोड़ा समझ में नहीं आता है, धन्यवाद phplover – PHPLOVER