2010-01-03 12 views
6

के साथ एकाधिक पंक्तियों को अपडेट करें ऐसा लगता है कि यह संभव नहीं हो सकता है, लेकिन हे, मैं भी पूछ सकता हूं, मैं गलत हो सकता हूं। यह सोच रहा था कि क्या एक MySQL कॉल का उपयोग करके एकाधिक पंक्तियों को अद्यतन करने के लिए पर्ल के लिए वैसे भी है, मैं डीबीआई का उपयोग कर रहा हूं।पर्ल: एक MySQL कॉल

किसी भी मदद या प्रतिक्रिया की सराहना की जाएगी, यह एमएसएसएलएल में एएसपी और एएसपीनेट के माध्यम से संभव है, इसलिए यह सोच रहा था कि MySQL पर पर्ल के माध्यम से भी संभव है।

आपकी प्रतिक्रिया के लिए धन्यवाद!

+0

, वहाँ एक में दो अपडेट गठबंधन नहीं करने के लिए कोई कारण नहीं है; क्या आप उदाहरणों की तरह एक उदाहरण दे सकते हैं जो आपको वास्तव में करने की ज़रूरत है? – ysth

उत्तर

14

सबसे पहले और सबसे महत्वपूर्ण, आपको बिल्कुल अपने एसक्यूएल तारों में सीधे चर को अलग नहीं करना चाहिए। इससे एसक्यूएल इंजेक्शन हमलों की संभावना खुलती है। यहां तक ​​कि यदि वे चर उपयोगकर्ता इनपुट से नहीं आते हैं, तो यह खतरनाक बग की संभावना को खोल देता है जो आपके डेटा को खराब कर सकता है।

MySQL डीबीडी ड्राइवर एकाधिक कथन का समर्थन करता है, हालांकि यह डिफ़ॉल्ट रूप से सुरक्षा सुविधा के रूप में बंद हो जाता है। डीबीडी :: mysql दस्तावेज़ में Class Methods अनुभाग के तहत mysql_multi_statements देखें।

लेकिन एक बेहतर समाधान, जो दोनों समस्याओं को एक साथ हल करता है और अधिक पोर्टेबल है, तैयार कथन और प्लेसहोल्डर मूल्यों का उपयोग करना है।

while($whatever) { 
    my ($EC, $MR, $EM) = get_the_data(); 
    $sth->execute($EC, $MR, $EM); 
} 

आप केवल एक बार बयान तैयार करने की आवश्यकता है, और प्लेसहोल्डर मान बदल दिया जाता है (और ठीक से उद्धृत किए जाने की गारंटी) द्वारा:

my $sth = $dbh->prepare("UPDATE LOW_PRIORITY TableName SET E1=?,F1=? WHERE X=?"); 

फिर, किसी प्रकार की एक पाश में अपना डेटा प्राप्त डीबीडी चालक।

DBI docs में प्लेसहोल्डर के बारे में और पढ़ें।

+3

"डीबीडी ड्राइवर" डीबीआई द्वारा उपयोग किए जाने वाले बैकएंड-विशिष्ट ड्राइवर है, जैसे कि डीबीडी :: mysql। आपको कनेक्शन के बारे में चिंतित होने की आवश्यकता नहीं है, हालांकि, किसी भी मामले में - जब तक आप बयान चलाने के लिए उसी '$ dbh' का उपयोग करते रहें, तो आप एक ही डेटाबेस कनेक्शन का उपयोग करेंगे और 'एक बार तैयार करेंगे, फ्रेडेडो द्वारा प्रदर्शित कई मॉडल निष्पादित करना एक स्ट्रिंग में कई प्रश्नों को पार करने से अधिक कुशल होगा, क्योंकि यह अलग-अलग प्रत्येक क्वेरी को पार्स (तैयार) करने के ऊपरी हिस्से से बचाता है। –

+3

@mastermind: इंटरपोलेशन हमेशा खराब होता है, इससे कोई फर्क नहीं पड़ता कि आवेदन क्या है; उपयोगकर्ता की शरारत के बजाए प्रोग्रामर त्रुटि से कई भेद्यताएं उत्पन्न होती हैं। – Ether

3

फ्रेडेडो सुझाव के रूप में आपको mysql_multi_statements की आवश्यकता नहीं है।

आप AutoCommit मोड को बंद करने से पहले आप अपने अद्यतन आदेश युक्त पाश फोन की जरूरत है:

**$dbh->{AutoCommit} = 0;** 
while($condition) { 
    my $myParam = something(); 
    ... 
    $sth->execute($myParam); #your prepared UPDATE statement 
    ... 
} 
**$dbh->commit();** 
अपने उदाहरण में
संबंधित मुद्दे