2011-03-20 16 views
7

क्या तैयार वक्तव्य के साथ लेनदेन करने का कोई तरीका है?MySQLi तैयार वक्तव्य और लेनदेन

मेरा मतलब है मैं $mysqli->autocommit(FALSE); और $mysqli->commit(); और $mysqli->rollback();

//Preparing the statment 

$insert_stmt=$mysqli->prepare("INSERT INTO x VALUES(?,?)") 
or die($mysqli->error); 

//associate variables with the input parameters 

$insert_stmt->bind_param("is", $my_number,$my_string); //i=integer 

//Execute the statement multiple times.... 

for ($my_number = 1; $my_number <= 10; $my_number++) 
{ 
    $my_string="row ".$my_number; 
    $insert_stmt->execute() or die ($insert_stmt->error); 
} 
$insert_stmt->close(); 

मैं चारों ओर देखा है के साथ निम्न उदाहरण का उपयोग कर सकते हैं लेकिन तैयार बयान (नहीं पीडीओ) का उपयोग कर के किसी भी उदाहरण नहीं मिल सकता है: लेनदेन के साथ http://php.net/manual/en/mysqli.prepare.php, मुझे केवल यहां वर्णित उदाहरण मिलते हैं: http://book.opensourceproject.org.cn/lamp/mysql/mysqlstored/opensource/0596100892/mysqlspp-chp-13-sect-2.html जहां लेनदेन और तैयार वक्तव्य कभी-कभी मिश्रित नहीं होते हैं।

क्या उन्हें एक साथ उपयोग करना गलत होगा?

उत्तर

7

तैयार बयान और लेनदेन असंबद्ध तकनीकें और प्रौद्योगिकियां हैं।

आप समर्पित विधियों का उपयोग करने के बजाय सीधे START TRANSACTION और COMMIT/ROLLBACK आदेश जारी करना चाहते हैं। वे कार्यात्मक रूप से समकक्ष हैं।

अपने पाश के लिए, आप अपने prepare, तो अपने COMMIT के बाद पाश बाहर निकलता है START TRANSACTION से पहले जारी होगा। तैयार वक्तव्य शुरू होने के बाद शायद आपको लेनदेन खोलने की कोशिश नहीं करनी चाहिए, लेकिन इसे निष्पादित करने से पहले।

किसी कारण से, उन्होंने autocommit को बंद करने के पक्ष में "प्रारंभ लेनदेन" आदेश नहीं जोड़ा। यह mysqli के बारे में उन अजीब बातों में से एक है जो मुझे हमेशा पीडीओ की सिफारिश करता है। :) लेनदेन की अवधि के लिए एक लेनदेन खोलना autocommit बंद कर देता है।

+0

बहुत बहुत धन्यवाद :) क्या मुझे लूप के बाद त्रुटि की जांच नहीं करनी चाहिए, और त्रुटि पर रोलबैक (और अगर कोई त्रुटि नहीं है तो प्रतिबद्ध करें) – Yerel

+0

यह mysqli पर पीडीओ के अन्य बड़े फायदों में से एक है - आप इसे सेट कर सकते हैं अपवाद फेंक दें और इस प्रकार त्रुटि कोडों को बार-बार जांचना नहीं है, जिसका मतलब है कि रोलबैक या प्रतिबद्धता का निर्णय बहुत सरल हो सकता है। – Charles

+2

ओएमजी, यह मुझे बहुत मदद करता है। मैंने एक स्क्रिप्ट बनाई है जिसमें '5000 पंक्तियां आईएनएसईआरटी थीं, इसे खत्म करने में घंटों लग रहे थे। '$ Mysqli-> autocommit (FALSE) जोड़ना; 'और' $ mysqli-> प्रतिबद्ध();' इसे मिनटों में चलाया गया! :-) –

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