2013-10-01 11 views
12

क्लासिक लेन-देन:)पीएचपी एक पाश में बयान और लेन-देन के लिए तैयार एक पाश कोड में

1 ये हैं:

$mysqli->query("START TRANSACTION"); 
foreach ($pdata as $key => $value) { 
    $sql = "INSERT INTO temp (`fund_id`) VALUES (" . $value . ")"; 
    $result = $mysqli->query($sql); 
} 
$mysqli->query("COMMIT"); 

फिर हम तैयार बयान करने के लिए बदलने के लिए:

$mysqli->autocommit(FALSE); 
foreach ($pdata as $key => $value) { 
    $sql = "INSERT INTO temp (`fund_id`) VALUES (?)"; 
    $stmt = $mysqli->prepare($sql); 
    $stmt->bind_param('i', $value); 
    $stmt->execute(); 
} 
$mysqli->commit(); 

प्रश्न दो कोड समान हैं? क्या मुझे तैयार कथन के साथ दूसरे कोड में कुछ याद आ रहा है?

2) $mysqli->commit()$mysqli->query("COMMIT") जैसा ही है?

3) क्या मुझे तैयार बयान ब्लॉक के लिए $mysqli->query("START TRANSACTION"); जोड़ने की आवश्यकता है या जब हम autocommit(FALSE) सेट करते हैं तो लेनदेन स्वचालित रूप से प्रारंभ हो जाएगा?

+4

ऑटोकॉमिट बंद करने के बाद आपको 'ट्रांज़ेक्शन शुरू करने' की आवश्यकता नहीं है। आप 'mysqli-> तैयार कर सकते हैं()' _before_ अपना लूप, फिर इसे 'foreach' लूप के अंदर निष्पादित करें)। प्रत्येक लूप पुनरावृत्ति पर 'तैयार() 'की आवश्यकता नहीं है। –

+5

आपको हर बार 'bind_param() 'की आवश्यकता नहीं है। यह चर के संदर्भ को बांधता है, इसलिए प्रत्येक बार जब आप इसे निष्पादित करते हैं तो वेरिएबल के वर्तमान मान का उपयोग करेंगे। – Barmar

उत्तर

22

लूप के prepare और bind_param कथनों को खींचकर आपके लूप को अनुकूलित किया जा सकता है।

$value = null; 
$mysqli->autocommit(FALSE); 
$sql = "INSERT INTO temp (`fund_id`) VALUES (?)"; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('i', $value); 
foreach ($pdata as $value) { 
    $stmt->execute(); 
} 
$mysqli->commit(); 

आप अपने autocommit(FALSE) लाइन के साथ autocommit बंद कर दिया है और इसलिए START TRANSACTION बयान का उपयोग करने की जरूरत नहीं है।

+0

लघु और विनियमित। – neophyte

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