这是我第一次注意到ColdFusion表现出这种行为。我在更新一个查询以使用
此外,我们通常会对插入值使用
对于这个示例,我们将假设"first_string"和"second_string"包含一些文本,例如来自
我们还可以假定"md5_hashed_value"列的SQL数据类型为char(32)。 场景1:
在第一个场景中,将创建哈希值。 场景2:
在第二种情况下,计算出的哈希值与第一种情况不同。 第三种情况
在这第三个场景中,插入到数据库的值与第一个场景中插入的值相同。
为什么会这样呢?无论在哪种情况下,hash()函数的调用方式都是相同的。它在代码中的位置是唯一的不同之处。当hash()函数直接在SQL查询中调用而非通过
<cfqueryparam>
时遇到了这个问题。该代码运行在ColdFusion 8平台上,我没有参考其在该版本之外的行为的资料。此外,我们通常会对插入值使用
<cfqueryparam>
,这也促使我们对这个问题进行调查。对于这个示例,我们将假设"first_string"和"second_string"包含一些文本,例如来自
<textarea>
表单发布的标题和带有换行符的一些段落文本。我们还可以假定"md5_hashed_value"列的SQL数据类型为char(32)。 场景1:
<cfset hashed_value = hash(first_string & second_string, "MD5")>
<cfquery name="my_query" datasource="#my_datasource_name#">
INSERT INTO my_table
(
md5_hashed_value
)
VALUES
(
'#hashed_value#'
)
</cfquery>
在第一个场景中,将创建哈希值。 场景2:
<cfquery name="my_query" datasource="#my_datasource_name#">
INSERT INTO my_table
(
md5_hashed_value
)
VALUES
(
'#hash(first_string & second_string, "MD5")#'
)
</cfquery>
在第二种情况下,计算出的哈希值与第一种情况不同。 第三种情况
<cfquery name="my_query" datasource="#my_datasource_name#">
INSERT INTO my_table
(
md5_hashed_value
)
VALUES
(
<cfqueryparam value="#hash(first_string & second_string, "MD5")#" CFSQLType="CF_SQL_CHAR">
)
</cfquery>
在这第三个场景中,插入到数据库的值与第一个场景中插入的值相同。
为什么会这样呢?无论在哪种情况下,hash()函数的调用方式都是相同的。它在代码中的位置是唯一的不同之处。当hash()函数直接在SQL查询中调用而非通过
<cfqueryparam>
值或<cfset>
时,似乎会发生一些奇怪的事情。