2013-04-24 40 views
0

我正在查看Values表的列val中的所有記錄,並將所有絕對url轉換爲相關的url。我得到這個錯誤在查詢中的cfloop中更新cfquery

[Macromedia][SQLServer JDBC Driver][SQLServer]Incorrect syntax near '='. 

在第3〜這塊代碼的最後一行:

<cfquery name="getVals" datasource="#dataBase#"> 
    Select vals 
    FROM Values 
</cfquery> 

<cfloop 
    query = "getVals"> 

    <cfset val=#vals#> 
    <cfset valEdited= REReplace(
     val, 
     '"(https?:\/\/)?(www\.)?(example\.com)(\/)?"', 
     "'index.php'", 
     'ALL' 
    )> 

    <cfquery name="update" datasource="#dataBase#"> 
     UPDATE Values 
     SET  vals = <cfqueryPARAM value = #valEdited#> 
     WHERE ID = <cfqueryPARAM value = #getVals.currentRow#> 
    </cfquery> 
</cfloop> 

關於如何解決它的任何想法?

+2

嘗試'',它不僅更安全,但它也逃脫VARCHAR字符串,以確保它會工作。 'vals ='後不需要單引號' – Henry 2013-04-24 19:08:37

+1

你的'rereplace'行末尾還有一個額外的分號。 – 2013-04-24 19:12:00

+2

* WHERE ID =#getVals.currentRow#*您應該使用唯一記錄'ID',而不是查詢行號。同樣如前所述,在兩個*變量上使用'cfqueryparam'。 – Leigh 2013-04-24 19:12:06

回答

2

我首先要看的是在ValEdited的CFSET結尾處有一個分號。 首先會爆炸。

然後檢查你的代碼,看它是否給你同樣的錯誤。

你可能要考慮最佳做法,只是使用#當你輸出價值觀......所以

<cfset val = getVals.vals> 

就足夠了。

我會看到的下一件事是你在哪裏發表聲明。 這假設您的所有值都有ID,1表中的記錄數。 如果不是這樣,你可能需要更新這

where ID = #getVals.ID# 

希望這有助於。 當我寫了它,其他人幾乎都說同樣的事情:P

+1

增加了關於最佳實踐的觀點,'val'也是一個CF函數。使用它作爲變量名可行,但它可能會讓別人掃描代碼時感到困惑。 – 2013-04-24 19:23:26

+1

..也絕對使用'cfqueryparam'。我的猜測是他們真正的查詢是不同的,錯誤是因爲與'WHERE ID ='匹配的值是空的。這肯定會導致'='附近的語法不正確。 error.'。 – Leigh 2013-04-24 19:29:58

+0

謝謝Gavin,Matt,phantom42和Leigh!優秀的建議。我把它全部拿走了。有效! – 2013-04-26 14:40:31

0

個人我不會直接更新查詢列的值。對我來說,這使得混亂的確切是怎麼回事。我總是這樣做的方法是使用QueryAddColumn()將另一列添加到查詢中。

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_m-r_16.html

這可以讓你不僅有你的查詢作爲新列需要可用的變化,但也留下了原始列單獨這樣你就可以調試更容易。要添加新列只是做:用

<cfquery name="getVals" datasource="#dataBase#"> 
    Select vals 
    FROM Values 
    order by id 
</cfquery> 

<cfset newVals = []> 

<cfloop query="getVals"> 

    <cfset temp = REReplace(
     val, 
     '"(https?:\/\/)?(www\.)?(example\.com)(\/)?"', 
     "'index.php'", 
     'ALL' 
    )> 

    <cfset ArrayAppend(newVals, temp)> 

</cfloop> 

<cfset QueryAddColumn(getVals, "newVals", "Varchar", newVals)> 
+1

看起來好像他想將新值保存回數據庫。你的解決方案如何解決這個問題每次他想使用它時都要按摩這些數據,這似乎有點......浪費。 – 2013-04-26 12:42:28