Jump to content

Update múltiplo em Base de Dados


Telles85

Recommended Posts

Bom dia, tenho uma tarefa que penso que consigo ter a lógica de como resolver, mas não estou a aplicar com certeza da melhor forma.

Numa pequena loja online, tenho que inserir no base de dados o novo resultado da quantidade de stock (UPDATE), que já está reduzida com os valores comprados do carrinho de compras.

Criei no código um input que ficará como type="hidden" com o valor atualizado com stock, e apenas consigo fazer UPDATE a um valor, se for mais que um produto, não consigo atualizar mais que um campo.

Agradecia imenso ajuda.

$produto_id = $_POST['produto_id'];
$resultado_stock = $_POST['resultado-stock'];

$arr = array($resultado_stock);

foreach($arr as $value) {
  $value = mysqli_query($con, "UPDATE products SET quantidade='$resultado_stock' WHERE id='$produto_id'");
};

 

Link to comment
Share on other sites

12 minutos atrás, Telles85 disse:

No $resultado_stock, vem o value dum input do form com o resultado da operação: stock da base de dados - quantidade de produto comprado.

Mas estás a tentar converter isso para um array. Se o formato do texto que vier não for compatível com array deve dar erro. Esse código vai actualizar várias vezes o stock do mesmo produto (já que o $produto_id é sempre o mesmo)?

Link to comment
Share on other sites

O que é que o site efectivamente faz? Sempre que alguém adiciona algo ao carrinho diminui o stock na BD?

Não percebo a necessidade de um loop se o mesmo não incluir o produto. O loop seria no caso de teres vários produtos e respectivo stock, aí iteravas todos os produtos e fazias um update para cada produto.

Se for apenas 1 produto de cada vez não necessitas do loop, se forem mais produtos o ideal seria enviares a informação em json em que cada linha refere o produto e a quantidade, assim podes ter o loop que actualiza linha a linha.

Link to comment
Share on other sites

2 minutos atrás, iznougudpt disse:

O que é que o site efectivamente faz? Sempre que alguém adiciona algo ao carrinho diminui o stock na BD?

Não percebo a necessidade de um loop se o mesmo não incluir o produto. O loop seria no caso de teres vários produtos e respectivo stock, aí iteravas todos os produtos e fazias um update para cada produto.

Se for apenas 1 produto de cada vez não necessitas do loop, se forem mais produtos o ideal seria enviares a informação em json em que cada linha refere o produto e a quantidade, assim podes ter o loop que actualiza linha a linha.

sim, o site, na minha página checkout ele mostra várias linhas, em que cada uma corresponde a um produto com uma determinada quantidade que o cliente quer comprar. Depois quando tento inserir os dados para que me atualize o stock, ele só me faz update a um produto (uma linha). Daí em imaginar que terei que colocar num loop para que percorra as linhas e me insira todas na base de dados. 

O código abaixo mostra os inputs type="hidden" que usei para me criar o campo que reduz o stock de cada produto, depois este resultado no último input usaria para fazer o update na BD.

<input type="hidden" name="produto_id" value="<?= $fetch_carrinho['produto_id']; ?>">
<input type="hidden" name="quantidadeProduto" value="<?= $fetch_carrinho['quantidadeProduto']; ?>" class="quantidade-produto">
<input type="hidden" name="quantidade_stock" value="<?= $quantidade_stock['quantidade']; ?>" class="quantidade-total">
<input type="hidden" name="resultado-stock" class="resultado-stock" value="<?= ($quantidade_stock['quantidade'] - $fetch_carrinho['quantidadeProduto']); ?>">

 

Link to comment
Share on other sites

Do modo que fizeste não consegues distinguir e associar os vários produto_id aos respectivos resultado-stock. Ao fazeres submit vais ter vários campos com o mesmo nome e atrofia tudo.

O que faço nesses casos é usar o Javascript para construir um JSON com várias linhas, depois no PHP tenho um loop que percorre o json e faz um update de cada vez.

Sem javascript cada nome dos campos teria de ter o nº da linha para distinguir, por exemplo produto_id_1, resultado-stock_1, produto_id_2, resultado-stock_2, etc.

Assim no php, sabendo quantas linhas tens, podes fazer um loop e assim tens sempre os valores correctos para cada linha.

Link to comment
Share on other sites

entendi, na formação que estou a tirar damos bases de várias línguas, etc. JSON ainda tenho algumas dúvidas, preciso ainda de aprender mais. Com JSON não conseguiria de certeza 😞

Mas entendi a questão do id, tem toda a lógica. eu já tentei com um loop for em que contei o número de vezes do $_POST hidden do resultado, para ver se resultava, mesmo não tendo ids independentes, mas não consegui realmente.

Estou um pouco confuso, a dificuldade que tive foi mais esta só, porque de resto é uma loja online de teste, pequena, mas com queries de consulta, SELECT, UPDATE, DELETE, tudo que for linhas única não tive problemas, só aqui estou a ter dificuldades.

