2011-06-09 104 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