ColdFusion购物车

时间:2014-11-13 03:16:50

标签: coldfusion shopping-cart

更新:我正在使用我的所有代码重写每个页面以及我的错误消息...请记住,我很新,老实说,不知道这些代码...

productlist.cfm第1页:(从select语句构建的硬编码产品列表代码)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en">
<head>
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/style.css" type="text/css" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/style.css" type="text/css" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/bootstrap.css" type="text/css" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/bootstrap-theme.min.css" type="text/css" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/bootstrap.min.css" type="text/css" />
 <script type = "text/javascript" src="http://students.uwf.edu/jeb48/week8/assignments/scripts/jbrown.js"></script>
 <script type = "text/javascript" src="http://students.uwf.edu/jeb48/week8/assignments/scripts/jbrown2.js"></script>
 <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
 <script type = "text/javascript" src = "http://code.jquery.com/jquery-latest.js" ></script>
 <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
 <title>Scuba Diving is Fun!</title>
</head>
<body>
 <div class="container">
<cfquery name = "getlist" datasource="jeb48_shoppingcart">
 SELECT ProductID, ProductName, ProductQty, ProductPrice, ProductDescription, ProductPhoto
 FROM Products;
</cfquery>
          <div class="row">
            <div class="col-md-2"><b>Product Photo</b></div>
            <div class="col-md-2"><b>Product ID</b></div>
            <div class="col-md-2"><b>Product Name</b></div>
            <div class="col-md-2"><b>Quantity in Inventory</b></div>
            <div class="col-md-2"><b>Product Description</b></div>
            <div class="col-md-2"><b>Unit Price</b></div>
          </div !--row> 
          <cfoutput query ="getlist"> 
          <div class="row  equallist">
            <div class="col-md-2">#getlist.ProductPhoto#</div>
            <div class="col-md-2">#getlist.ProductID#</div>
            <div class="col-md-2">#getlist.ProductName#</div>
            <div class="col-md-2"><div style="text-align:center">#getlist.ProductQty#</div></div>
            <div class="col-md-2"><div style="text-align:left">#getlist.ProductDescription#</div></div>
            <div class="col-md-2"><div style="text-align:left">#DollarFormat(getlist.ProductPrice)#
            <cfif #getlist.ProductQty# gt 0>
            <br><a href = "scart.cfm?productid=#getlist.productid#&qty=1&action=add">Add to Cart</a>
            <cfelse>
            <br>Out of Stock!
            </cfif>
</div></div>
          </div !--row>
          </cfoutput>
        </div !--container>
   </body>
</html>

scart.cfm第2页:这是我遇到问题的页面......我知道我的代码搞砸了,但我不知道如何解决它......我得到的错误就是这个页面...错误是“ARRAYAPPEND函数的参数验证错误”。我正在尝试根据上一页中的链接构建购物车。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en">
  <head>
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/style.css" type="text/css" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/bootstrap.css" type="text/css" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/bootstrap-theme.min.css" type="text/css" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/bootstrap.min.css" type="text/css" />
 <link rel="stylesheet" href="http://students.uwf.edu/jeb48/css/style.css" type="text/css" />
 <script type = "text/javascript" src="http://students.uwf.edu/jeb48/week8/assignments/scripts/jbrown.js"></script>
 <script type = "text/javascript" src="http://students.uwf.edu/jeb48/week8/assignments/scripts/jbrown2.js"></script>
 <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
 <script type = "text/javascript" src = "http://code.jquery.com/jquery-latest.js" ></script>
 <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
 <title>Scuba Diving is Fun!</title>
</head>
<body>


        <div class="container">
        <h3><center>Your Shopping Cart</center></h3>            
        <cfparam name="url.productid" default="">
        <cfparam name="url.qty" default="">
        <cfquery name = "getCartItem" datasource="jeb48_shoppingcart">
           SELECT ProductID, ProductName, ProductQty, ProductPrice, ProductDescription, ProductPhoto
           FROM Products
           WHERE ProductID = #url.productid#;
        </cfquery>

        <cfset arrShoppingCart = arrayNew(1) />
        <cfparam name="session.cart" default="arrayNew()">
        <cfset arrayAppend( "session.cart", structNew() )>
        < cfset session.cart = arrayNew(1) >
        < cfset thisCartItem = arraylen( session.cart )>
        <cfset arrayAppend( session.cart, structNew() )>
        < cfset thisCartItem = arraylen( session.cart )>
        < cfset session.cart[thisCartItem].itemID = url.productid>
        < cfset session.cart[thisCartItem].quantity = url.qty>
</body>
</html>

的Application.cfc

<cfcomponent> 
<cfset this.name = "jeb48SC"> 
<cfset this.datasource = "jeb48_shoppingcart"> 
<cfset this.loginstorage="Session"> 
<cfset this.sessionmanagement="Yes"> 
<cfset this.sessiontimeout="#createtimespan(0,0,45,0)#"> 
</cfcomponent>

一旦我开始工作,我就可以开始构建输出了...感谢您看一下。

