我一直坐在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以及何时不能使用的好解释。
我总是试着把所有东西都放在一边,这是我最后想要的一个错误。
感谢您提供一些见解!
答案 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查询时出错了什么错误?