Olá leitores da Revista PHP, gostaria primeiramente de agradecer aos e-mails recebidos sobre meus artigos e gostaria de aproveitar para convidar aos leitores para enviar seus artigos e contribuir para a comunidade PHP.
Bom, vamos começar criando nossas tabelas que utilizaremos no decorrer do artigo.
Iniciamos a criação da tabela de produtos, eu optei por apenas alguns campos mais por questões de exemplo para esse artigo, mas você poderá incrementar com os campos que achar melhor, exemplos comum encontrados > peso, quantidade e outros.
O campo peso é muito usado para calcular preço de transporte e quando se quer colocar um preço com frete grátis, podemos colocar o peso como zero.
OBS: No campo preço eu optei por um tipo doble (10,2) precisão de 2 casas decimais, creio que não precisa ser modificado pois esse valor atente bem as necessidades atuais.
Criando a tabela tbl_produtos
SQL
CREATE TABLE `tbl_produtos` (
`cod` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nome` VARCHAR( 150 ) NOT NULL ,
`img` VARCHAR( 36 ) NOT NULL ,
`preco` DOUBLE( 10, 2 ) NOT NULL
) ENGINE = MYISAM ;
OBS: Caso você optar por incluir mais campos, não se esqueça de modificar mais adiante as opções de insert e update.
Depois de criado nossa tabela, vamos popular com alguns produtos, no código abaixo mostro somente a inclusão de 2 produtos, porem faça inclusão de no mínimo 4 para melhor ficar um visual melhor ao listar nossos produtos.
Populando a tabela tbl_produtos
SQL
INSERT INTO `tbl_produtos` ( `cod` , `nome` , `img` , `preco` )
VALUES (
NULL , 'Notebook HP 2160br', '001.jpg', '5450'
), (
NULL , 'Computador HP', '002.jpg', '1400'
);
Nosso próximo passo é criarmos a tabela de carrinho de compras que será responsável em armazenar os produtos selecionados pelo visitante.
Repare ainda o campo chamado sessao, esse campo será o responsável por identificar cada pessoa no ato de carregar seu carrinho, e você pergunta.
Como isso é feito ?
Resposta: Cada visitante recebe uma sessão atual ao visitar o site, e para recuperar essa sessão atual utilizamos
session_id(), esperimente pegar um arquivo e colocar um
echo session_id() que deverá aparecer uma seqüência de caracter que é no caso nossa sessão atual.
session_id(): Retorna o id de sessão para a sessão atual ou uma string vazia ("") se não houver sessão atual (não existe um id de sessão atual).
Criando a tabela tbl_carrinho
PHP
CREATE TABLE `tbl_carrinho` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`cod` INT( 11 ) NOT NULL ,
`nome` VARCHAR( 150 ) NOT NULL ,
`preco` DOUBLE( 10, 2 ) NOT NULL ,
`qtd` INT( 11 ) NOT NULL ,
`sessao` TEXT NOT NULL
) ENGINE = MYISAM ;
Agora chegou a hora de criarmos nossos arquivos .php e vamos começar com nosso arquivo de conexão com banco de dados.
No início apenas definimos os valores usados para conectarmos a nossa base de dados MySQL.
mysql_connect: Abre ou reutiliza uma conexão com um servidor MySQL.
O servidor MySQL. Também pode incluir um número de porta, exemplo "servidor:porta" ou um caminho para um socket local,
exemplo ":/caminho/para/socket" para o servidor local(localhost).
Se a diretiva do PHP
mysql.default_host não estiver definida(padrão), então o valor padrão é 'localhost:3306'
No meu caso como já está definido por padrão, não precisei definir a porta.
Criando o arquivo conn.php
PHP
<?php
$hostname_conn = "localhost";
$database_conn = "artigos";
$username_conn = "username";
$password_conn = "senha";
// Conectamos ao nosso servidor MySQL
if(!
($conn =
mysql_connect($hostname_conn,
$username_conn,
$password_conn))) {
echo "Erro ao conectar ao MySQL.";
}
// Selecionamos nossa base de dados MySQL
{
echo "Erro ao selecionar ao MySQL.";
}
?>
Agora chegou a parte legal que é a listagem dos produtos na qual vamos selecionar para incluirmos no carrinho de compras.
Logo no início eu estou definindo o charset que nosso tipo de codificação
charset=iso-8859-1
Na linha fazemos nosso include que será usado para conectarmos a nossa base de dados.
include "Connections/conn.php";
Nas linhas abaixo fazemos nosso select a qual defini selecionar somente 4 registros e chamo a função GeraColunas passando por parâmetro o número de 2 colunas e nosso sql.
$sql = "SELECT * FROM tbl_produtos ORDER BY RAND() LIMIT 0,4";
GeraColunas(2, $sql)
Após as linhas acima fazemos nosso for para listar nossos registros e armazenamos nas variáveis onde na variável $preco eu faço a formatação usando number_format().
number_format() retorna uma versão formatada de
number. Esta função aceita um, dois ou quatro parâmetros (não três):
Agora montamos nosso HTML dinâmico para listar os produtos já com as variáveis já nos devidos lugares. E para um melhor entendimento algumas linhas estão comentadas.
Criando o arquivo produtos.php
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>Carrinho de Compras</title>
</head>
<body>
<div align="center">
<?php
include "Connections/conn.php";
//*********************************************************************
// CONFIGURAÇÃO DE BANCO DE DADOS
//*********************************************************************
$con =
mysql_connect($hostname_conn,
$username_conn,
$password_conn);
?>
<table cellSpacing=1 cellPadding=0 width="50%" align=center border=0>
<tr>
<td>
<?
//*********************************************************************
// GERA A INSTRUÇÃO SQL E CHAMA A FUNÇÃO PARA GERAR AS COLUNAS
//*********************************************************************
$sql = "SELECT * FROM tbl_produtos ORDER BY RAND() LIMIT 0,4";
GeraColunas(2, $sql)
?>
</td>
</tr>
</table>
<?
//*********************************************************************
// FUNÇÃO: GERACOLUNAS
// Parametros:
// $pNumColunas (int) > Quant. de colunas para distribuição
// $pQuery (string) > Query de registros
//*********************************************************************
function GeraColunas($pNumColunas, $pQuery) {
echo ("<table width='100%' border='0'>\n");
for ($intCont = 0; $intCont < $pNumColunas; $intCont++) {
if ($i > $linha) {
if ( $intCont <
$pNumColunas-1) echo "</tr>\n";
break;
}
$cod = $linha[0];
$nome = $linha[1];
$img = $linha[2];
if ( $intCont ==
0 ) echo "<tr>\n";
// Aqui você inclui o conteudo
echo "<table width='266' border='0' cellspacing='0' cellpadding='0'>";
echo "<td width='250' height='141' valign='middle'><div align='center'><img src='produtos/".
$img.
"' border='0' width='189' height='141' /></div></td>";
echo "<table width='92%' border='0' align='center' cellpadding='0' cellspacing='0'>";
echo "<td><div align='center' style='font-size:10px;font-family:Verdana'><strong><a href='carrinho.php?cod=".
$cod.
"&acao=incluir'>".
$nome.
"</a></strong></div><strong><div align='center'><font color='#FF0000' size='4px'> R$ ".
$preco.
" </font></strong></div></td>";
echo "<td><div align='center' style='font-size:10px;font-family:Verdana'><a href='carrinho.php?cod=".
$cod.
"&acao=incluir'><img src='imgs/add_carrinho.jpg' border='0'/></a></div><br></td>";
// Aqui é o final do conteudo
if ( $intCont == $pNumColunas-1 ) {
} else { $i++; }
}
}
}
?>
</div>
</body>
</html>
Após algumas linhas de código, o resultado do arquivo
produtos.php é a imagem abaixo, isso é porque eu defini apenas 2 colunas a serem listadas e de forma aleatória que foi definido no nosso SQL usando RAND().
Esse arquivo principal do nosso sistema e que é nosso objetivo principal, e como no decorrer do artigo vamos usar muita session_id(), vamos relembrar mais uma vez.
session_id(): Retorna o id de sessão para a sessão atual ou uma string vazia ("") se não houver sessão atual (não existe um id de sessão atual).
Logo no inicio iniciamos nossa sessão que será de fundamental importância no carrinho, sem isso nosso carrinho não irá funcionar.
Repare que nas linhas abaixo, recuperamos os parâmetros código do produto e a ação usada.
$acao = $_GET['acao'];
$cod = $_GET['cod'];
A variável
$acao indicará ao nosso código o que fazer, que poderá ser
incluir, excluir ou modificar os dados do carrinho.
Ação incluir
Logo no começo verificamos se a $acao é igual a incluir se for incluir temos que verificar se veio algum produto para incluirmos no nosso carrinho, caso tenha algum produto, verificamos se o conteúdo da variável é numérica.
OBS: Temos que lembrar que mesmo atendendo os dois quesitos ainda temos que verificar se esse produto já não está no carrinho e assim evitarmos incluir produtos repetidos no carrinho, porem repare que usamos a condição abaixo.
AND tbl_carrinho.sessao = '".session_id()."'
Essa condição é para garantir que não terá um produto repetido no carrinho para uma determinada pessoa que é nosso session_id().
Podemos observar ainda que mesmo atendendo os 3 quisitos, ainda verifico se o produto que a pessoa deseja incluir existe em nossa base de dados, isso evita a pessoa mudar manualmente um código do produto na URL e se atender esse último quesito, aí sim fazemos nosso insert na base de dados.
Ação excluir
Nos 3 primeiros
IF eu verifico se a ação é
excluir, se for passo para verificar se existe algum conteúdo na variável $cod que é a variável do nosso produto e verificamos se é do tipo numérico.
Após fazermos as 2 verificações acima, devemos ver se o produto a ser excluido existe mesmo no nosso carrinho para a session_id() atual.
Se a variável
$totalRows_rs_car for maior do que zero, é porque existe o produto a ser excluido, então excluimos o produto com o código e session_id() definido.
Ação modificar
Antes de entrar em mais detalhes devemos reparar no código HTML a linha abaixo, pois se reparar definimos um nome igual a
qtd que é um array com os valores das quantidades dos produtos que iremos modificar e como esse campo é comum a todos os produtos então usamos um array com os campos chave dos produtos.
<input type"text" size="2" name="qtd[<?=$row_rs_produto_carrinho['cod']?>]" value="<?=$row_rs_produto_carrinho['qtd']?>" />
Armazenamos o conteúdo na variável
$quant e verificamos se é um array e iniciamos a linha abaixo para percorrer nosso array para modificarmos as quantidades dos produtos caso os valores forem numéricos.
foreach($quant as $cod => $qtd)
Após a ação modificar simplesmente listamos os produtos do carrinho de compras referente a session_id() atual e dentro do while temos a linha abaixo que pega o preço do produto e multiplica pela quantidade desejada
$soma_carrinho += ($row_rs_produto_carrinho['preco']*$row_rs_produto_carrinho['qtd']);
Criando o arquivo carrinho.php
PHP
<?php
// Iniciamos nossa sessão que vai indicar o usuário pela session_id
include "Connections/conn.php";
// Recuperamos os valores passados por parametros
$acao = $_GET['acao'];
$cod = $_GET['cod'];
// Verificamos se a acao é igual a incluir
if ($acao == "incluir")
{
// Verificamos se cod do produto é diferente de vazio
if ($cod != '')
{
// Se for diferente de vazio verificamos se é numérico
{
// Tratamos a variavel de caracteres indevidos
// Verificamos se o produto referente ao $cod já está no carrinho para o session id correnpondente
$query_rs_carrinho =
"SELECT * FROM tbl_carrinho WHERE tbl_carrinho.cod = '".
$cod.
"' AND tbl_carrinho.sessao = '".
session_id().
"'";
// Se o total for igual a zero é sinal que o produto ainda não está no carrinho
if ($totalRows_rs_carrinho == 0)
{
// Aqui pegamos os dados do produto a ser incluido no carrinho
$query_rs_produto = "select * from tbl_produtos where cod = '".$cod."'";
// Se total for maior que zero esse produto existe e então podemos incluir no carrinho
if ($totalRows_rs_produto > 0)
{
// Incluimos o produto selecionado no carrinho de compras
$add_sql = "INSERT INTO tbl_carrinho (id, cod, nome, preco, qtd, sessao)
VALUES
('','".
$row_rs_produto['cod'].
"','".
$row_rs_produto['nome'].
"','".
$row_rs_produto['preco'].
"','1','".
session_id().
"')";
}
}
}
}
}
// Verificamos se a acao é igual a excluir
if ($acao == "excluir")
{
// Verificamos se cod do produto é diferente de vazio
if ($cod != '')
{
// Se for diferente de vazio verificamos se é numérico
{
// Tratamos a variavel de caracteres indevidos
// Verificamos se o produto referente ao $cod está no carrinho para o session id correnpondente
$query_rs_car =
"SELECT * FROM tbl_carrinho WHERE cod = '".
$cod.
"' AND sessao = '".
session_id().
"'";
// Se encontrarmos o registro, excluimos do carrinho
if ($totalRows_rs_car > 0)
{
$sql_carrinho_excluir =
"DELETE FROM tbl_carrinho WHERE cod = '".
$cod.
"' AND sessao = '".
session_id().
"'";
}
}
}
}
// Verificamos se a ação é de modificar a quantidade do produto
if ($acao == "modifica")
{
$quant = $_POST['qtd'];
// Se for diferente de vazio verificamos se é numérico
{
// Aqui percorremos o nosso array
foreach($quant as $cod => $qtd)
{
// Verificamos se os valores são do tipo numeric
{
// Fazemos nosso update nas quantidades dos produtos
$sql_modifica =
"UPDATE tbl_carrinho SET qtd = '$qtd' WHERE cod = '$cod' AND sessao = '".
session_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>Carrinho de Compras</title>
<style type="text/css">
<!--
.style3 {font-size: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; }
.style4 {
color: #FF0000;
font-weight: bold;
}
-->
</style>
</head>
<body>
<div align="center"><img src="imgs/carrinho.jpg" width="589" height="102" />
</div>
<form action="carrinho.php?acao=modifica" method="post">
<table width="100%" border="1" cellspacing="0" cellpadding="0">
<tr>
<th width="36%" scope="col"><div align="left">PRODUTO</div></th>
<th width="22%" scope="col">PREÇO</th>
<th width="13%" scope="col">QUANTIDADE</th>
<th width="14%" scope="col">SUBTOTAL</th>
<th width="15%" scope="col"> </th>
</tr>
<?
$sql_meu_carrinho =
"SELECT * FROM tbl_carrinho WHERE sessao = '".
session_id().
"' ORDER BY nome ASC";
if ($qtd_meu_carrinho > 0)
{
$soma_carrinho = 0;
{
$soma_carrinho += ($row_rs_produto_carrinho['preco']*$row_rs_produto_carrinho['qtd']);
?>
<tr>
<td><span class="style3">
<?=$row_rs_produto_carrinho['nome']?>
</span></td>
<td><div align=
"center" class=
"style3"><?=
number_format($row_rs_produto_carrinho['preco'],
2,
",",
"."); ?></div></td>
<td><div align="center" class="style3"><input type"text" size="2" name="qtd[<?=$row_rs_produto_carrinho['cod']?>]" value="<?=$row_rs_produto_carrinho['qtd']?>" /></div></td>
<td><div align=
"center" class=
"style3"><?=
number_format($row_rs_produto_carrinho['preco']*
$row_rs_produto_carrinho['qtd'],
2,
",",
"."); ?></div></td>
<td><div align="center"><a href="carrinho.php?cod=<?=$row_rs_produto_carrinho['cod']?>&acao=excluir"><img src="imgs/del_carrinho.jpg" width="110" height="21" border="0" /></a></div></td>
</tr>
<?
}
}
?>
<tr>
<td colspan="3"><div align="right"><strong>TOTAL:</strong> </div> <div align="right"></div> <div align="right"></div></td>
<td><div align="center" class="style3 style4">
<td> </td>
</tr>
<tr>
<td colspan="5"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<th width="33%" height="60" scope="col"><span class="style3"><a href="produtos.php"><img src="imgs/comprando.jpg" width="287" height="40" border="0" /></a></span></th>
<th width="33%" scope="col"> </th>
<th width="34%" scope="col"><label>
<input type="image" name="imageField" src="imgs/atualizar.jpg" />
</label></th>
</tr>
</table></td>
</tr>
</table>
</form>
</body>
</html>
Resultado do Carrinho após incluir 2 produtos e modificar a quantidade de um deles
Bom pessoal, espero que tenham gostado, aguardo comentários.
Abs
Carlos Silva Jr