2011-06-09 4 views
5

Apparemment ColdFusion n'aime pas plusieurs instructions SQL dans une seule requête ... donc ce qui était autrefois ceci:ColdFusion: plusieurs instructions SQL dans une requête?

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 est transformé en ceci:

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

Cela fonctionne ... mais je Je me demande s'il y a quelque chose de ColdFusion que je ne connais pas. Sinon, cela fonctionne.

+0

Qu'entendez-vous par «se transforme en»? Pour un processus tel que montré dans l'exemple, il devrait vraiment être dans une transaction, car vous avez affaire à plusieurs tables/enregistrements qui sont essentiellement, un enregistrement atomique. Je suppose que vous avez cette propagation sur plusieurs tables pour permettre aux messages d'avoir plusieurs utilisateurs reçoivent un message avec un statut individuel sur chacun? – colinross

+0

Oui, vous avez raison ... mais même lors de la déclaration de variables MySQL, ces variables doivent être dans leur propre requête pour que cela fonctionne. Je n'étais simplement pas sûr s'il y avait un type sur la syntaxe pour au moins combiner les variables dans les requêtes. – dcolumbus

Répondre

10

Dans ColdFusion Admin, accédez à votre formulaire de définition de source de données et ajoutez "allowMultiQueries = true" à la zone Chaîne de connexion. Une fois que vous faites cela, vous pouvez passer plusieurs requêtes séparées par des points-virgules dans une seule balise CFQUERY. Assurez-vous simplement d'utiliser CFQUERYPARAM pour détecter les attaques par injection SQL.

+0

"Assurez-vous simplement que vous utilisez CFQUERYPARAM pour détecter les attaques par injection SQL." - Cela devrait-il être appliqué même dans ma requête éclatée ci-dessus? – dcolumbus

+0

Dang, vous tapez plus vite que moi .. :) En outre, vous pouvez utiliser 'result_name.GENERATED_KEY' pour obtenir la dernière clé (à partir de la dernière insertion cfquery) et ne pas avoir à faire cette requête pour' LAST_INSERT_ID() 'sauf vous le faites dans le même bloc cfquery – colinross

Questions connexes