我一直在用他一直在做的网站帮助一个朋友。他负责维护ColdFusion网站。他主要是网页设计人,我的背景是asp.net。
我遇到的问题是他们希望能够将产品添加到购物车中。为了快速完成这个,我将使用现有的“添加到篮子”动作。问题在于网站通常使用名为productId
的隐藏字段,但快速条目使用ModelID。
我的计划是从SQL后端获取productID
,但每次尝试它都会引发SQL错误。奇怪的是,无论输入的型号如何,错误消息都会显示不同的编号。这是代码
快速输入HTML:
<form action="index.cfm?do=action" method="POST" NAME="quick">
<b>Model Number:</b>
<input type="Text" name="QuickEntryModelNumber" value="" size="8">
<b>Quantity:</b>
<input type="Text" name="Quantity" value="" size="2" maxlength="3"><br>
<input type="hidden" name="wasWholesaler" value="#session.wholesaler#">
<p align="right"><input type="Submit" name="action" value="Add to basket"></p>
</form>
添加到购物篮操作:
<cfif structkeyexists(form,'ProductID')>
<cfparam name="inProductID" type="integer" default = 0>
<cfset inProductID = #form.ProductID#>
<cfelse>
<cfparam name="inProductID" type="integer" default = 0>
<cfquery name="GetID" datasource="#attributes.dsn#">
SELECT P.ProductID
FROM Products P
WHERE P.ModelNumber = #form.QuickEntryModelNumber#
</cfquery>
<cfoutput query="GetID">
<cfset inProductID = #P.ProductID#>
</cfoutput>
</cfif>
基本上我正在检查表单数据中是否存在ProductID
。如果没有从数据库中获取ProductId
。它抛出的错误是:
[Macromedia][SQLServer JDBC Driver][SQLServer]Conversion failed when converting the varchar value '088254PC' to data type int.
无论您为模型ID输入什么,varchar值始终为“088254PC”。当我取出SQL查询并将productId
设置为静态值时,它正常运行。
我想这是一个指出这个页面乱七八糟的好时机。它在不同时期被20多个不同的人所感动。它需要被抛出并从头开始。我没有数据库布局。叹。任何帮助你们可以抛出我的方式将不胜感激。 ColdFusion不是我的事。
答案 0 :(得分:5)
您需要将字符串括在引号中,最好使用cfqueryparam
,ColdFusion会为您处理引号(并帮助防止SQL注入)
<cfparam name="inProductID" type="integer" default = 0>
<cfquery name="GetID" datasource="#attributes.dsn#">
SELECT P.ProductID
FROM Products P
WHERE P.ModelNumber = <cfqueryparam cf_sql_type="cf_sql_varchar" value="#form.QuickEntryModelNumber#">
</cfquery>
您可能将一个整数传递给您的查询,但数据库中的varchar值已经为088254PC
,这就是您每次都看到相同错误的原因。