当我循环查询时,是否必须从查询中获取cfqueryparam或范围值?

时间:2012-07-17 12:35:14

标签: loops coldfusion scope cfqueryparam

我一直坐在Coldfusion8 INSERT进入MySQL(5.0.88)

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

[Record # 1] 
ILN_KAEUFER: 9900000002985 
ILN_VERKAEUFER: 9900000003005 

然后我想像这样做一个INSERT:

<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以及何时不能使用的好解释。

我总是试着把所有东西都放在一边,这是我最后想要的一个错误。

感谢您提供一些见解!

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

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

使用cfqueryparam进行mysql查询时出错了什么错误?