【问题标题】:update cfquery within a cfloop over a query通过查询在 cfloop 中更新 cfquery
【发布时间】:2013-04-24 19:02:15
【问题描述】:

我正在检查 Values 表的 vals 列中的所有记录,并将任何绝对 url 转换为相对 url。我收到此错误

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

关于如何解决它的任何想法?

【问题讨论】:

  • 尝试使用&lt;cfqueryparam&gt;,它不仅更安全,而且还转义了 varchar 字符串以确保它能够正常工作。 vals =之后不需要单引号
  • rereplace 行的末尾还有一个额外的分号。
  • WHERE ID = #getVals.currentRow# 您应该使用唯一记录ID,而不是查询行号。同样如上所述,在 both 变量上使用 cfqueryparam
  • 另外,您不应该真正查询select *。最好只指定您需要的实际列。
  • (编辑)您能发布实际代码和完整错误消息吗?这不可能是实际查询,因为values 是保留字。因此,SQL 无论如何都不会正常运行,除非转义表名。另外,update 中有一个错字。

标签: coldfusion cfquery cfloop


【解决方案1】:

我首先要看的是您在 ValEdited 的 CFSET 末尾有一个分号。 那会先爆炸。

然后检查你的代码,看看它是否给你同样的错误。

您可能要考虑的最佳做法是仅在输出值时使用 #...所以

<cfset val = getVals.vals> 

足够了。

接下来我要看的是你的 where 语句。 这假设您的所有值都有 ID,1 到表中的记录数。 如果不是这样,您可能需要将其更新为

where ID = #getVals.ID#

希望这会有所帮助。 到我写这篇文章的时候,其他人几乎都说了同样的话:P

【讨论】:

  • 关于最佳实践的补充,val 也是一个 CF 函数。使用它作为变量名是可行的,但它可能会混淆其他人扫描代码。
  • .. 也绝对使用cfqueryparam。我的猜测是他们的真实查询不同,错误是因为与 WHERE ID = 匹配的值是空的。这肯定会导致Incorrect syntax near '='. error.
  • 谢谢 Gavin、Matt、phantom42 和 Leigh!很好的建议。我都拿走了。成功了!
  • 你可以在没有'getvals'的情况下执行&lt;cfset val = vals&gt;,因为你已经在getVals中循环了。
【解决方案2】:

我个人不会直接更新查询列的值。对我来说,这让我对到底发生了什么感到困惑。我一直使用的方法是使用 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)>

【讨论】:

  • 似乎他想将新值持久化回数据库。您的解决方案将如何解决这个问题?每次他想使用它时都必须按摩这些数据似乎有点……浪费。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 2021-10-10
  • 1970-01-01
  • 2017-09-16
  • 2017-01-02
相关资源
最近更新 更多