Ir para conteúdo

Arquivado

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

montano

Criar um array SESSION

Recommended Posts

boa noite, tenho uma classe de carrinho de compra, e esta funcionando bem,porem eu gostaria de atribuir agora o campo quantidade a minha compra, nao estou conseguindo.

 

<?php
require_once("executar.php");

class Carrinho extends Model
{

    function __construct()
    {
    	parent::__construct('localhost','root','','apul');
        session_start();
        if (empty($_SESSION['carrinho']))
        {
            self::novoCarrinho();
        }
    }

    function novoCarrinho()
    {
        $_SESSION['carrinho'] = array();
    }

    function addProduto($produto)
    {
        array_push($_SESSION['carrinho'], $produto);
    }

    function delProduto($produto)
    {
        $i = array_search($produto, $_SESSION['carrinho']);
        unset($_SESSION['carrinho'][$i]);
    }

    function mostraCarrinho()
    {
        foreach ($_SESSION['carrinho'] as $produto)
        {
            echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'>";
            echo '<p>' . $produto . '</p>';
            echo "<input type='hidden' name='delProduto' value='$produto'>";
            echo "<input type='submit' name='botao' value='Deletar'>";
            echo "</form>";
        }
    }

    function gerarPedido()
    {
        foreach ($_SESSION['carrinho'] as $produto)
        {
            $this->execute("INSERT INTO tb_pedidos (session,produto)
								VALUES ('" . session_id() . "','" . $produto . "')");
        }
        session_destroy();
        $this->redireciona();
    }
}
?>

No caso eu teria que criar:

$_SESSION['carrinho']['produto'] = array();
$_SESSION['carrinho']['quantidade'] = array();

e dae usar do mesmo jeito nas function?

 

Agradeço muito..

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

 function existe($produto)
    {
        return array_search($produto, $_SESSION['produto']);
    }

    function jaExiste($produto)
    {
        echo "<script>alert('$produto já existe em seu carrinho.'); window.location='" .
            $_SERVER['PHP_SELF'] . "'</script>";
    }

