2012-12-20 19 views
20

एक में उन कई प्रश्नों में शामिल होने के लिए के साथ एक बयान में कई एसक्यूएल प्रश्नों निष्पादित (मैं कर सकते हैं?)पीएचपी

$query = "DELETE FROM aktywne_kody WHERE kodsms ='$kodSMSgracza' AND typkodu ='$id'"; 
mysql_query($query) or die(mysql_error()); 

$query = "INSERT INTO uzyte_kody (gracz, kodsms, typkodu) VALUES ('$nickGracza', '$kodSMSgracza', '$id')"; 
mysql_query($query) or die("Błąd MySQL X04"); 

$query = "INSERT INTO do_odebrania (gracz, itemDATA, itemQTY) VALUES ('$nickGracza', '$itemDATA', '$itemQTY')"; 
mysql_query($query) or die("Błąd MySQL X05"); 

वैसे यह बेहतर है अगर मैं mysql_close ($ डाटाबेस) सभी प्रश्नों के बाद करते हैं किया हुआ?

+1

एक '$ query' करें और सिर्फ यकीन है कि आप एक' जोड़ने बनाने, प्रत्येक पंक्ति के बाद '। – Pitchinnate

+1

आपको इसकी आवश्यकता क्यों है? अधिकांश समय पठनीयता कम क्षमता से अधिक महत्वपूर्ण है। – Muatik

+3

कृपया नए अनुप्रयोगों में 'mysql_query' का उपयोग न करें। यह बहिष्कृत और खतरनाक है। एसक्यूएल इंजेक्शन बग की वजह से गंभीर परेशानी में समाप्त होने से पहले यह सुनिश्चित करने के लिए पीडीओ का उपयोग कम से कम करें [डेटा ठीक से बच गया है] (http://bobby-tables.com/php)। – tadman

उत्तर

25

65536 से mysql_connect 5 वें पैरामीटर के रूप में पास करें।

उदाहरण:

$conn = mysql_connect('localhost','username','password', true, 65536 /* here! */) 
    or die("cannot connect"); 
mysql_select_db('database_name') or die("cannot use database"); 
mysql_query(" 
    INSERT INTO table1 (field1,field2) VALUES(1,2); 

    INSERT INTO table2 (field3,field4,field5) VALUES(3,4,5); 

    DELETE FROM table3 WHERE field6 = 6; 

    UPDATE table4 SET field7 = 7 WHERE field8 = 8; 

    INSERT INTO table5 
     SELECT t6.field11, t6.field12, t7.field13 
     FROM table6 t6 
     INNER JOIN table7 t7 ON t7.field9 = t6.field10; 

    -- etc 
"); 

आप mysql_fetch_ * या mysql_num_rows, या mysql_affected_rows के साथ काम कर रहे हैं, केवल पहले बयान मान्य है।

उदाहरण के लिए, निम्नलिखित कोड, पहला कथन INSERT है, आप mysql_num_rows और mysql_fetch_ * निष्पादित नहीं कर सकते हैं। कितनी पंक्तियों को डालने के लिए mysql_affected_rows का उपयोग करना ठीक है।

$conn = mysql_connect('localhost','username','password', true, 65536) or die("cannot connect"); 
mysql_select_db('database_name') or die("cannot use database"); 
mysql_query(" 
    INSERT INTO table1 (field1,field2) VALUES(1,2); 
    SELECT * FROM table2; 
"); 

एक अन्य उदाहरण है, निम्नलिखित कोड, पहले बयान का चयन है, तो आप mysql_affected_rows पर अमल नहीं कर सकते। लेकिन आप पहले SELECT कथन से उत्पन्न पंक्ति की एक कुंजी-मूल्य जोड़ी प्राप्त करने के लिए mysql_fetch_assoc निष्पादित कर सकते हैं, या आप पहले SELECT कथन के आधार पर पंक्तियों की संख्या प्राप्त करने के लिए mysql_num_rows निष्पादित कर सकते हैं।

$conn = mysql_connect('localhost','username','password', true, 65536) or die("cannot connect"); 
mysql_select_db('database_name') or die("cannot use database"); 
mysql_query(" 
    SELECT * FROM table2; 
    INSERT INTO table1 (field1,field2) VALUES(1,2); 
"); 
+13

ईश्वर की पवित्र मां! –

+6

अगर कोई आश्चर्य करता है कि यह क्यों काम करता है - यह एक चाल नहीं है, यह सिर्फ MySQL क्लाइंट की विशेषता है (PHP दस्तावेज़ों में)। स्रोतों में आप आसानी से '# परिभाषित कर सकते हैं CLIENT_MULTI_STATEMENTS 65536/* बहु- stmt समर्थन */'जो वही है जो ओपी चाहता था। –

+3

कोड पठनीयता के लिए; csENT_MULTI_STATEMENTS को mysql_connect के 5 वें पैरामीटर के रूप में पास करें। –

0

आप केवल जॉइन शब्द जोड़ सकते हैं या जोड़ सकते हैं; प्रत्येक पंक्ति के बाद (जैसा कि @ पिक्टचबेट ने कहा)। पठनीयता की वजह से बेहतर तरीके से और आपको INSERT के साथ DELETE को दखल नहीं देना चाहिए; दक्षिण में जाना आसान है।

अंतिम प्रश्न बहस का विषय है, लेकिन जहां तक ​​मुझे पता है कि आपको प्रश्नों के एक सेट के बाद बंद करना चाहिए। यह ज्यादातर पुराने सादे mysql/php पर लागू होता है और पीडीओ, mysqli नहीं। इन मामलों में चीजें अधिक जटिल हो जाती हैं (और बहस में गर्म होती हैं)।

अंत में, मैं पीडीओ या किसी अन्य विधि का उपयोग करने का सुझाव दूंगा।

4

यह एसक्यूएल इंजेक्शन प्वाइंट "एसक्यूएल इंजेक्शन पिग्गी बैकड क्वेरीज" बनाया जा सकता है। हमलावर कई दुर्भावनापूर्ण एसक्यूएल बयान संलग्न करने में सक्षम हैं। इसलिए सीधे प्रश्नों पर उपयोगकर्ता इनपुट संलग्न न करें।

सुरक्षा कारणों से

एपीआई कार्यों mysqli_query() और mysqli_real_query() एक कनेक्शन ध्वज सर्वर में बहु प्रश्नों को सक्रिय करने के लिए आवश्यक सेट न करें। आकस्मिक एसक्यूएल इंजेक्शन हमलों की संभावना को कम करने के लिए कई कथनों के लिए एक अतिरिक्त एपीआई कॉल का उपयोग किया जाता है। एक हमलावर जैसे बयान जोड़ने की कोशिश कर सकता है; ड्रॉप डाटाबेस MySQL या; चयन स्लीप (99 9)। यदि हमलावर कथन स्ट्रिंग में SQL जोड़ने में सफल होता है लेकिन mysqli_multi_query का उपयोग नहीं किया जाता है, तो सर्वर दूसरे, इंजेक्शन और दुर्भावनापूर्ण SQL कथन निष्पादित नहीं करेगा।

PHP Doc