JavaScript变量到ColdFusion变量

时间:2010-01-30 15:58:42

标签: javascript coldfusion character-encoding

我有一个棘手的问题。

通过<cfoutput query="…">我从SQL Server数据库列出页面中的一些记录。

在每行查看结束时,我尝试将其添加到MySQL数据库中的记录中。 如您所见,这很简单,因为我可以使用输出查询中的确切变量到我的新INSERT INTO语句中。

但是:rsPick.name来自具有不同字符集的数据库,并且将其直接放入我的新数据库的唯一方法是从网页读取它而不是输出查询中的值

所以我用我制作的那个小JavaScript读取了这个值并将它放在myValue变量中,然后我希望ColdFusion读取该变量以便将它放在我的SQL语句中。

 <cfoutput query="rsPick">
  <tr>
    <td>#rsPick.ABBREVIATION#</td>
    <td id="square"> #rsPick.name# </td>

    <td>#rsPick.Composition#</td>
    <td> Transaction done...
      <script type="text/javascript">
        var myvalue = document.getElementById("square").innerHTML
      </script>
    </td>

  <cfquery datasource="#Request.Order#">
     INSERT INTO products (iniid, abbreviation, clsid, cllid, dfsid, dflid, szsid, szlid, gross, retail, netvaluebc, composition, name)
     VALUES ( #rsPick.ID#, '#rsPick.ABBREVIATION#', #rsPick.CLSID#, #rsPick.CLLID#, #rsPick.DFSID#, #rsPick.DFLID#, #rsPick.SZSID#, #rsPick.SZLID#, #rsPick.GROSSPRICE#, #rsPick.RETAILPRICE#, #rsPick.NETVALUEBC#, '#rsPick.COMPOSITION#','#MYVALUE#' )
  </cfquery>
 </tr>
</cfoutput>

6 个答案:

答案 0 :(得分:5)

在提供页面之前,在服务器上处理ColdFusion。提供页面后,将在浏览器中处理JavaScript。因此,JavaScript为ColdFusion提供值的唯一方法是:

a)将变量设置为表单字段,然后将页面发回服务器。

b)通过Ajax将变量发送回Coldfusion。

我认为有一种更安全,更可靠的方法可以在没有JavaScript的情况下完成所需的工作。您能否向我们提供有关数据的更多信息,甚至可以作为一个例子?

答案 1 :(得分:2)

如果你正在创建页面,你会知道DOM元素中的“square”是什么,因为你把它放在那里。如果您是根据用户的动态输入执行此操作,那么您需要使用CFAJAXPROXY或仅使用表单发布到不同页面进行插入。

从DOM中取出未经过处理的输入并插入数据库也是令人恐惧的。使用cfqueryparam来防止注入攻击。

答案 2 :(得分:1)

你的误解始于这个想法:

  

“实现正确的唯一方法是通过JavaScript从网页中读取价值。”

对不起,如果这听起来很刺耳,但这完全是胡说八道。忘了那个主意。无法以您尝试的方式从ColdFusion读取JavaScript变量,也不是必需的。

对于初学者,我不确定为什么必须通过ColdFusion将值从一个数据库移动到另一个数据库。数据库服务器完全能够直接相互通信,例如通过MS SQL Server中的“链接服务器”功能(see this howto)。

如果必须是ColdFusion,请尝试:

<cfoutput query="rsPick">
  <cfquery datasource="#Request.Order#">   
     INSERT INTO products (
       iniid, 
       /* … etc … */
       name
     )
     VALUES (
       <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#rsPick.ID#">,
       /* … etc … */
       <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#rsPick.name#">
     )
  </cfquery>
</cfoutput>

只要正确设置了表数据类型和数据库与两个数据库的连接,ColdFusion就会透明地处理字符编码。请注意,目标数据库字段不应该比源字段“能力低”,例如当目标是US ASCII时,源不应该是Unicode。

答案 3 :(得分:1)

嗯,你的问题是这样的:如何在ColdFusion中从一个字符编码到另一个字符编码?

您可以在SQL Server中使用NVARCHAR类型(不确定MySQL中的相同内容) - 并且只将字符数据存储为UTF8吗?

此外,Java完全有能力处理不同的编码,甚至在String类和CharsetDecoder类中提供帮助来处理不同的编码:

String s = new String("Hello, World!");
byte[] bytes = s.getBytes("UTF-8");
String utf = new String(bytes, "UTF-8");

ColdFusion对在单个请求中处理多个字符集的支持非常有限。您几乎肯定会依赖底层的Java类来解决ColdFusion中的这个问题。

答案 4 :(得分:0)

所以,如果你想将JS值转换为CFM,我觉得需要做一些步骤:

首先,通过javascript将您的JS值分配到输入中。之后,通过提交表单从此输入中检索值。

答案 5 :(得分:-2)

使用JSString将Javascript变量转换为CFML变量。

<cfoutput>
    var #toScript(myCFMLVaraible, "jsVar")#;
</cfoutput>