Está en la página 1de 11

Revista PHP - Carrinho de compras com PHP e MySQL

http://www.revistaphp.com.br/artigo.php?id=150

Carrinho de compras com PHP e MySQL


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 comear criando nossas tabelas que utilizaremos no decorrer do artigo. Iniciamos a criao da tabela de produtos, eu optei por apenas alguns campos mais por questes 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 preo de transporte e quando se quer colocar um preo com frete grtis, podemos colocar o peso como zero. OBS: No campo preo eu optei por um tipo doble (10,2) preciso de 2 casas decimais, creio que no precisa ser modificado pois esse valor atente bem as necessidades atuais. Criando a tabela tbl_produtos
SQL

1. 2. 3. 4. 5. 6.

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 ;

www.revistaphp.com.br

OBS: Caso voc optar por incluir mais campos, no se esquea de modificar mais adiante as opes de insert e update. Depois de criado nossa tabela, vamos popular com alguns produtos, no cdigo abaixo mostro somente a incluso de 2 produtos, porem faa incluso de no mnimo 4 para melhor ficar um visual melhor ao listar nossos produtos. Populando a tabela tbl_produtos
SQL

1. 2. 3. 4. 5. 6.

INSERT VALUES NULL , ), ( NULL , );

INTO `tbl_produtos` ( `cod` , `nome` , `img` , `preco` ) ( 'Notebook HP 2160br', '001.jpg', '5450' 'Computador HP', '002.jpg', '1400'

www.revistaphp.com.br

Nosso prximo passo criarmos a tabela de carrinho de compras que ser responsvel em armazenar os produtos selecionados pelo visitante. Repare ainda o campo chamado sessao, esse campo ser o responsvel por identificar cada pessoa no ato de carregar seu carrinho, e voc pergunta.

1 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL


carrinho, e voc pergunta. Como isso feito ? Resposta: Cada visitante recebe uma sesso atual ao visitar o site, e para recuperar essa sesso atual utilizamos session_id(), esperimente pegar um arquivo e colocar um echo session_id() que dever aparecer uma seqncia de caracter que no caso nossa sesso atual. session_id(): Retorna o id de sesso para a sesso atual ou uma string vazia ("") se no houver sesso atual (no existe um id de sesso atual). Criando a tabela tbl_carrinho
PHP

http://www.revistaphp.com.br/artigo.php?id=150

1. 2. 3. 4. 5. 6. 7. 8.

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 ;

www.revistaphp.com.br

Agora chegou a hora de criarmos nossos arquivos .php e vamos comear com nosso arquivo de conexo com banco de dados. No incio apenas definimos os valores usados para conectarmos a nossa base de dados MySQL. mysql_connect: Abre ou reutiliza uma conexo com um servidor MySQL. O servidor MySQL. Tambm pode incluir um nmero 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 no estiver definida(padro), ento o valor padro 'localhost:3306' No meu caso como j est definido por padro, no precisei definir a porta. Criando o arquivo conn.php
PHP

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

<?php $hostname_conn $database_conn $username_conn $password_conn

= = = =

"localhost"; "artigos"; "username"; "senha";

// Conectamos ao nosso servidor MySQL if(!($conn = mysql_connect($hostname_conn,$username_conn,$password_conn))) { echo "Erro ao conectar ao MySQL.";

2 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL


10. 11. 12. 13. 14. 15. 16. 17. 18. 19. echo "Erro ao conectar ao MySQL."; exit; } // Selecionamos nossa base de dados MySQL if(!($con = mysql_select_db($database_conn,$conn))) { echo "Erro ao selecionar ao MySQL."; exit; } ?>

http://www.revistaphp.com.br/artigo.php?id=150

www.revistaphp.com.br

Agora chegou a parte legal que a listagem dos produtos na qual vamos selecionar para incluirmos no carrinho de compras. Logo no incio eu estou definindo o charset que nosso tipo de codificao 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 funo GeraColunas passando por parmetro o nmero de 2 colunas e nosso sql. $sql = "SELECT * FROM tbl_produtos ORDER BY RAND() LIMIT 0,4"; GeraColunas(2, $sql) Aps as linhas acima fazemos nosso for para listar nossos registros e armazenamos nas variveis onde na varivel $preco eu fao a formatao usando number_format(). number_format() retorna uma verso formatada de number. Esta funo aceita um, dois ou quatro parmetros (no trs): Agora montamos nosso HTML dinmico para listar os produtos j com as variveis j nos devidos lugares. E para um melhor entendimento algumas linhas esto comentadas. Criando o arquivo produtos.php
PHP

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

<!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"; //*********************************************************************

3 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL


