Telles85 Posted September 6, 2022 at 10:19 AM Report Share #627137 Posted September 6, 2022 at 10:19 AM 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 More sharing options...
iznougudpt Posted September 6, 2022 at 01:16 PM Report Share #627139 Posted September 6, 2022 at 01:16 PM O que vem no $resultado_stock? Link to comment Share on other sites More sharing options...
Telles85 Posted September 6, 2022 at 01:18 PM Author Report Share #627140 Posted September 6, 2022 at 01:18 PM 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. Link to comment Share on other sites More sharing options...
iznougudpt Posted September 6, 2022 at 01:32 PM Report Share #627141 Posted September 6, 2022 at 01:32 PM 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 More sharing options...
Telles85 Posted September 6, 2022 at 01:54 PM Author Report Share #627142 Posted September 6, 2022 at 01:54 PM Eu tentei simplesmente fazer com um loop for ou while, mas não consegui, o problema está na query? Link to comment Share on other sites More sharing options...
iznougudpt Posted September 6, 2022 at 03:21 PM Report Share #627150 Posted September 6, 2022 at 03:21 PM 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 More sharing options...
Telles85 Posted September 6, 2022 at 03:44 PM Author Report Share #627151 Posted September 6, 2022 at 03:44 PM 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 More sharing options...
iznougudpt Posted September 6, 2022 at 04:06 PM Report Share #627152 Posted September 6, 2022 at 04:06 PM 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 More sharing options...
Telles85 Posted September 6, 2022 at 04:15 PM Author Report Share #627153 Posted September 6, 2022 at 04:15 PM 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 More sharing options...
iznougudpt Posted September 7, 2022 at 04:49 PM Report Share #627177 Posted September 7, 2022 at 04:49 PM 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 Link to comment Share on other sites More sharing options...
Telles85 Posted September 8, 2022 at 09:44 AM Author Report Share #627193 Posted September 8, 2022 at 09:44 AM 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 More sharing options...
iznougudpt Posted September 8, 2022 at 10:51 AM Report Share #627196 Posted September 8, 2022 at 10:51 AM <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 More sharing options...
Telles85 Posted September 8, 2022 at 11:36 AM Author Report Share #627197 Posted September 8, 2022 at 11:36 AM 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 More sharing options...
iznougudpt Posted September 9, 2022 at 02:52 PM Report Share #627213 Posted September 9, 2022 at 02:52 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now