0

我永远坐在 Coldfusion8 INSERT into MySQL (5.0.88)

数据来自一个名为“q”的查询,如下所示:

[Record # 1] 
ILN_KAEUFER: 9900000002985 
ILN_VERKAEUFER: 9900000003005 

然后我想做一个这样的插入:

<cfloop query="q">
     <cfquery datasource="db">
         INSERT INTO table_a ( 
            iln_kaeufer, 
            iln_verkaeufer
         )
         VALUES(
            "#iln_kaeufer#", 
            "#iln_verkaeufer#"
        )
      </cfquery>
 </cfloop> 

这是我让它工作的唯一方法。我首先尝试像这样定义两个值:

 "#q.iln_kaeufer#", 
 "#q.iln_verkaeufer#"

在此之前,我也像这样使用 cfqueryparam:

  <cfqueryparam value="#q.iln_kaeufer#" cfsqltype="cf_sql_varchar" maxlength="13">
  <cfqueryparam value="#q.iln_verkaeufer#" cfsqltype="cf_sql_varchar" maxlength="13">

两者都产生了错误。

我想这已经被问过了,但我没有找到一个很好的解释,说明我什么时候可以/应该使用 CFQUERYPARAM,什么时候不使用,什么时候使用 SCOPE,什么时候不使用。

我总是尝试对所有内容进行参数化和范围化,这是我寻找的最后一件事是错误的。

感谢您提供一些见解!

4

2 回答 2

3

因此,您应该始终尽可能地确定范围,因为它节省了 ColdFusion 必须回溯所有范围直到找到您的变量的开销。

在这种情况下,即使您的数据直接来自数据库,您仍应使用 cfqueryparam。防止 SQL 注入只是使用 cfqueryparam 的好处之一;它还有助于提高查询性能:http ://adamcameroncoldfusion.blogspot.co.uk/2012/07/what-one-can-and-cannot-do-with.html

这应该有效:

<cfloop query="q">
     <cfquery datasource="db">
         INSERT INTO table_a ( 
            iln_kaeufer, 
            iln_verkaeufer
         )
         VALUES(
            <cfqueryparam value="#q.iln_kaeufer#" cfsqltype="cf_sql_varchar" maxlength="13">,  // your code didn't have a comma here when using cfqueryparam?
            <cfqueryparam value="#q.iln_verkaeufer#" cfsqltype="cf_sql_varchar" maxlength="13">
        )
      </cfquery>
 </cfloop> 

如果不是,我会说检查列类型和大小。如果仍然不是这样,那么在您循环访问另一个查询时,在另一个查询中可能会出现问题。您可以尝试另一种方式来循环它:

<cfloop index="i" from="1" to="#q.recordcount#">
  use #q.column[i]#
</cfloop>
于 2012-07-17T12:45:14.303 回答
0

当然,出于多种原因,您应该始终使用显式范围,并使用参数化查询 (cfqueryparam)。

使用 cfqueryparam 可以防止 sql 注入,允许准备好的语句并使世界变得更美好。正确地确定范围可能会给您带来一些性能,但最重要的是,它是更好的做法,可以更快地读取代码,因为您不需要弄清楚哪个变量来自哪里。

使用 cfqueryparam 的 mysql 查询引发了什么错误?

于 2012-07-17T12:44:28.140 回答