12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. //********************************************************************* // CONFIGURAO DE BANCO DE DADOS //********************************************************************* $con = mysql_connect($hostname_conn,$username_conn,$password_conn); $bd = mysql_select_db($database_conn); ?> <table cellSpacing=1 cellPadding=0 width="50%" align=center border=0> <tr> <td> <? //********************************************************************* // GERA A INSTRUO SQL E CHAMA A FUNO PARA GERAR AS COLUNAS //********************************************************************* $sql = "SELECT * FROM tbl_produtos ORDER BY RAND() LIMIT 0,4"; GeraColunas(2, $sql) ?> </td> </tr> </table> <? //********************************************************************* // FUNO: GERACOLUNAS // Parametros: // $pNumColunas (int) > Quant. de colunas para distribuio // $pQuery (string) > Query de registros //********************************************************************* function GeraColunas($pNumColunas, $pQuery) { $resultado = mysql_query($pQuery); echo ("<table width='100%' border='0'>\n"); for($i = 0; $i <= mysql_num_rows($resultado); ++$i) { for ($intCont = 0; $intCont < $pNumColunas; $intCont++) { $linha = mysql_fetch_array($resultado); if ($i > $linha) { if ( $intCont < $pNumColunas-1) echo "</tr>\n"; break; } $cod = $linha[0]; $nome = $linha[1]; $img = $linha[2]; $preco = number_format($linha[3],2,",",".");

http://www.revistaphp.com.br/artigo.php?id=150

if ( $intCont == 0 ) echo "<tr>\n"; echo "<td>"; // Aqui voc inclui o conteudo echo "<table width='266' border='0' cellspacing='0' cellpadding='0'>"; echo "<tr>"; echo "<td width='250' height='141' valign='middle'><div align='center'><img src='produtos/".$img."' border='0' width='18 echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<table width='92%' border='0' align='center' cellpadding='0' cellspacing='0'>"; echo "<tr>";

4 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL

http://www.revistaphp.com.br/artigo.php?id=150

65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91.

echo echo echo echo echo echo echo echo echo echo

"<tr>"; "<td><div align='center' style='font-size:10px;font-family:Verdana'><strong><a href='carrinho.php?cod=" "</tr>"; "<tr>"; "<td><div align='center' style='font-size:10px;font-family:Verdana'><a href='carrinho.php?cod=".$cod "</tr>"; "</table>"; "</td>"; "</tr>"; "</table>";

// Aqui o final do conteudo echo "</td>"; if ( $intCont == $pNumColunas-1 ) { echo "</tr>\n"; } else { $i++; } } } echo ('</table>'); } ?> </div> </body> </html>

www.revistaphp.com.br

Aps algumas linhas de cdigo, o resultado do arquivo produtos.php a imagem abaixo, isso porque eu defini apenas 2 colunas a serem listadas e de forma aleatria que foi definido no nosso SQL usando RAND().

5 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL

http://www.revistaphp.com.br/artigo.php?id=150

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 sesso para a sesso atual ou uma string vazia ("") se no houver sesso atual (no existe um id de sesso atual). Logo no inicio iniciamos nossa sesso que ser de fundamental importncia no carrinho, sem isso nosso carrinho no ir funcionar. Repare que nas linhas abaixo, recuperamos os parmetros cdigo do produto e a ao usada. $acao = $_GET['acao']; $cod = $_GET['cod']; A varivel $acao indicar ao nosso cdigo o que fazer, que poder ser incluir, excluir ou modificar os dados do carrinho. Ao incluir Logo no comeo 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 contedo da varivel numrica. OBS: Temos que lembrar que mesmo atendendo os dois quesitos ainda temos que verificar se esse produto j no est no carrinho e assim evitarmos incluir produtos repetidos no carrinho, porem repare que usamos a condio abaixo. AND tbl_carrinho.sessao = '".session_id()."' Essa condio para garantir que no 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 cdigo do produto na URL e se atender esse ltimo quesito, a sim fazemos nosso insert na base de dados. Ao excluir Nos 3 primeiros IF eu verifico se a ao excluir, se for passo para verificar se existe algum contedo na varivel $cod que a varivel do nosso produto e verificamos se do tipo numrico. Aps fazermos as 2 verificaes acima, devemos ver se o produto a ser excluido existe mesmo no nosso carrinho para a session_id() atual.

6 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL


session_id() atual. Se a varivel $totalRows_rs_car for maior do que zero, porque existe o produto a ser excluido, ento excluimos o produto com o cdigo e session_id() definido. Ao modificar Antes de entrar em mais detalhes devemos reparar no cdigo 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 ento 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']?>" />

http://www.revistaphp.com.br/artigo.php?id=150

Armazenamos o contedo na varivel $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 numricos. foreach($quant as $cod => $qtd) Aps a ao 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 preo 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

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.

