3
Well, I’m developing an online ordering system, initially just for learning purposes, only that I came across something that I have absolutely no idea how to do and would really appreciate any kind of help.
On the page php products. I establish two connections with DB and look for the products in the table products by category and the increases in the table we believe:
$sql = "SELECT p.id_produto, p.nome_produto, p.preco_produto, p.id_categoria, c.nome_categoria FROM produtos p, categorias c WHERE c.id_categoria = p.id_categoria ORDER BY p.id_categoria, p.nome_produto";
$stmt = $conexao->prepare($sql);
$stmt->execute();
$sql2 = "SELECT id_acrescimo, nome_acrescimo, preco_acrescimo FROM acrescimos ORDER BY nome_acrescimo";
$stmt2 = $conexao->prepare($sql2);
$stmt2->execute();
$num = $stmt->rowCount();
$categoria = null;
if($num>0)
{
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
extract($row);
if($categoria != $id_categoria)
{
if(!is_null($categoria)) { echo "</table>"; }
echo "<h1>{$nome_categoria}</h1>
<table>
<tr>
<th>NOME</th>
<th>PREÇO</th>
<th>QUANTIDADE</th>";
if($id_categoria == 1) echo" <th>ACRÉSCIMOS</th>";
echo "</tr>";
$categoria = $id_categoria;
}
$preco_produto_reajustado = number_format($preco_produto, 2, ",", ".");
echo "
<tr>
<td>
<div class='id-produto' style='display: none'>{$id_produto}</div>
<div class='nome-produto'>{$nome_produto}</div></td>
<td>R${$preco_produto_reajustado}
</td>
<td>
<input type='number' name='quantidade' value='1' min='1' max='20'/>
</td>";
if($id_categoria == 1)
{
echo "<td>";
while ($row = $stmt2->fetch(PDO::FETCH_ASSOC))
{
extract($row);
$preco_acrescimo_reajustado = number_format($preco_acrescimo, 2, ",", ".");
echo "
<input type='checkbox' name='{$nome_acrescimo}' value='{$nome_acrescimo}'/>{$nome_acrescimo} - R${$preco_acrescimo_reajustado} <input type='number' name='quantidade_acr[]' value='1' min='1' max='5'/><br/>
";
}
echo "</td>";
}
echo "<td>
<form class='adicionar'>
<button type='submit'>Adicionar</button>
</form>
</td>
</tr>";
}
echo "</table>";
}
As you can see with this code, if the ID of the corresponding category is 1, another column will be created in the table. The column Additions. And that’s where my biggest problem lies. If you’ve analyzed the code well, you can see that my output will be something like:
They noted the checkboxes present in the column Additions? So what I’m trying to do (unsuccessfully) is, in the act of click on the button Add, obtain the values of checkboxes selected according to their names and prices in the table we believe. But how to do that?
I need to get these values and store them in variables to later insert them into the SESSION and display them along with others in the user’s cart. In the php products. I have a function of jQuery which stores the data of the selected row in variables to be later inserted into its certain variables in the SESSION:
$(document).ready(function()
{
$('.adicionar').on('submit', function()
{
var id_produto = $(this).closest('tr').find('.id-produto').text();
var nome_produto = $(this).closest('tr').find('.nome-produto').text();
var quantidade = $(this).closest('tr').find('input').val();
window.location.href = "adicionar.php?id_produto=" + id_produto + "&nome_produto=" + nome_produto + "&quantidade=" + quantidade;
return false;
});
});
In the archive add.php i search in DB the ID and name of the selected product to then get the price of it. If my return is true, the script continues adding data to the SESSION:
if (isset($_GET['id_produto']) && $_GET['id_produto'] != "")
{
if(isset($_SESSION['carrinho']))
{
$contar = count($_SESSION['carrinho']);
$id_produto_sessao = $contar++;
}
else
{
$id_produto_sessao = 0;
}
$id_produto = isset($_GET['id_produto']) ? $_GET['id_produto'] : "";
$nome_produto = isset($_GET['nome_produto']) ? $_GET['nome_produto'] : "";
$quantidade = isset($_GET['quantidade']) ? $_GET['quantidade'] : "";
$sql = "SELECT * FROM produtos WHERE id_produto LIKE '{$id_produto}' AND nome_produto LIKE '{$nome_produto}' LIMIT 1";
$stmt = $conexao->prepare($sql);
$stmt->execute();
$num = $stmt->rowCount();
if($num == 1)
{
if($quantidade <= 0 || $quantidade > 20)
{
header('Location: produtos.php?acao=quantidadeinvalida&nome_produto=' . $nome_produto);
}
else if(!isset($_SESSION['carrinho']))
{
$_SESSION['carrinho'] = array();
}
if(isset($_SESSION['carrinho']))
{
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
extract($row);
$colunas = array
(
'id_produto_sessao' => $id_produto_sessao,
'id_produto' => $id_produto,
'nome_produto' => $nome_produto,
'preco_produto' => $preco_produto,
'quantidade' => $quantidade
);
}
$_SESSION['carrinho'][$id_produto_sessao] = $colunas;
header('Location: produtos.php?acao=adicionado&nome_produto=' . $nome_produto);
}
}
else
{
redirecionar_para("produtos.php");
}
}
Note that the reported amount is obtained with the jQuery and passed to the SESSION. I think I’ll have to do something similar to get the data on checkboxes selected, but I have no idea how to do it. I would also put the code in the file cart php. and whose purpose is to display the data present in SESSION cart, but this will leave the question too extensive. I think I should first be able to store the data of these checkboxes. The task of displaying them afterwards should not be so difficult. But back to the problem in question, how to get the values of each of the checkboxes selected previously and also insert them in this SESSION? How to implement this in my system?
Do you want something like that? https://jsfiddle.net/724xyyq4/ (Of course, it’s not exactly how you need it... but the idea of taking the
checkbox
is the same... just edit for your need)– Rafael Withoeft
@Rafaelwithoeft Thanks for the comment! Yes, it’s more or less that. But I need to specify the prices of each of the additions and multiply them by the quantity informed. In the cart you can enter something like "Product: Pizza, Increments: 2xQueijo, 1xAlho, total: R$(value of the sum of the prices of the increments multiplied by the quantity of each one)"
– M. Victor