2011-06-09 18 views
5

जाहिर ColdFusion किसी एक क्वेरी के भीतर कई SQL कथन पसंद नहीं है ... तो क्या एक बार इस:कोल्डफ्यूजन: एक क्वेरी में एकाधिक SQL कथन?

SET @sender_user_id = 3, @recipient_user_id = 5; 

INSERT INTO messages (message_type, sender_id, message_title, message_content) 
    VALUES(3, @sender_user_id, 'One more thing...', 'I am testing this message'); 

SET @saved_message_id = LAST_INSERT_ID(); 

INSERT INTO message_recipient (message_id, user_id) 
    VALUES(@saved_message_id, @recipient_user_id); 

INSERT INTO message_status (message_id, user_id, is_read, read_datetime, is_deleted, deleted_datetime) 
    VALUES (@saved_message_id, @recipient_user_id, 0, NULL, 0, NULL); 

प्राप्त इस में बदल गया है:

<cftransaction> 

    <cfquery name="insertMessage" dataSource="mySource"> 

     SET @sender_user_id = 3, @recipient_user_id = 5; 

    </cfquery> 
    <cfquery name="insertMessage2" dataSource="mySource"> 

     INSERT INTO messages (message_type, sender_id, message_title, message_content) 
     VALUES(3, @sender_user_id, '#params.message_title#', '#params.message_content#'); 

    </cfquery> 
    <cfquery name="insertMessage3" dataSource="mySource"> 

     SET @saved_message_id = LAST_INSERT_ID(); 

    </cfquery> 
    <cfquery name="insertMessage4" dataSource="mySource"> 

     INSERT INTO message_recipient (message_id, user_id) 
     VALUES(@saved_message_id, @recipient_user_id); 

    </cfquery> 
    <cfquery name="insertMessage5" dataSource="mySource"> 

     INSERT INTO message_status (message_id, user_id, is_read, read_datetime, is_deleted, deleted_datetime) 
     VALUES (@saved_message_id, @recipient_user_id, 0, NULL, 0, NULL); 

    </cfquery> 

</cftransaction> 

यह काम करता है ... लेकिन मैं मैं सोच रहा हूं कि कुछ कोल्डफ्यूजन चीज है जो मुझे नहीं पता। अन्यथा, यह काम करता है।

+0

"क्या हो जाता है" से आपका क्या मतलब है? उदाहरण में दिखाए गए प्रक्रिया के लिए, यह वास्तव में एक लेनदेन में होना चाहिए क्योंकि आप सारणी में एक से अधिक टेबल/रिकॉर्ड से निपट रहे हैं, एक परमाणु रिकॉर्ड। मुझे लगता है कि आपके पास यह एकाधिक टेबल पर फैल गया है ताकि संदेशों को एकाधिक उपयोगकर्ताओं को व्यक्तिगत स्थिति के साथ एक संदेश प्राप्त हो सके? – colinross

+0

हां, आप सही हैं ... लेकिन MySQL चर घोषित करते समय भी, उन चरों को काम करने के लिए अपनी स्वयं की क्वेरी में होना चाहिए। मुझे यकीन नहीं था कि कम से कम प्रश्नों में चर को गठबंधन करने के लिए सिंटैक्स पर कुछ प्रकार था। – dcolumbus

उत्तर

10

कोल्डफ्यूजन व्यवस्थापक में, अपने डेटा स्रोत परिभाषा फॉर्म पर जाएं और कनेक्शन स्ट्रिंग बॉक्स में "allowMultiQueries = true" जोड़ें। एक बार ऐसा करने के बाद, आप एक एकल CFQUERY टैग में एकाधिक सेमी-कोलन अलग-अलग प्रश्नों को पारित कर सकते हैं। बस सुनिश्चित करें कि आप SQL इंजेक्शन अटैक के लिए स्क्रीन पर CFQUERYPARAM का उपयोग कर रहे हैं।

+0

"बस सुनिश्चित करें कि आप SQL इंजेक्शन अटैक के लिए स्क्रीन पर CFQUERYPARAM का उपयोग कर रहे हैं।" - क्या इसे उपरोक्त मेरी टूटी हुई क्वेरी में भी लागू किया जाना चाहिए? – dcolumbus

+0

डैंग, आप मुझसे तेज़ी से टाइप करते हैं .. :) इसके अलावा, आप अंतिम कुंजी (अंतिम cfquery डालने से) प्राप्त करने के लिए 'result_name.GENERATED_KEY' का उपयोग कर सकते हैं और उस क्वेरी को' LAST_INSERT_ID() 'के लिए नहीं करना है आप इसे एक ही cfquery ब्लॉक में कर रहे हैं – colinross

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