Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Maxweell

Multiplicacao dos valores de array por valores de post

Recommended Posts

viu o erro ?

você tá passando errado o valor do subtotal... tá indo 'Array'

 

...

se tiver dúvidas, mostre onde você cria a string do UPDATE

Compartilhar este post


Link para o post
Compartilhar em outros sites

É assim:

 

if ($acao == "up")
{
	$quant = $_POST['quant'];
	$id = $_POST['id'];
	$sub = $_POST['sub'];

		if (is_array($quant))
		{	
			foreach($quant as $id => $qtd)
			{
				if(is_numeric($id) && is_numeric($qtd))
				{
					$sql = "UPDATE carrinho SET quant_car = '$qtd', subtotal = '$sub' where id = '$id'";
echo $sql,'<br />';mysql_query( $sql )or die( mysql_error() );
				}
			}
		} 
}
}
Eu tenho que fazer mais um foreach?

tipo..

foreach($sub as $id => $subtotal){

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, acho que é o seguinte:

 

$sql = "UPDATE `carrinho` SET `quant_car` = '{$qtd}', `subtotal` = '{$sub[ $id ]}' WHERE `id` = {$id}";
viu ali a chave do array $sub ?

isso que tava faltando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim até atualiza,

ficou assim:

 

$sql = "UPDATE carrinho SET quant_car = '{$qtd}', subtotal = '{$sub[$id]}' where id = {$id}";

Ele atualiza a quantidade na primeira, mas pra poder atualizar o valor, tenho que clicar 2 vezes no botao...

 

Ele atualiza a quantidade na primeira, mas pra poder atualizar o valor, tenho que clicar 2 vezes no botao...

Alguem sabe pq acontece isso?

teria como no foreach, colocar as duas variaveis que eu recebo por post?

 

$sub / $quant

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque gravar um carrinho de compras (não concretizado) em banco de dados se eu posso desistir da compra a qualquer momento?

 

É que é meio complicado chegar no final e sugerir que jogue tudo fora e comece denovo mas, a melhor maneira de se evitar problemas é fazer da maneira certa.

 

Abra um cookie identificado por UID (talvez até uma session) para armazenar o carrinho e só grave em banco quando a compra estiver em processo de pagamento.

 

A construção do Array do carrinho também está incorreta no meu modo de ver.

 

O índice do array poderia já ser o ID do produto no banco, enquanto seu valor seria a quantidade do mesmo.

 

 

#id | descricao | valor
1 | desodorante | 9.00
2 | refrigerante | 3.00
3 | arroz 5kg | 4.90
4 | detergente | 0.60

// comprando 1 refrigerante, 3 detergentes e 2 pacotes de arroz teríamos:

$carrinho = array(
    2 => 1,
    3 => 2,
    4 => 3
);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao Evandro, esse ta sendo meu grande problema, nao consigo de jeito nenhum fazer, seja com banco, seja com array...até queria fazer com array, pelo motivo que voce falou...

mas eu nao sei por onde começar, se voce puder me ajudar...eu até tinha um codigo com array, mas na hora de gravar no banco, nao dava certo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei um script de carrinho com array e session...

 

produtos.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Video Aula sobre Carrinho de Compras</title>
</head>

<body>
<?php 
      require("conexao.php");
      
      $sql = "SELECT * FROM item";
      $qr = mysql_query($sql) or die(mysql_error());
      while($i = mysql_fetch_assoc($qr)){
         echo '<h2>'.$i['nome'].'</h2> <br />';
         echo 'Preço : R$ '.number_format($i['unitario'], 2, ',', '.').'<br />';
         echo '<a href="carrinho.php?acao=add&id='.$i['id'].'">Comprar</a>';
         echo '<br /><hr />';
      }
?>
</body>
</html>

Carrinho.php

<?php 
      session_start();
      
      if(!isset($_SESSION['carrinho'])){
         $_SESSION['carrinho'] = array();
      }
      
      //adiciona produto
      
      if(isset($_GET['acao'])){
         
         //ADICIONAR CARRINHO
         if($_GET['acao'] == 'add'){
            $id = intval($_GET['id']);
            if(!isset($_SESSION['carrinho'][$id])){
               $_SESSION['carrinho'][$id] = 1;
            }else{
              // $_SESSION['carrinho'][$id] += 1;
            }
         }
         
         //REMOVER CARRINHO
         if($_GET['acao'] == 'del'){
            $id = intval($_GET['id']);
            if(isset($_SESSION['carrinho'][$id])){
               unset($_SESSION['carrinho'][$id]);
            }
         }
         
         //ALTERAR QUANTIDADE
         if($_GET['acao'] == 'up'){
            if(is_array($_POST['prod'])){
               foreach($_POST['prod'] as $id => $qtd){
                  $id  = intval($id);
                  $qtd = intval($qtd);
                  if(!empty($qtd) || $qtd <> 0){
                     $_SESSION['carrinho'][$id] = $qtd;
                  }else{
                     unset($_SESSION['carrinho'][$id]);
                  }
               }
            }
         }
      
      }
      
      
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Video Aula sobre Carrinho de Compras</title>
</head>

<body>
<table>
    <caption>Carrinho de Compras</caption>
    <thead>
          <tr>
            <th width="244">Produto</th>
            <th width="79">Quantidade</th>
            <th width="89">Preço</th>
            <th width="100">SubTotal</th>
            <th width="64">Remover</th>
          </tr>
    </thead>
            <form action="?acao=up" method="post">
    <tfoot>
           <tr>
            <td colspan="5"><input type="submit" value="Atualizar Carrinho" /></td>
            <tr>
            <td colspan="5"><a href="produtos.php">Continuar Comprando</a></td>
    </tfoot>
    <tbody> 
               <?php 
                     if(count($_SESSION['carrinho']) == 0){
                        echo '<tr><td colspan="5">Não há produto no carrinho</td></tr>';
                     }else{
                        require("conexao.php");
                                                               $total = 0;
                        foreach($_SESSION['carrinho'] as $id => $qtd){
                              $sql   = "SELECT *  FROM item WHERE id= '$id'";
                              $qr    = mysql_query($sql) or die(mysql_error());
                              $i    = mysql_fetch_assoc($qr);
                              
                              $nome  = $i['nome'];
                              $preco = number_format($i['unitario'], 2, ',', '.');
                              $sub   = number_format($i['unitario'] * $qtd, 2, ',', '.');
                              
                              $total += $i['unitario'] * $qtd; 
                           
                           echo '<tr>        
                                 <td>'.$nome.'</td>
                                 <td><input type="text" size="3" name="prod['.$id.']" value="'.$qtd.'" /></td>
                                 <td>R$ '.$preco.'</td>
                                 <td>R$ '.$sub.'</td>
                                 <td><a href="?acao=del&id='.$id.'">Remove</a></td>
                              </tr>';
                        }
                           $total = number_format($total, 2, ',', '.');
                           echo '<tr>
                                    <td colspan="4">Total</td>
                                    <td>R$ '.$total.'</td>
                              </tr>';
                     }
               ?>
     </tbody>
        </form>
</table>
</body>
</html>
Agora eu preciso finalizar, gravando no banco...alguem pode me dar uma ideia ? eu uso foreach ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você entendeu cada passo que foi realizado aí ou só copiou e colou pra ver se funcionava? Eu tinha pensado e preparado algo bem similar mas, como já estava meio tarde, não cheguei a postar. Se desejar, posso realizar a postagem do que tenho aqui e creio que você será bem capaz de gravar os dados no banco sozinho se conseguir compreender o funcionamento do sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não vou te dizer que entendi 100% cada passo,

Alguma coisa eu consegui entender sim...

Se voce puder me ajudar, eu agradeço! quem sabe esse que voce postar eu entenda melhor..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente, preciso que você entenda que o conteúdo de 'produtos.php' foi gerado apenas para evitar o registro em banco de dados, consultas etc.

session_start();
if(!isset($_SESSION['carrinho'])) $_SESSION['carrinho'] = Array();

$produtos = Array(

	Array('id' => 1001,	'nome'=>'Mouse',		 'descr'=>'Laser sem fio bluetooth p/ notebook',		 'valor'=>8.00),
	Array('id' => 1002,	'nome'=>'Teclado',		 'descr'=>'ABNT Multimídia',					 'valor'=>15.00),
	Array('id' => 1003,	'nome'=>'Caixa de som',		 'descr'=>'Stereo 200w',					 'valor'=>12.00),
	Array('id' => 1004,	'nome'=>'Monitor',		 'descr'=>'LED 22" FULL HD',					 'valor'=>640.00),
	Array('id' => 1005,	'nome'=>'Impressora',		 'descr'=>'Laser 20 fls/min',					 'valor'=>350.00),
	Array('id' => 1006,	'nome'=>'Processador',		 'descr'=>'4 Núcleos @ 1.8 Ghz',				 'valor'=>655.00),
	Array('id' => 1007,	'nome'=>'Memória',		 'descr'=>'2GB DDR3 1600Mhz',					 'valor'=>240.00)
	
);

/* A função a seguir deve ser substituída por uma consulta ao banco */
function pegaProd($id){
	global $produtos;
	foreach($produtos as $index=>$prod)
		if($prod['id'] == $id) return $produtos[$index];
	return FALSE;
}

No exemplo, toda vez que for mencionado $produtos, o resultado é equivalente a uma busca geral pelo banco (select * from produtos ...). Por sua vez, quando for mencionada a função pegaProd, a referência é a uma busca específica (select * from produtos where id=00).

 

Entendido isso, vamos aos requisitos:

 

É imprescindível que você saiba trabalhar com sessões para o bom entendimento do exemplo.

 

Uma compra se divide em 4 passos básicos:

  • listagem e escolha do produto
  • definição da quantidade de produtos
  • confirmação da inclusão
  • listagem do carrinho

Para facilitar o entendimento, cada passo será dividido em um arquivo (index.php, comprar.php, confirma.php, carrinho.php respectivamente) que será explicado detalhadamente a seguir.

 

Compreender também como se manipula matrizes/vetores bi-dimensionais também vai auxiliar no rápido entendimento do exemplo.

 

Outra nota importante é que, para fins de redução, não foi tomada nenhuma medida extra de verificação de segurança ou mal uso do visitante. Em programações oficiais certifique-se de sempre testar todas as possibilidades de erro e cobri-las. A única medida de teste tomada foi a verificação da existência da variável $_SESSION['carrinho'] pois a mesma é de vital importância para funcionamento do sistema.

 

A última nota a tomar é sobre o uso de duas notações de strings diferenciadas que foi utilizado. Caso surja alguma dúvida, você pode recorrer rapidamente ao manual.

 

Chega de lero-lero e vamos ao que interessa:

 

A listagem foi embutida dentro de index.php porque é de nosso interesse exibir algo como as ofertas em alta do dia, assim que o visitante acessa a página. Essas ofertas, não deixam de ser um tipo de listagem

include "produtos.php"; // Inicializa a sessão, a variável do carrinho e recupera a lista de produtos.

echo '<ul>';
foreach($produtos as $info) {
	$valor = number_format($info['valor'], 2, ",", ".");
	echo "\n\t<li>
	<h1>{$info['nome']}</h1>
	<p>{$info['descr']}</p>
	<p>R$ {$valor}</p>
	<p><a href=\"comprar.php?idproduto={$info['id']}\">Adicionar ao carrinho</a></p>
\t</li>";
}
echo '</ul>';

echo '<a href="carrinho.php">Ver meu carrinho</a>';

http://br2.php.net/manual/pt_BR/control-structures.foreach.php

http://br2.php.net/manual/pt_BR/function.number-format.php

 

Abrindo o código gerado no navegador, poderá verificar que foi criada uma lista <ul> de produtos e vários links para o próximo passo: a definição de quantidade. Esta definição reside no código que foi colocado em comprar.php

include "produtos.php";
$prod = pegaProd($_GET['idproduto']); // consultamos no banco apenas pelo produto de nosso interesse

echo '<h1>Compra de <i>'. $prod['nome'] . '</i></h1>
<p>Valor unitário: R$ ' . number_format($prod['valor'], 2, ',', '.') . '</p>
<form action="confirma.php" method="post">
	<input type="hidden" name="id" value="'. $prod['id'] . '">
	<label for="qtdProd">Digite o número de unidades</label>
	<input type="text" size="2" name="qtd" id="qtdProd">
	<button type="submit">Adicionar ao carrinho!</button>
</form>';

http://php.net/manual/pt_BR/reserved.variables.get.php

 

Preparamos um formulário que enviará para a próxima página o identificador {input|hidden|id} e a quantidade {input|text|qtd} do produto desejado. Ao clicar em 'Adicionar ao carrinho!' o visitante/usuário/cliente termina o processo de compra do produto X e deverá ser enviado novamente à listagem, veremos isso com a confirmação do terceiro passo, através de confirma.php

 

include "produtos.php"; // Fizemos o include nesse passo apenas para confirmar a existência de $_SESSION['carrinho']

$_SESSION['carrinho'][$_POST['id']] = $_POST['qtd'];

header('Location: /');

http://www.php.net/manual/pt_BR/reserved.variables.post.php

http://br2.php.net/manual/pt_BR/function.header.php

 

O cabeçalho Location direciona o usuário para o endereço passado. "/" é um apelido para a página inicial do site. Queremos devolver o visitante para a página de listagem de produtos.

 

Por fim, precisamos verificar em nosso carrinho se tudo está em ordem, a quantidade de produtos foi pedida corretamente e o principal, ver o quanto vamos gastar ;). Para isso, temos a última parte do código, carrinho.php

