更新:我正在使用我的所有代码重写每个页面以及我的错误消息...请记住,我很新,老实说,不知道这些代码...
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>
一旦我开始工作,我就可以开始构建输出了...感谢您看一下。
答案 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>
此代码存在一些问题。我会忽略一些开口括号之后的空格,你正在试验并取消一些实验。
"ArrayNew()"
的字符串。您需要在每端添加哈希值。 "#ArrayNew()#"
。StructkeyExists()
和isDefined()
,它们用于类似目的。他们检查变量是否存在,因此他们要求变量名称为字符串,而不是raw。<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使您的查询稍微快一点,而且我最喜欢的部分之一是,当您提供类型时,它会为您处理报价。
Adobe在设计标签时有点傻,而且它有点啰嗦,但你已经习惯了。
您在上面的查询应如下所示:
<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()检查通过。您应该解决此问题的根源。变量的数据类型应在整个应用程序中保持一致,否则您将始终不断尝试检查数据类型。
但是,改变这种情况应该可以解决问题。
<cfif not isDefined("session.scartItems")>
为:
<cfif not isDefined("session.scartItems") or not isArray(session.sCartItems)>
这种方式有效的方法是,如果未定义变量,则检查将停止。如果定义了变量,则检查将继续验证它是否为数组。