<?php // Iniciamos nossa sesso que vai indicar o usurio pela session_id session_start(); 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 numrico if (is_numeric($cod)) { // Tratamos a variavel de caracteres indevidos $cod = addslashes(htmlentities($cod)); // Verificamos se o produto referente ao $cod j est no carrinho para o session id $query_rs_carrinho = "SELECT * FROM tbl_carrinho WHERE tbl_carrinho.cod = '".$cod $rs_carrinho = mysql_query($query_rs_carrinho, $conn) or die(mysql_error()); $row_rs_carrinho = mysql_fetch_assoc($rs_carrinho);

7 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL

http://www.revistaphp.com.br/artigo.php?id=150

25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77.

$row_rs_carrinho = mysql_fetch_assoc($rs_carrinho); $totalRows_rs_carrinho = mysql_num_rows($rs_carrinho); // Se o total for igual a zero sinal que o produto ainda no 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."'"; $rs_produto = mysql_query($query_rs_produto, $conn) or die(mysql_error()) $row_rs_produto = mysql_fetch_assoc($rs_produto); $totalRows_rs_produto = mysql_num_rows($rs_produto); // Se total for maior que zero esse produto existe e ento podemos incluir no carrin if ($totalRows_rs_produto > 0) { $registro_produto = mysql_fetch_assoc($rs_produto); // 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']."','" $rs_produto_add = mysql_query($add_sql, $conn) or die(mysql_error } } } } } // 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 numrico if (is_numeric($cod)) { // Tratamos a variavel de caracteres indevidos $cod = addslashes(htmlentities($cod)); // Verificamos se o produto referente ao $cod est no carrinho para o session id co $query_rs_car = "SELECT * FROM tbl_carrinho WHERE cod = '".$cod."' AND sessao = '" $rs_car = mysql_query($query_rs_car, $conn) or die(mysql_error()); $row_rs_carrinho = mysql_fetch_assoc($rs_car); $totalRows_rs_car = mysql_num_rows($rs_car); // Se encontrarmos o registro, excluimos do carrinho if ($totalRows_rs_car > 0) { $sql_carrinho_excluir = "DELETE FROM tbl_carrinho WHERE cod = '".$cod."' AND sessao = '" $exec_carrinho_excluir = mysql_query($sql_carrinho_excluir, $conn) or die } } } }

8 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL


77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. }

http://www.revistaphp.com.br/artigo.php?id=150

// Verificamos se a ao de modificar a quantidade do produto if ($acao == "modifica") { $quant = $_POST['qtd']; // Se for diferente de vazio verificamos se numrico if (is_array($quant)) { // Aqui percorremos o nosso array foreach($quant as $cod => $qtd) { // Verificamos se os valores so do tipo numeric if(is_numeric($cod) && is_numeric($qtd)) { // Fazemos nosso update nas quantidades dos produtos $sql_modifica = "UPDATE tbl_carrinho SET qtd = '$qtd' WHERE cod = '$cod' AND ses $rs_modifica = mysql_query($sql_modifica, $conn) or die(mysql_error } } } } ?> <!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&Ccedil;O</th> <th width="13%" scope="col">QUANTIDADE</th> <th width="14%" scope="col">SUBTOTAL</th> <th width="15%" scope="col">&nbsp;</th> </tr>

9 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL


129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176.

http://www.revistaphp.com.br/artigo.php?id=150

<? $sql_meu_carrinho = "SELECT * FROM tbl_carrinho WHERE sessao = '".session_id()."' ORDER BY nome ASC"; $exec_meu_carrinho = mysql_query($sql_meu_carrinho, $conn) or die(mysql_error()); $qtd_meu_carrinho = mysql_num_rows($exec_meu_carrinho); if ($qtd_meu_carrinho > 0) { $soma_carrinho = 0; while ($row_rs_produto_carrinho = mysql_fetch_assoc($exec_meu_carrinho)) { $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,",",".") <td><div align="center" class="style3"><input type"text" size="2" name="qtd[<?=$row_rs_produto_carrinho['cod']?>]" <td><div align="center" class="style3"><?= number_format($row_rs_produto_carrinho['preco']*$row_rs_produto_carrinho <td><div align="center"><a href="carrinho.php?cod=<?=$row_rs_produto_carrinho['cod']?>&acao=excluir"><img src= </tr> <? } } ?> <tr> <td colspan="3"><div align="right"><strong>TOTAL:</strong>&nbsp; </div> <div align="right"></div> <div <td><div align="center" class="style3 style4"> <?= number_format($soma_carrinho,2,",","."); ?></div></td> <td>&nbsp;</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 <th width="33%" scope="col">&nbsp;</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>

www.revistaphp.com.br

Resultado do Carrinho aps incluir 2 produtos e modificar a quantidade de um deles

10 de 11

8/8/2011 13:34

Revista PHP - Carrinho de compras com PHP e MySQL

http://www.revistaphp.com.br/artigo.php?id=150

Bom pessoal, espero que tenham gostado, aguardo comentrios.

11 de 11

8/8/2011 13:34

También podría gustarte