2012-04-14 17 views
29

मेरे पास एक साइनअप पेज है और मूल रूप से मुझे 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) लेकिन साथ ही यदि उपयोगकर्ता तालिका में डालने के बाद किसी भी कारण से कोई क्वेरी विफल हो जाती है तो डेटा भी उपयोगकर्ता तालिका से हटा दिया जाता है।

अद्यतन:

मैं परिवर्तन है कि उपयोगी सदस्यों द्वारा की पेशकश की गई प्रतिबिंबित करने के लिए ऊपर दिए गए कोड को अपडेट किया है।

+3

ए) '$ dbh-> startTransaction(); 'और कोशिश/पकड़ ब्लॉक के बाहर की रेखा पहले - लेनदेन शुरू होने तक आप कुछ भी रोलबैक नहीं कर सकते हैं। बी) इसके साथ क्या काम नहीं कर रहा है? सामान्य रूप से lastInsertId का उपयोग करें। – Niko

+0

@ निको, मैं इसे एक पल में करूँगा, धन्यवाद phplover – PHPLOVER

+0

@ निको, मैंने आपके द्वारा किए गए परिवर्तन को दर्शाने के लिए उपर्युक्त कोड संपादित किया है, क्या मैं पूछ सकता हूं कि '$ dbh-> startTransaction(); क्यों हो सकता है कोशिश ब्लॉक भी? थोड़ा समझ में नहीं आता है, धन्यवाद phplover – PHPLOVER

उत्तर

18

यह फ़ंक्शन केवल सम्मिलित रिकॉर्ड की प्राथमिक कुंजी देता है: PDO::lastInsertId आपको NEED_USERS_UID_FOR_HERE पैरामीटर के लिए इसकी आवश्यकता होगी। INSERT कथन के बाद इसका उपयोग करें।

चूंकि आपने एक लेनदेन शुरू किया है, इसलिए किसी भी त्रुटि के दौरान डेटा को किसी भी तालिका में नहीं डाला जाएगा यदि आप अपने MySQL तालिकाओं के लिए InnoDB इंजन का उपयोग करते हैं (MyISAM लेनदेन का समर्थन नहीं करता है)।

+0

धन्यवाद मुझे लगता है कि मैं इसे अब समझ रहा हूं, मैंने '$ dbh-> lastInsertId(); 'INSERT कथन के बाद (मूल पोस्ट में संपादित कोड देखें), अब मुझे अंतिम डालने वाली आईडी मिल गई है जो आपने ऊपर कहा था, कैसे क्या मैं अब अन्य पूछताछ 'NEED_USERS_UID_FOR_HERE' में डालने के लिए अंतिम डालने आईडी का उपयोग करता हूं? खेद है कि पीडीओ के लिए नया नया है, फिर भी यह पता लगाना, धन्यवाद phplover – PHPLOVER

+0

खेद है कि मैं थोड़ा बेहतर समझा सकता हूं, क्या मैं बस एक चर को '$ dbh-> lastInsertId(); * तो देता हूं, इसलिए यह '$ lastInsertID = $ जैसा कुछ हो जाता है dbh-> lastInsertId(); 'और फिर कहां कहता है' NEED_USERS_UID_FOR_HERE' बस इसे '$ lastInsertID' के साथ प्रतिस्थापित करें? धन्यवाद phplover – PHPLOVER

+2

हां। बस इसे एक चर के रूप में स्टोर करें और इसे आगे के प्रश्नों में उपयोग करें। यदि लेनदेन विफल रहता है तो यह डेटाबेस में नहीं लिखा जाएगा। –

संबंधित मुद्दे