include "produtos.php";

$subtotal = 0;
// Contabilizando o carrinho
foreach($_SESSION['carrinho'] as $id=>$qtd) {
	$prod = pegaProd($id);
	$subtotal += $prod['valor'] * $qtd;
}
$subtotal = number_format($subtotal, 2, ',', '.');

echo <<<HTML
<table>
	<thead>
		<tr>
			<td>Produto</td>
			<td>Quantidade</td>
			<td>Valor Unit.</td>
			<td>Valor Total</td>
		</tr>
	</thead>
	<tfoot>
		<tr>
			<td colspan="3">Subtotal</td>
			<td>R$ {$subtotal}</td>
		</tr>
	</tfoot>
	<tbody>
HTML;

foreach($_SESSION['carrinho'] as $id=>$qtd) {
	$prod = pegaProd($id);
	$valorUnit = number_format($prod['valor'], 2, ',', '.');
	$valorTot = number_format($prod['valor'] * $qtd, 2, ',', '.');
	echo <<<HTML
		<tr>
			<td>{$prod['nome']}</td>
			<td>{$qtd}</td>
			<td>R$ {$valorUnit}</td>
			<td>R$ {$valorTot}</td>
		</tr>
HTML;
}

echo '	</tbody>
</table>';

Este é grande mais pela existência da tabela do que por lógica de programação. Existem maneiras de melhor performance para a listagem do carrinho, mas preferi me manter no simples para facilitar o entendimento.

 

