我永远坐在Coldfusion8插入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,什么时候不能。
我总是尝试参数&审视一切,这是我最不希望看到的错误。
感谢您提供一些见解!
因此,您应该始终尽可能地确定范围,因为这节省了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>
当然,您应该始终使用显式作用域,并使用参数化查询(cfqueryparam),原因有很多。
使用cfqueryparam可以防止sql注入,允许编写语句,让世界变得更美好。正确地确定范围可能会为您带来一些性能,但最重要的是,它是一种更好的做法,可以更快地读取代码,因为您不想弄清楚哪个变量来自哪里。
使用cfqueryparam的mysql查询引发了什么错误?