Link to comment
Share on other sites

16 horas atrás, iznougudpt disse:

O ideal era teres um input hidden com o nº de linhas, assim podias procurar o produto_id_1, 2, ... até ao nº de linhas

eu compilei este código abaixo muito simples e básico, que na situação é um insert mas penso que o raciocício será similar com o update, embora não tenhado usuarios_id, produtos_id, etc.

Basicamente teria que inserir de uma só vez esses registo dos inputs na tabela, mas quando eu faço "enviar", ele só envia um registo para a base de dados, em vez dos dois em simultâneo.

Penso que a situação seria similar.

<?php

    $con = mysqli_connect('localhost', 'root', '', 'teste_inserir') or die('Erro de conexão');

    if(isset($_POST['enviar'])) {
        $nome = $_POST['nome'];
        $apelido = $_POST['apelido'];
        $idade = $_POST['idade'];
        
        $query_dados = mysqli_query($con, "INSERT INTO dados (nome, apelido, idade) VALUES ('$nome', '$apelido', '$idade')");
    };

?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="caixa-formulario">
        <form action="" method="POST">
            <div class="dados">
                <label for="nome">Nome:</label><br>
                <input type="text" name="nome"><br>
                <label for="apelido">Apelido:</label><br>
                <input type="text" name="apelido"><br>
                <label for="idade">Idade:</label><br>
                <input type="number" name="idade">
                <hr>
            </div>
            <div class="dados">
                <label for="nome">Nome:</label><br>
                <input type="text" name="nome"><br>
                <label for="apelido">Apelido:</label><br>
                <input type="text" name="apelido"><br>
                <label for="idade">Idade:</label><br>
                <input type="number" name="idade">
                <hr>
            </div>
            <button type="submit" name="enviar">Enviar</button>
        </form>
    </div>
</body>
</html>

 

Link to comment
Share on other sites

 <div class="dados">
                <label for="nome_1">Nome:</label><br>
                <input type="text" name="nome_1"><br>
                <label for="apelido_1">Apelido:</label><br>
                <input type="text" name="apelido_1"><br>
                <label for="idade_1">Idade:</label><br>
                <input type="number" name="idade_1">
                <hr>
            </div>
            <div class="dados">
                <label for="nome_2">Nome:</label><br>
                <input type="text" name="nome_2"><br>
                <label for="apelido_2">Apelido:</label><br>
                <input type="text" name="apelido_2"><br>
                <label for="idade_2">Idade:</label><br>
                <input type="number" name="idade_2">
                <hr>
            </div>
            

Penso que seja por terem o mesmo nome, experimenta assim.

Link to comment
Share on other sites

42 minutos atrás, iznougudpt disse:
 <div class="dados">
                <label for="nome_1">Nome:</label><br>
                <input type="text" name="nome_1"><br>
                <label for="apelido_1">Apelido:</label><br>
                <input type="text" name="apelido_1"><br>
                <label for="idade_1">Idade:</label><br>
                <input type="number" name="idade_1">
                <hr>
            </div>
            <div class="dados">
                <label for="nome_2">Nome:</label><br>
                <input type="text" name="nome_2"><br>
                <label for="apelido_2">Apelido:</label><br>
                <input type="text" name="apelido_2"><br>
                <label for="idade_2">Idade:</label><br>
                <input type="number" name="idade_2">
                <hr>
            </div>
            

Penso que seja por terem o mesmo nome, experimenta assim.

desta forma resulta, mas estamos a criar os campos e a declarar variáveis "manualmente".

No raciocínio do carrinho de compras quando fazemos select e importamos para a página vários registos no carrinho terá que se criar um contador, realmente a tua dica foi importante porque talvez esteja perto de resolver.

Por exemplo, com um loop for, criar um contador [$i], que irá percorrer os registo do carrinho e ele vai incremento a query do insert neste caso simples, ou no update da quantidade de stock no meu projeto.

se eu colocar nos nomes do inputs [$i] resulta, terei que converter para array? é que aí ainda estou muito verdinho, tenho dificuldades, mas vontade de aprender 😄

Link to comment
Share on other sites

Em 08/09/2022 às 13:36, Telles85 disse:

criar os campos e a declarar variáveis "manualmente".

Deverias ter uma função em Javascript que insira o node da linha sempre que necessário.

Essa função trata de gerir o nº de linhas que tem (e atualizar o input com o nº de linhas) e de gerar um novo bloco com o id correto.

Sempre que seja necessário adicionar uma nova linha no carrinho chamas essa função apenas. Se for caso disso podes ter uma outra função para ao eliminar uma linha, renomear todos os componentes que tens e atualizar o nº de linhas.

 

Como já disse antes, eu não faria assim, teria uma função que percorresse todas as linhas, construisse o JSON com toda a informação e enviasse essa informação para o PHP.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.