Creio que verificando a lógica aplicada, você seja capaz de adaptar à sua necessidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vejamos se eu entendi,

 

produtos.php

Cadastrados no array manualmente.

funcao pegaProd, pega os dados da array pra mostrar no index.php.

 

index.php

Chama a funcao pegaProd e mostra os produtos.

 

O que eu nao entendi foi como vou fazer a consulta no banco nessa função...

 

/* A função a seguir deve ser substituída por uma consulta ao banco */
function pegaProd($id){
        global $produtos;
        foreach($produtos as $index=>$prod)
                if($prod['id'] == $id) return $produtos[$index];
        return FALSE;
}
Fazendo desse jeito, até consegui mostrar os produtos, adicionei ao carrinho...

mas na hora de mostrar os produtos do carrinho deu um erro

no foreach

 

Warning: Invalid argument supplied for foreach()
Esse é o foreach:
foreach($_SESSION['carrinho'] as $id=>$qtd) {

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente, preciso que você entenda que o conteúdo de 'produtos.php' foi gerado apenas para evitar o registro em banco de dados, consultas etc

No seu caso, você tem os dados em banco para acesso.

 

No exemplo, toda vez que for mencionado $produtos, o resultado é equivalente a uma busca geral pelo banco (select * from produtos ...). Por sua vez, quando for mencionada a função pegaProd, a referência é a uma busca específica (select * from produtos where id=00).

Pro seu caso, deve ser feito algo assim:

$sql = mysql_query('SELECT * FROM `produtos`');
$produtos = array();
while(false !== ($row = mysql_fetch_assoc($sql))) $produtos[] = $row;

$sql = mysql_query('SELECT * FROM `produtos` WHERE `id`=' .$_GET['idproduto']);
$prod = mysql_fetch_assoc($sql);

Dessa forma, você exporta a verificação do carrinho

session_start();
if(!isset($_SESSION['carrinho'])) $_SESSION['carrinho'] = array();

Para todos os outros arquivos e não precisa mais do arqruivo 'produtos.php'

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, tbm estou tentando fazer um carrinho parecido com esse e estou com o mesmo problema pra atualiza o subtotal, tentei todas as alternativas citadas aqui e acontece a mesma coisa. simplesmente nao pega o valor do subtotal calculado.

 

ninguem ai pode explicar porque a quantidade funciona e o subtotal que é quase parecido a forma de fazer não da certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.