尝试使用ColdFusion从SQL中获取ID

big*_*rav 0 sql coldfusion web

我一直在用他一直在做的网站帮助一个朋友.他负责维护ColdFusion网站.他主要是网页设计人,我的背景是asp.net.

我遇到的问题是他们希望能够将产品添加到购物车.为了快速完成这个,我将使用现有的"添加到篮子"动作.问题在于网站通常使用名为的隐藏字段productId,但快速条目使用ModelID.

我的计划是productID从SQL后端获取,但每次我尝试它都会引发SQL错误.奇怪的是,无论输入的型号如何,错误消息都会显示不同的编号.这是代码

快速输入HTML:

<form action="index.cfm?do=action" method="POST" NAME="quick">   
  <b>Model Number:</b>
  <input type="Text" name="QuickEntryModelNumber" value="" size="8">&nbsp;&nbsp;&nbsp;
  <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>
Run Code Online (Sandbox Code Playgroud)

添加到购物篮行动:

<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>
Run Code Online (Sandbox Code Playgroud)

基本上我正在检查是否ProductID存在于表单数据中.如果没有ProductId从DB中获取.它抛出的错误是:

[Macromedia][SQLServer JDBC Driver][SQLServer]Conversion failed when converting the varchar value '088254PC' to data type int.
Run Code Online (Sandbox Code Playgroud)

无论您为模型ID输入什么,varchar值始终为"088254PC".当我取出SQL查询并将其设置productId为静态值时,它正常运行.

我想这是一个指出这个页面乱七八糟的好时机.它在不同时期被20多个不同的人所感动.它需要被抛出并从头开始.我没有数据库布局.叹.任何帮助你们可以抛出我的方式将不胜感激.ColdFusion不是我的事.

Mat*_*che 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>
Run Code Online (Sandbox Code Playgroud)

可能正在将一个整数传递给您的查询,但088254PC数据库中已存在varchar值,这就是您每次都看到相同错误的原因.