Carrinho de compras ColdFusion

actualização: estou a reescrever com todo o meu código para cada página, bem como a minha mensagem de erro... tenha em mente que eu sou muito novo e honestamente não sei alguns deste código...

lista de produtos.cfm 1. a página: (Código da lista de produtos codificados a partir da instrução 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 Página 2: esta é a página com a qual estou tendo problemas... Sei que o meu código está estragado, mas não sei como consertá-lo... o erro que estou a ter está nesta página... o erro é " erro de validação do parâmetro para a Função ARRAYAPPEND."Estou tentando construir um carrinho baseado no link da página anterior.

<!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>

Aplicação.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>
Assim que isto funcionar, posso começar a trabalhar na construção da saída... obrigado por dar uma olhada.

Author: Jason Brown, 2014-11-13

1 answers

Os detalhes da pergunta mudaram significativamente, por isso editar a minha resposta.


  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>
Há alguns problemas com este código. Vou ignorar os espaços depois de alguns parêntesis de abertura, estás claramente a experimentar e a cancelar algumas experiências.
  • na linha 2, não está a criar um array, está a criar um texto com o valor por omissão de "ArrayNew()". Você precisa adicionar hashs em torno de cada extremidade. "#ArrayNew()#".
  • na linha 3, você tem o nome do array Citado, o que é inválido. A maioria das funções de fusão a frio que requerem um nome variável, quer que ele não cotado. Algumas exceções são StructkeyExists() e isDefined(), que servem propósitos similares. Eles verificam se uma variável existe para que eles peçam o nome da variável como uma string, em vez de raw.
  • Linha 4, é assim que se define correctamente uma matriz. bem. A única coisa é que sempre que alguém visita esta página, isto acontece. Esta linha deve ser quando uma sessão é iniciada pela primeira vez e deve ir algo assim <cfif not isDefined("session.cart")><cfset session.cart=ArrayNew(1)></cfif>.
  • Como eu disse antes, você precisa manter os tipos de dados em toda a sua aplicação. Uma correção rápida é resolver seus problemas de código e, em seguida, criar uma página que não tem nada a não ser isso <Cfset structclear(session)>. Isso livra - se de todos os seus dados de sessão antigos. Estás no caminho certo depois disto. Pode ser difícil quando você está tentando depurar algo que você não faz (ainda!) compreender vários aspectos de, mas você vai tê-lo.

Está bem, precisamos de falar sobre outra coisa. És novo. para a CF? Óptimo, está na hora de começar um hábito importante cedo.

A qualquer hora Você está usando um #variable# em uma consulta, use uma tag chamada <cfqueryparam. Há uma coisa miscuviosa chamada injeção SQL, onde um usuário pode modificar uma url para causar estragos no site. Esta etiqueta é a tua defesa principal contra isto. (Há ocasiões em que algumas pessoas não sentem que é necessário, mas você realmente não pode exagerar suas variáveis e como você é novo, é melhor estar seguro do que triste).

Suponha que estou a tomar. Se eu mudar a url para scart.cfm?productID=7; DROP TABLE Products, a sua tabela de produtos desaparece. Ou talvez só queira coisas baratas. (Eu teria que adivinhar os nomes das colunas aqui), mas eu poderia reiniciar todos os seus preços do produto.

Mais Cfquerypara torna as suas perguntas um pouco mais rápidas, e uma das minhas partes favoritas, é que quando você fornece o tipo, ele lida com a citação para você.

O Adobe foi um pouco tolo ao desenhar a etiqueta e é um pouco comprida, mas tu ... habitua-te.

A pesquisa acima deve ser assim:

   <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>
Porque você está usando this.datasource em application.cfc, fornecer um datasource aqui não é necessário. assim, suas consultas podem apenas parecer, o que torna a sua aplicação mais móvel.
<cfquery name="..."> or <cfquery> for queries where name isn't useful.

Se alguma vez se encontrar a utilizar fontes de dados adicionais, poderá guardar os seus nomes no âmbito do pedido, e depois poderá referenciá-los como datasource="#request.db1#" ou #request.db2#', etc. Há algumas aplicações que as pessoas desenharam que pode ter utilizadores particulares a usar diferentes bases de dados para que tenham configurações como #session.db#.

Se eu estivesse à procura de algo por dizer um valor de cadeia de caracteres, o "onde" poderia parecer-se com isto.WHERE ProductID = <cfqueryparam cfsqltype="cf_sql_varchar" value="#form.productName#'>

Veja, a etiqueta cuida da citação, e permite que outros desenvolvedores conheçam seus tipos de dados de uma só vez.


No futuro, por favor, forneça mais do erro. Pelo que mostraste, parece que ...
  • A cfparam declara session.sCartItems algures, provavelmente como um fio básico. (<cfparam name="session.sCartItems" default=""> que basicamente diz, "se não estiver definido, defina-o." Por outras palavras, um cfparam numa variável fará uma verificação isdefinida() passar.
  • Em desenvolvimento, você já declarou sessão.sCartItems como uma corda, e essa ação ainda está viva. Se esse for o caso, a verificação não-definida() falha, e a variável não é re-definida como um array.

Você deve resolver a fonte deste problema. Os tipos de dados das variáveis devem manter-se consistentes em toda a sua aplicação, caso contrário, você sempre estará tentando verificar os tipos de dados.

No entanto, mudar isto deve resolver o teu problema.
<cfif not isDefined("session.scartItems")>

To:

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

A forma como isto funciona é se a sua variável não estiver definida, a verificação termina aqui. Se a sua variável estiver definida, a verificação continua a verificar se é um array.

 1
Author: Regular Joe, 2014-11-18 19:56:55