2011-06-09 11 views
5

Al parecer no le gusta ColdFusion varias sentencias SQL dentro de una única consulta ... así que lo que antes era la siguiente:ColdFusion: ¿Múltiples declaraciones SQL en una consulta?

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); 

Get ha convertido en esto:

<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> 

esto funciona ... pero Me pregunto si hay algo de ColdFusion que no sepa. De lo contrario, esto funciona.

+0

¿Qué quiere decir con "se convierte en"? Para un proceso como el que se muestra en el ejemplo, realmente debería estar en una transacción, ya que se trata de varias tablas/registros que, en esencia, son un registro atómico. Supongo que tiene esto repartido en varias tablas para permitir que los mensajes tengan múltiples usuarios que reciban un mensaje con un estado individual en cada uno. – colinross

+0

Sí, está en lo correcto ... pero incluso al declarar variables de MySQL, esas variables deben estar en su propia consulta para que funcione. Simplemente no estaba seguro de si había algún tipo de sintaxis para combinar al menos las variables en las consultas. – dcolumbus

Respuesta

10

En ColdFusion Admin, vaya a su formulario de definición de fuente de datos y agregue "allowMultiQueries = true" al cuadro Cadena de conexión. Una vez que lo haga, puede pasar múltiples consultas separadas por punto y coma en una sola etiqueta CFQUERY. Solo asegúrese de estar usando CFQUERYPARAM para detectar ataques de inyección SQL.

+0

"Solo asegúrese de estar usando CFQUERYPARAM para detectar ataques de inyección SQL". - ¿Debería aplicarse esto incluso en mi consulta desglosada anterior? – dcolumbus

+0

Dang, escribes más rápido que yo .. :) Además, puedes usar 'result_name.GENERATED_KEY' para obtener la última clave (de la última inserción de cfquery) y no tienes que hacer esa consulta para' LAST_INSERT_ID() 'a menos que lo estás haciendo dentro del mismo bloque de cfquery – colinross

Cuestiones relacionadas