1 个答案:

答案 0 :(得分:1)

问题的细节发生了重大变化,因此请编辑我的答案。


  1:  <cfset arrShoppingCart = arrayNew(1) />
  2:  <cfparam name="session.cart" default="arrayNew()">
  3:  <cfset arrayAppend( "session.cart", structNew() )>
  4:  < cfset session.cart = arrayNew(1) >
  5:  < cfset thisCartItem = arraylen( session.cart )>
  6:  <cfset arrayAppend( session.cart, structNew() )>
  7:  < cfset thisCartItem = arraylen( session.cart )>
  8:  < cfset session.cart[thisCartItem].itemID = url.productid>
  9:  < cfset session.cart[thisCartItem].quantity = url.qty>

此代码存在一些问题。我会忽略一些开口括号之后的空格,你正在试验并取消一些实验。

  • 在第2行,您没有创建数组,而是创建一个默认值为"ArrayNew()"的字符串。您需要在每端添加哈希值。 "#ArrayNew()#"
  • 在第3行,您引用了数组名称,该名称无效。大多数需要变量名称的冷聚变函数都希望它不加引号。一些例外是StructkeyExists()isDefined(),它们用于类似目的。他们检查变量是否存在,因此他们要求变量名称为字符串,而不是raw。
  • 第4行,这是您正确设置数组的方式。做得好。唯一的问题是,每次有人访问此页面时,都会发生这种情况。这一行应该是首次启动会话时,它应该是这样的<cfif not isDefined("session.cart")><cfset session.cart=ArrayNew(1)></cfif>
  • 正如我之前所说,您需要在整个应用程序中维护数据类型。一个快速解决方法是解决您的代码问题,然后创建一个除了<Cfset structclear(session)>之外什么都没有的页面。这摆脱了所有旧的会话数据。
  • 此后你走在正确的轨道上。当你试图调试一些你没有(但是!)理解了几个方面的东西时,它会很难,但你会得到它。

好的,我们需要谈谈的其他事情。你是CF的新手吗?那很好,是时候提早开始一个重要的习惯了。

任何时候您在查询中使用#variable#,请使用名为<cfqueryparam的标记。有一种叫做SQL注入的恶作剧,用户可以修改网址以对网站造成严重破坏。此标记是您​​对此

的主要防御

(在某些情况下,有些人认为没有必要,但你真的不能过度调整你的变量,因为你是新手,最好是安全而不是抱歉)。

假设我在scart.cfm?productID=7。如果我将网址更改为scart.cfm?productID=7; DROP TABLE Products,您的产品表格就会消失。或许我只想要便宜的好东西。 scart.cfm?productID=7; UPDATE Products SET PRICE = 1(我必须在这里猜测列名),但我可以重置所有产品价格。

进一步的CFQueryParam使您的查询稍微快一点,而且我最喜欢的部分之一是,当您提供类型时,它会为您处理报价。

Adob​​e在设计标签时有点傻,而且它有点啰嗦,但你已经习惯了。

您在上面的查询应如下所示:

   <cfquery name = "getCartItem" datasource="jeb48_shoppingcart">
       SELECT ProductID, ProductName, ProductQty, ProductPrice, ProductDescription, ProductPhoto
       FROM Products
       WHERE ProductID = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.productID#">
    </cfquery>

哦,因为你在this.datasource中使用application.cfc,所以不需要在这里提供数据源。所以你的查询可能看起来像,这使你的应用程序更具移动性。

<cfquery name="..."> or <cfquery> for queries where name isn't useful.

如果您发现自己使用了其他数据源,可以将其名称存储在请求范围内,然后您可以引用它们,如datasource="#request.db1#"#request.db2#'等。人们设计了一些应用程序可能有特定用户使用不同的数据库,因此他们的设置如#session.db#

如果我通过说一个字符串值来搜索某些内容,那么其中的内容可能会显示为WHERE ProductID = <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.productName#'>

请注意,标记负责引用,并且它可以让其他开发人员一目了然地了解您的数据类型。


将来,请提供更多错误。

根据您的展示,它看起来像是:

  • cfparam在某处声明session.sCartItems,可能是一个基本字符串。 (<cfparam name="session.sCartItems" default="">基本上只是说,“如果没有定义,请定义它。”换句话说,变量上的cfparam将使isDefined()检查通过。
  • 在开发过程中,您之前已将session.sCartItems声明为字符串,并且该操作仍处于活动状态。如果是这种情况,则not-isDefined()检查失败,并且该变量不会重新设置为数组。

您应该解决此问题的根源。变量的数据类型应在整个应用程序中保持一致,否则您将始终不断尝试检查数据类型。

但是,改变这种情况应该可以解决问题。

<cfif not isDefined("session.scartItems")>

为:

<cfif not isDefined("session.scartItems") or not isArray(session.sCartItems)>

这种方式有效的方法是,如果未定义变量,则检查将停止。如果定义了变量,则检查将继续验证它是否为数组。