2011-06-09 103 views
5

顯然的ColdFusion不喜歡在一個查詢中的多個SQL語句...所以曾經是這樣的:ColdFusion:查詢中的多個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> 

這工作...但我我想知道是否有一些我不知道的ColdFusion。否則,這是有效的。

+0

你是什麼意思「變成」?對於例子中所示的過程,它確實應該在事務中,因爲您正在處理多個表/記錄,實質上這是一個原子記錄。我假設你有這種分佈在多個表上,以允許消息有多個用戶收到每個消息的個人狀態? – colinross 2011-06-09 21:18:35

+0

是的,你是對的......但即使在聲明MySQL變量時,這些變量也必須在自己的查詢中才能正常工作。我只是不確定在語法上是否有某種類型,至少將變量組合到查詢中。 – dcolumbus 2011-06-09 21:21:00

回答

10

在ColdFusion Admin中,轉到您的數據源定義表單並在連接字符串框中添加「allowMultiQueries = true」。一旦你這樣做了,你可以在一個CFQUERY標籤中傳遞多個分號分隔的查詢。只要確保您使用的是CFQUERYPARAM來篩選SQL注入攻擊。

+0

「只要確保您使用的是CFQUERYPARAM來篩選SQL注入攻擊。」 - 這是否應用在上面的分解查詢中? – dcolumbus 2011-06-09 21:35:23

+0

Dang,你輸入的比我快。:)另外,你可以使用'result_name.GENERATED_KEY'來獲取最後一個鍵(來自最後的cfquery插入)並且不必爲'LAST_INSERT_ID()'做那個查詢,除非你正在使用同一個cfquery塊 – colinross 2011-06-09 21:36:30