2016-05-12 50 views
1

我剛開始在我正在開發的內部使用的Web應用程序內使用Mailgun進行雙向電子郵件。我有一條路由設置爲轉發郵件到我的服務器上的URL - 這工作正常。處理來自Mailgun與Coldfusion的傳入郵件

但是,我在處理這些消息的代碼中拋出錯誤。 Malign將數據作爲http文件發送,然後我可以使用表單變量進行引用。最初,我在某些字段(字段名中帶有連字符的字段)上出現'未定義'錯誤,但現在似乎已解決。現在代碼在CFQUERY插入上磕磕絆絆,錯誤提示我在SQL語法中有一個錯誤 - 但我看不出有什麼問題!

這是我爲頁面mailgun發送郵件的頁面的代碼;

<cfset thebody = form["body-plain"]> 
<cfset thesender = form["sender"]> 
<cfset therecipient = form["sender"]> 
<cfset thesubject = form["subject"]> 

<cfquery name="addmail"> 
INSERT INTO mailmessages(from,sender,recipient,subject,body,msgdate) 
VALUES('#thesender#','#thesender#','#therecipient#','#thesubject#','#thebody#',#CreateODBCDateTime(Now())#) 
</cfquery> 

錯誤消息狀態;

Error Executing Database Query. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from,sender,recipient,subject,body,msgdate) VALUES('[email protected]','l' at line 1 

形式可以看到這裏的cfdump(這被髮送到是通過在cfcatch聲明CFMAIL - 我能看到任何錯誤的唯一方法);

Cfdump

+0

我會用在第一次插入值,以排除來自Mailgun來擰起來的任何文本啓動。如果仍然無法正常工作,可以嘗試/捕獲SQL調用並查看錯誤是什麼... –

+2

而且您可能必須將'from'列包裝爲[from](不確定MySQL I的轉義字符是什麼恐怕),因爲它是一個保留字,可能被解釋爲 –

+0

啊,快速谷歌搜索表明它是一個雙引號,所以嘗試將列更改爲(「發件人」,發件人,收件人,主題,正文,msgdate) –

回答

4

from列名是保留字,所以這是mySQL所抱怨的。

如果您轉義列名稱,它應該解決這個問題。

隨着cfqueryparam你的代碼應該是這樣的:

<cfset thebody = form["body-plain"]> 
<cfset thesender = form["sender"]> 
<cfset therecipient = form["sender"]> 
<cfset thesubject = form["subject"]> 

<cfquery name="addmail"> 
    INSERT INTO mailmessages (
     "from", 
     sender, 
     recipient, 
     subject, 
     body, 
     msgdate 
    ) 
    VALUES (
     <cfqueryparam value="#thesender#" cfsqltype="cf_sql_varchar">, 
     <cfqueryparam value="#thesender#" cfsqltype="cf_sql_varchar">, 
     <cfqueryparam value="#therecipient#" cfsqltype="cf_sql_varchar">, 
     <cfqueryparam value="#thesubject#" cfsqltype="cf_sql_varchar">, 
     <cfqueryparam value="#thebody#" cfsqltype="cf_sql_varchar">, 
     <cfqueryparam value="#CreateODBCDateTime(Now())#" cfsqltype="cf_sql_timestamp"> 
    ) 
</cfquery> 
+1

*轉義列名稱* ...您也可以重命名列並避免該問題:) – Leigh

2

作爲錯誤信息顯示,則在插入查詢語法錯誤。 似乎您在傳遞的日期值周圍缺少單引號(')。應該這樣寫:

<cfquery name="addmail"> 
    INSERT INTO mailmessages(from,sender,recipient,subject,body,msgdate) 
    VALUES('#thesender#','#thesender#','#therecipient#','#thesubject#','#thebody#','#CreateODBCDateTime(Now())#') 
</cfquery> 

爲了擺脫這樣的語法錯誤,防止SQL注入始終使用cfqueryparams這樣的:

<cfquery name="addmail"> 
    INSERT INTO mailmessages (from,sender,recipient,subject,body,msgdate) 
    VALUES ( 
       <cfqueryparam value="#thesender#" cfsqltype="CF_SQL_VARCHAR">, 
       <cfqueryparam value="#thesender#" cfsqltype="CF_SQL_VARCHAR">, 
       <cfqueryparam value="#therecipient#" cfsqltype="CF_SQL_VARCHAR">, 
       <cfqueryparam value="#thesubject#" cfsqltype="CF_SQL_VARCHAR">, 
       <cfqueryparam value="#thebody#" cfsqltype="CF_SQL_VARCHAR">, 
       <cfqueryparam value="#CreateODBCDateTime(Now())#" cfsqltype="CF_SQL_TIMESTAMP"> 
      ) 
</cfquery> 

相反的CF_SQL_TIMESTAMP你也可以使用CF_SQL_DATE按您的DB或您爲列指定的數據類型。

+1

日期前後的引號會導致錯誤,這就是我沒有它們的原因。你對使用cfqueryparams是正確的,但這是我會做的。 – Lee

+0

這應該是被接受的答案,因爲它可以解決問題並使用最佳做法。如果你不使用'cfqueryparam',你只是因爲錯誤的數據而要求語法錯誤,並且要求SQL注入攻擊。 – beloitdavisja

+0

@beloitdavisja - 這不是問題,保留字是問題。 – Lee

0

我不能選擇Jedihomer Townend的上面的評論作爲答案,但他指出我的字段名包含保留字,這是造成問題的正確答案。改變那些固定它。

+0

*無法選擇Jedihomer Townend的評論作爲答案*使用@ +用戶名,讓@JedihomerTownend發表評論,要求他推廣自己的評論以評論回答:) – Leigh

+0

@JedihomerTownend - 是的,請做! – Lee