    //PRODUTO SÒ PODE CADASTRAR UMA VEZ
    function addProduto($produto)
    {
        if ($this->existe($produto) != 0)
        array_push($_SESSION['produto'], $produto);
        else
        $this->jaExiste();
    }

Porque isso nao funciona? Eu nao posso deichar cadastrar dois produto igual.

Eu estou trabalhando com valores do array, nao teria que ser a chave dele?

como eu trabalho com a 'PrimaryKEY' digamos assim de um array?

 

valeuuu

 

Matias, eu nao tenho que criar dois array?

 

$_SESSIO['produto'] = array();
$_SESSION['qnt'] = array();

ou

 

$_SESSION['carrinho']['produto'] = array();
$_SESSIO['carrinho']['qnt'] =array ();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Transforme seu array (que você deseja salvar na sessão) em string, e salve-a em uma única variável da sessão.

 

Depois, pegue a string que está na sessão e converta em array novamente antes de trabalhar. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

okay, isso para conferir se existe o produto cadastrado ?

 

:S

 

Eu estou com uma duvida, pois nao sei como fazer 2 coisas

1ª conferir se o produto ja existe no carrinho.

2ª Digitar a quantidade de produto depois de incluido no carrinho, e associar essa quantidade a tal produto.

tipo vou ter 2 arrays, um produto e outro quantidade, ou 1 vetor de 2 lugares (se é possivel)

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu montaria o array...

 

$_SESSION['carrinho'][aqui_vai_o_id_do_produto]['quantidade'];
$_SESSION['carrinho'][aqui_vai_o_id_do_produto]['valor'];

 

Aí, se for incluído outro produto, imaginando que o id deste produto seja 1, você testa assim...

if(isset($_SESSION['carrinho'][1]['quantidade'])
{
$_SESSION['carrinho'][1]['quantidade']++;
}
else
{
$_SESSION['carrinho'][1]['quantidade'] = 1;
}

 

Para pegar a chave separada depois, use um foreach... Assim

 

foreach($_SESSION['carrinho'] as $chave => $valor)
{
echo 'O produto de id '.$chave.' tem a quantidade selecionada de '.$valor['quatidade'].', com o valor unitário de '.$valor['valor'].'.<br/>';
}

Mais ou menos isto

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
require_once ("executar.php");

class Carrinho extends Model
{

    //Estancia MODEL, cria carrinho caso ele nao exista
    function __construct()
    {
        parent::__construct('localhost', 'root', '', 'apul');
        session_start();
        if (empty($_SESSION['carrinho']))
        {
            self::novoCarrinho();
        }
    }

    //Cria carrinho
    function novoCarrinho()
    {
        $_SESSION['carrinho']['produto']['qnt'] = array();
    }

    //Verifica se existe produto no carrinho e adiciona +1 na quantidade caso exista
    function existe($produto)
    {
        if (isset($_SESSION['carrinho'][$produto]['quantidade']))
        {
            $_SESSION['carrinho'][$produto]['quantidade']++;
            return 1;
        }
    }



    //PRODUTO SÒ PODE CADASTRAR UMA VEZ
    function addProduto($produto)
    {
       if ($this->existe($produto) == 1){
            array_push($_SESSION['carrinho']['produto']['qnt'], $produto);
            }
    }
    

    function delProduto($produto)
    {
        $i = array_search($produto, $_SESSION['carrinho'][$produto]['qnt']);
        unset($_SESSION['carrinho'][$i]['qnt']);
    }

    function addQuantidade($produto, $qnt)
    {
        $i = array_search($produto, $_SESSION['carrinho']['produto']['qnt']);
        $_SESSION['carrinho']['produto'][$i] + $qnt;
    }

    function mostraCarrinho()
    {
        foreach ($_SESSION['carrinho']['produto']['qnt'] as $produto)
        {
            echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'>";
            echo '<p>' . $produto;
            echo "<input type='hidden' name='delProduto' value='$produto'>";
            echo "<input type='submit' name='botao' value='Deletar'></p>";
            echo "</form>";
        }
    }

    function gerarPedido()
    {
        foreach ($_SESSION['carrinho']['produto']['qnt'] as $produto)
        {
            $this->execute("INSERT INTO tb_pedidos (session,produto)
								VALUES ('" . session_id() . "','" . $produto . "')");
        }
        session_destroy();
        $this->redireciona();
    }
}
?>

Nao ta funcionando, ele nao identifica que o produto ja existe, nao sei se to trabalhando certo com esses array :S

Esse meu codigo esta certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá uma revisada no teu código... Você está usando 2 padrões para o array...

 

$_SESSION['carrinho']['produto']['qnt']

E

 

$_SESSION['carrinho'][$produto]['quantidade'])

Padronize.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora esta funcionando, eu consigo adicionar um produto no carrinho, depois no carrinho adicionar a quantidade que eu quero e gravar no bd confirmando o pedido e destruindo a sessao. Se nao for pedir de mais voce poderia da uma ultima olhada ja que tem mais experiencia, sistema desses nao da pra dar erro. valeu Matias

<?php
require_once ("executar.php");

class Carrinho extends Model
{

    function __construct()
    {
        parent::__construct('localhost', 'root', '', 'apul');
        session_start();
        if (empty($_SESSION['produto']))
        {
            self::novoCarrinho();
        }
    }

    function novoCarrinho()
    {
        $_SESSION['produto'] = array();
        $_SESSION['qnt'] = array();
    }

    function keyProduto($produto)
    {
        return array_search($produto, $_SESSION['produto']);
    }

    function addProduto($produto)
    {
        array_push($_SESSION['produto'], $produto);
    }

    function delProduto($produto)
    {
        $i = array_search($produto, $_SESSION['produto']);
        unset($_SESSION['produto'][$i]);
        unset($_SESSION['qnt'][$i]);
    }

    function addQuantidade($produto, $qnt)
    {
        $i = array_search($produto, $_SESSION['produto']);
        $_SESSION['qnt'][$i] = $qnt;
    }

    function mostraCarrinho()
    {
        foreach ($_SESSION['produto'] as $produto)
        {
            echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'>";
            echo "<p>". $produto;
            $key = $this->keyProduto($produto);
            echo "<input type='text' name='addQuantidade' value='" . $_SESSION['qnt'][$key] . "' size='2'>";
            echo "<input type='hidden' name='delProduto' value='" . $produto . "'>";
            echo "<input type='submit' name='botao' value='+'>";
            echo "<input type='submit' name='botao' value='Deletar'></p>";
            echo "</form>";
        }
    }

    function gerarPedido()
    {
        foreach ($_SESSION['produto'] as $produto)
        {
        	$key = $this->keyProduto($produto);
            $this->execute("INSERT INTO tb_pedidos (session,produto,qnt_solicitada)
							VALUES ('" . session_id() . "','" . $produto . "','" . $_SESSION['qnt'][$key] . "')");
        }
        session_destroy();
        $this->redireciona();
    }
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Me surgiu uma duvida, como eu pego a Key de um array?

 

porque eu tenho 2 problemas mas eu só preciso corrigir 1:

 

1ª ou eu permito que a pessoa adiciona só 1 vez o produto, (dae eu posso fazer referencia pelo nome do produto)

2ª ou eu aprendo a pegar a referencia da key do array.

Porque quando eu adiciona 2 vezes Produto A e modifico a quantidade em 1 deles, ele modifica para os dois Produto A, entende? heheheh nao tem unicidade. Oque voces aconselha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta ai , esta agora verificando se existe o produto e adiciona +1 caso exista, obrigado matias pela ajuda, codigo ta ai pra ser usado por qualquer um, sei que minhas duvidas sao de outros varios. matias caso tenho algo errado no codigo peço que poste ^^. valeuu

<?php
require_once ("executar.php");

class Carrinho extends Model
{

    function __construct()
    {
        parent::__construct('localhost', 'root', '', 'apul');
        session_start();
        if (empty($_SESSION['produto']))
        {
            self::novoCarrinho();
        }
    }

    function novoCarrinho()
    {
        $_SESSION['produto'] = array();
        $_SESSION['qnt'] = array();
    }

    function addProduto($produto)
    {
    	$key = $this->keyProduto($produto);
    	if (empty($key))
        array_push($_SESSION['produto'], $produto);
        else
        $this->addQuantidade($produto,$_SESSION['qnt'][$key] + 1);
    }

    function delProduto($produto)
    {
        $key = $this->keyProduto($produto);
        unset($_SESSION['produto'][$key]);
        unset($_SESSION['qnt'][$key]);
    }

    function addQuantidade($produto, $qnt)
    {
        $key = $this->keyProduto($produto);
        $_SESSION['qnt'][$key] = $qnt;
    }

    function mostraCarrinho()
    {
        foreach ($_SESSION['produto'] as $produto)
        {
            echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'>";
            echo "<p>". $produto;
            $key = $this->keyProduto($produto);
            echo "<input type='text' name='addQuantidade' value='" . $_SESSION['qnt'][$key] . "' size='2'>";
            echo "<input type='hidden' name='delProduto' value='" . $produto . "'>";
            echo "<input type='submit' name='botao' value='+'>";
            echo "<input type='submit' name='botao' value='Deletar'></p>";
            echo "</form>";
        }
    }
    
    function keyProduto($produto)
    {
        return array_search($produto, $_SESSION['produto']);
    }

    function gerarPedido()
    {
        foreach ($_SESSION['produto'] as $produto)
        {
        	$key = $this->keyProduto($produto);
            $this->execute("INSERT INTO tb_pedidos (session,produto,qnt_solicitada)
							VALUES ('" . session_id() . "','" . $produto . "','" . $_SESSION['qnt'][$key] . "')");
        }
        session_destroy();
        $this->redireciona();
    }
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria diferente o array da SESSION... Como fica quando tem um produto, olha só...

 

$_SESSION['produto'][$i]
$_SESSION['qnt'][$i]

 

Eu faria tudo em uma linha só...

$_SESSION['carrinho'][$i]['quantidade']

 

Na parte de adicionar produto, você cria 2 métodos, um para adicionar produto, e outro para adicionar quantidade...

Daria para fazer tudo em um só (utilizando o formato de session que eu coloquei)

 

   function addProduto($produto,$qtde)
   {
       if(isset($_SESSION['carrinho'][$produto]['qtde']))
       {
           $_SESSION['carrinho'][$produto]['qtde'] += $qtde; 
       }
       else
       {
           $_SESSION['carrinho'][$produto]['qtde'] = $qtde; 
       }
   }

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem um erro que ta ocorrendo só, é que o primeiro produto cadastrado na session ele nao acha depois para conferir se ja existe, isso acontece só com o 1ª produto adicionado :S

Compartilhar este post


Link para o post
Compartilhar em outros sites


<?php

include ('config/config.php');

require_once ('model/executar.php');

 

class Carrinho extends Executar

{

 

function __construct($servidor, $usuario, $senha, $bd)

{

parent::__construct($servidor, $ususario, $senha, $bd);

session_start();

if (empty($_SESSION['produto']))

{

self::novoCarrinho();

}

}

 

function novoCarrinho()

{

$_SESSION['produto'] = array();

$_SESSION['qnt'] = array();

}

 

function addProduto($produto)

{

$key = $this->keyProduto($produto);

if (empty($key))

array_push($_SESSION['produto'], $produto);

else

$this->addQuantidade($produto, $_SESSION['qnt'][$key] + 1);

}

 

function delProduto($produto)

{

$key = $this->keyProduto($produto);

unset($_SESSION['produto'][$key]);

unset($_SESSION['qnt'][$key]);

}

 

function addQuantidade($produto, $qnt)

{

$key = $this->keyProduto($produto);

$_SESSION['qnt'][$key] = $qnt;

}

 

function mostraCarrinho()

{

echo '<table>';

echo '<tr><td>Produto</td><td>Quantidade</td><td>Estatus</td></tr>';

foreach ($_SESSION['produto'] as $produto)

{

echo '<tr>';

echo "<form method='POST' action='?menu=produtos'>";

echo "<td>" . $produto . '</td>';

$key = $this->keyProduto($produto);

echo "<td><input type='text' name='addQuantidade' value='" . $_SESSION['qnt'][$key] .

"' size='3'></td>";

echo '<td></td>';

echo "<input type='hidden' name='delProduto' value='" . $produto . "'>";

echo "<td><input type='submit' name='botao' value='+'></td>";

echo "<td><input type='submit' name='botao' value='Deletar'></td>";

echo "</form>";

echo '</tr>';

}

echo '</table>';

}

 

function keyProduto($produto)

{

return array_search($produto, $_SESSION['produto']);

}

 

function gerarPedido()

{

foreach ($_SESSION['produto'] as $produto)

{

$key = $this->keyProduto($produto);

$this->execute("INSERT INTO tb_pedidos (session,produto,qnt_solicitada)

VALUES ('" . session_id() . "','" . $produto . "','" . $_SESSION['qnt'][$key] .

"')");

}

session_destroy();

$this->redireciona();

}

}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, dei uma arrumada... Dá uma olhada aí...

 

<?php
class Carrinho
{

   function __construct()
   {
       session_start();
       if (empty($_SESSION['carrinho']))
       {
           $this->novoCarrinho();
       }
   }

   function novoCarrinho()
   {
       $_SESSION['carrinho'] = array();
   }

   function addProduto($produto, $qtde)
   {
       if (isset($_SESSION['carrinho'][$produto]))
           $_SESSION['carrinho'][$produto] += $qtde;
       else
           $_SESSION['carrinho'][$produto] = $qtde;
   }

   function delProduto($produto)
   {
       unset($_SESSION['carrinho'][$produto]);
   }

   function mostraCarrinho()
   {
       echo '<table>';
       echo '<tr><td>Produto</td><td>Quantidade</td><td>Estatus</td></tr>';
       foreach ($_SESSION['carrinho'] as $produto => $qtde)
       {       
               echo '<tr>';
           echo "<form method='POST' action='?menu=produtos'>";
           echo "<td>" . $produto . '</td>';
           echo "<td><input type='text' name='addQuantidade' value='" . $qtde .
               "' size='3'></td>";
           echo '<td></td>';
           echo "<input type='hidden' name='delProduto' value='" . $produto . "'>";
           echo "<td><input type='submit' name='botao' value='+'></td>";
           echo "<td><input type='submit' name='botao' value='Deletar'></td>";
           echo "</form>";
           echo '</tr>';
       }
       echo '</table>';
   }

   function gerarPedido()
   {
   	require_once ('model/executar.php');
   	$model = new Executar($servidor, $usuario, $senha, $bd);
       foreach ($_SESSION['carrinho'] as $produto => $qtde)
       {
           $model->execute("INSERT INTO tb_pedidos (session,produto,qnt_solicitada)
                                                       VALUES ('" . session_id() . "','" . $produto . "','" . $qtde .
               "')");
       }
       session_destroy();
       $this->redireciona();
   }
}
?>

 

Olha só... Não precisa iniciar a conexão com o banco de dados toda vez que iniciar a classe... Nem precisa estender a classe... Apenas use-a quando precisar, ou seja, somente quando gerar pedido.

 

Outra coisa... Dá uma olhada na função __autoload...

http://br2.php.net/__autoload

 

 

Também sugiro que dê uma olhada na série de tutoriais do hinom sobre MVC.

http://forum.imasters.com.br/index.php?/topic/362243-mvc-em-php-tutorial-pratico/

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não testei o script ainda, mas entendi oque você quis dizer, achei interessante a sua dica de só conectar o BD caso gere o pedido, faz sentido e eu acho que vai diminuir o tempo de carregamento da pagina.

 

Obrigado pelas dicas.

vlw

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.