Jump to content
AllysonSouza

funcao Foreach

Recommended Posts

Bom, estou com um problema no meu código aqui, não liguem pelo código esta feio, esta documentando, e está funcionando, bom o meu problema é com a funcao FOREACH, não sei usar muito bem, to com um site aonde eu adiciono os produtos ao carrinho, e ali ponho a quantidade que quero, até ai funciona, mas alem de quantidade eu queria botar outro campo metros, pois é de madeiras, ali o cliente botaria o tamanho da madeira, ex: 3.5, ai ele atualizaria o valor da unidade e do total, enfim ja tentei de todos os jeitos e nenhum deu certo, até pq não sei fazer o devido uso do FOREACH, codigo a baixo..

<?php
session_start();
if(!isset($_SESSION['carrinho'])){
    $_SESSION['carrinho'] = array();
} //adiciona produto

if(isset($_GET['acao'])){
    //ADICIONAR CARRINHO
    if($_GET['acao'] == 'add'){
        $id = intval($_GET['id']);
        if(!isset($_SESSION['carrinho'][$id])){
            $_SESSION['carrinho'][$id] = 1;
        } else {
            $_SESSION['carrinho'][$id] += 1;
        }
    } //REMOVER CARRINHO
    
    if($_GET['acao'] == 'del'){
        $id = intval($_GET['id']);
        if(isset($_SESSION['carrinho'][$id])){
            unset($_SESSION['carrinho'][$id]);
        }
    } //ALTERAR QUANTIDADE  AQUI O PROBLEMA, aonde eu tento botar os METROS
    if($_GET['acao'] == 'up'){
        if(is_array($_POST['prod'])){
            foreach($_POST['prod'] as $id => $qtd){
                foreach($_POST['prod'] as $id => $mt){
                $id  = intval($id);
                $qtd = intval($qtd);
                $mt = intval($mt);
                if(!empty($qtd && $mt) || $qtd && $mt <> 0){
                    $_SESSION['carrinho'][$id] = $qtd;
                    $_SESSION['carrinho'][$id] = $mt;
                }else{
                    unset($_SESSION['carrinho'][$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>s</title>
    </head>
    <body>
    <table>
        <caption>Carrinho de Compras</caption>
        <thead>
            <tr>
                <th width="244">Produto</th>
                <th width="79">Quantidade</th>
               	<th width="79">Metros</th>
                <th width="89">Preco</th>
                <th width="100">SubTotal</th>
                <th width="64">Remover</th>
            </tr>
        </thead>
        <form action="?acao=up" method="post">
        <tfoot>
            <tr>
                <td colspan="5"><input type="submit" value="Atualizar Carrinho" /></td>
            <tr>
            <td colspan="5"><a href="teste.php">Continuar Comprando</a></td>
        </tfoot>
        <tbody>
     <?php
        if(count($_SESSION['carrinho']) == 0){
          echo '
                <tr>
                    <td colspan="5">Não há produto no carrinho</td>
                </tr>
            ';
          } else {
                require("conexao.php");
                $total = 0;
                foreach($_SESSION['carrinho'] as $id => $qtd){
                    foreach($_SESSION['carrinho'] as $id => $mt){
                    
                    $sql = "SELECT
                p.id AS idProd,
                p.nome AS produto,
                p.largura,
                p.comprimento,
                p.estilo,
                p.valor,
                p.valorCompra,
                p.estoque,
                p.imagem,
                c.id AS idCat,
                c.nome AS categoria,
                p.vendidos,
                p.tipo,
                p.detalhe
            FROM
                produtos p
            INNER JOIN
                categorias c ON p.categorias_id=c.id
            ORDER BY p.nome ASC";
                    $res = mysqli_query($con, $sql);
                    $linha = mysqli_fetch_array($res);
                        
                        
                        
                        $nome  = $linha['produto'];
                        $preco = number_format($linha['valor'], 2, ',', '.');
                        $sub   = number_format($linha['valor'] * $qtd, 2, ',', '.');
                        $total += $linha['valor'] * $qtd;
                         echo '
                            <tr>       
                                <td>'.$nome.'</td>
                                <td><input type="text" size="3" name="prod['.$id.']" value="'.$qtd.'" /></td>
                                <td><input type="text" size="3" name="prod['.$id.']" value="'.$mt.'" /></td>
                                <td>R$ '.$preco.'</td>
                                <td>R$ '.$sub.'</td>
                                <td><a href="?acao=del&id='.$id.'">Remove</a></td>
                            </tr>';
                }
                $total = number_format($total, 2, ',', '.');
                echo '<tr>                         
                            <td colspan="4">Total</td>
                            <td>R$ '.$total.'</td>
                    </tr>';
          }
          }
                   ?>
        
         </tbody>
    </form>
 </table>
 
</body>
</html>

.

Share this post


Link to post
Share on other sites

Olá!

 

Amigo, isso aqui não faz sentido:

<td><input type="text" size="3" name="prod['.$id.']" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="prod['.$id.']" value="'.$mt.'" /></td>

Quando você envia dois inputs com nomes iguais, o segundo sobrescreve o primeiro. O resultado disso é que apenas um dos valores é enviado.

O que você quer é algo assim:

<td><input type="text" size="3" name="qtd['.$id.']" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="mt['.$id.']" value="'.$mt.'" /></td>

<!-- Não faço ideia o que seja "mt". É um péssimo nome de variável, mas apenas o reutilizei. -->
<!-- Perceba que individualizamos as informações, enviando 2 arrays distintos. -->
<!-- Esses arrays estarão disponíveis em $_POST[ 'qtd' ] e $_POST[ 'mt' ] -->

Ou, caso você queira utilizar apenas um array:

<td><input type="text" size="3" name="prod['.$id.'][ 'qtd' ]" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="prod['.$id.'][ 'mt' ]" value="'.$mt.'" /></td>

<!-- Ou ainda: -->

<td><input type="text" size="3" name="prod[ 'qtd' ]['.$id.']" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="prod[ 'mt' ]['.$id.']" value="'.$mt.'" /></td>

<!-- Experimente ambas e veja como prefere. Você pode visualizar elas assim: -->

<?php
echo '<pre>';//formata para uma exibição melhor
print_r( $_POST[ 'prod' ] );//exibe o conteúdo de $_POST[ 'prod' ]

 

Isso aqui também não faz sentido:

foreach($_SESSION['carrinho'] as $id => $qtd){
    foreach($_SESSION['carrinho'] as $id => $mt){

E nem o outro foreach duplo, mais acima no código.

 

O foreach deve ser feito em cima de uma das opções acima, e portanto é diferente para cada um, mas vou lhe dar um exemplo:

<!-- Com estes inputs: -->
<td><input type="text" size="3" name="prod['.$id.'][ 'qtd' ]" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="prod['.$id.'][ 'mt' ]" value="'.$mt.'" /></td>

<?php
foreach( $_POST[ 'prod' ] as $id => $valores ) {
    echo 'ID: ' . $id . '<br>';
    echo 'Qtd: ' . $valores[ 'qtd' ] . '<br>';
    echo 'MT: ' . $valores[ 'mt' ] . '<br>';
}

 

Leia mais sobre arrays: https://secure.php.net/manual/pt_BR/language.types.array.php

E sobre o foreach: http://php.net/manual/pt_BR/control-structures.foreach.php

Share this post


Link to post
Share on other sites
Em 02/07/2018 at 03:50, Matheus Tavares disse:

Olá!

 

Amigo, isso aqui não faz sentido:


<td><input type="text" size="3" name="prod['.$id.']" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="prod['.$id.']" value="'.$mt.'" /></td>

Quando você envia dois inputs com nomes iguais, o segundo sobrescreve o primeiro. O resultado disso é que apenas um dos valores é enviado.

O que você quer é algo assim:


<td><input type="text" size="3" name="qtd['.$id.']" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="mt['.$id.']" value="'.$mt.'" /></td>

<!-- Não faço ideia o que seja "mt". É um péssimo nome de variável, mas apenas o reutilizei. -->
<!-- Perceba que individualizamos as informações, enviando 2 arrays distintos. -->
<!-- Esses arrays estarão disponíveis em $_POST[ 'qtd' ] e $_POST[ 'mt' ] -->

Ou, caso você queira utilizar apenas um array:


<td><input type="text" size="3" name="prod['.$id.'][ 'qtd' ]" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="prod['.$id.'][ 'mt' ]" value="'.$mt.'" /></td>

<!-- Ou ainda: -->

<td><input type="text" size="3" name="prod[ 'qtd' ]['.$id.']" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="prod[ 'mt' ]['.$id.']" value="'.$mt.'" /></td>

<!-- Experimente ambas e veja como prefere. Você pode visualizar elas assim: -->

<?php
echo '<pre>';//formata para uma exibição melhor
print_r( $_POST[ 'prod' ] );//exibe o conteúdo de $_POST[ 'prod' ]

 

Isso aqui também não faz sentido:


foreach($_SESSION['carrinho'] as $id => $qtd){
    foreach($_SESSION['carrinho'] as $id => $mt){

E nem o outro foreach duplo, mais acima no código.

 

O foreach deve ser feito em cima de uma das opções acima, e portanto é diferente para cada um, mas vou lhe dar um exemplo:


<!-- Com estes inputs: -->
<td><input type="text" size="3" name="prod['.$id.'][ 'qtd' ]" value="'.$qtd.'" /></td>
<td><input type="text" size="3" name="prod['.$id.'][ 'mt' ]" value="'.$mt.'" /></td>

<?php
foreach( $_POST[ 'prod' ] as $id => $valores ) {
    echo 'ID: ' . $id . '<br>';
    echo 'Qtd: ' . $valores[ 'qtd' ] . '<br>';
    echo 'MT: ' . $valores[ 'mt' ] . '<br>';
}

 

Leia mais sobre arrays: https://secure.php.net/manual/pt_BR/language.types.array.php

E sobre o foreach: http://php.net/manual/pt_BR/control-structures.foreach.php

 

Vlww, deu certo obrigado

Share this post


Link to post
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

  • Similar Content

    • By _FelipeOlvr
      Talvez seja simples, ou não. Não sei.
      Mas gostaria de um esclarecimento/luz de gente que já tem bagagem na área. Ficarei muito agradecido pela informação.
       
      Dei umas pesquisadas por ai, e fiz testes com as duas maneiras que achei ( até agora ):
       
      file_get_contents ( 'http://......' ) ;
      curl () ;
       
      Pergunta: 
       
      Existem outras maneiras de consumir API via PHP ? Quais ?
      Essas duas aí estão corretas?
    • By santans
      <?php if(isset($_post['name']) && !empty($_post['name'])){ $nome = addslashes($_post['name']); $email = addslashes($_post['email']); $mensagem = addslashes($_post['mesage']); $to = "gabriel@symmetrycorp.com.br"; $subjet = "Formulario - Contato SITE"; $body = "Nome: ".$nome. "\r\n". "E-mail: ".$email. "\r\n". "Mensagem: ".$mesage. "\n"; $header = "From: gabriel@symmetrycorp.com.br "."\r\n"."Replay-to:".$email."\r\n"."X=Mailer:php/".phpversion(); if(mail($to, $subject, $body, $header)){ echo("E-mail enviado com sucesso"); }else{ echo("O e-mail não pode ser enviado"); } } ?> Gostaria de ajudar para conferir esse código para envio de email, quero ter certeza que não há nenhum erro de escrita do código...
    • By Masant12
      Por favor, estou tendo dificuldades, alguém poderia me ajudar, gostaria de saber como posso fazer um sistema de reserva e se isso é possível, pois não encontrei nem um material sobre isso na internet.
    • By michael450
      Senhores, boa tarde.
       
      Estou com um probleminha... rss', preciso fazer a listagem de uma função da biblioteca "SPED-NFe"   na qual consulto quais as NFe que emitiram contra meu CNPJ, porém o ele executa toda a função e depois me trás o resultado, eu gostaria de trazer o resultado instantaneamente, como se fosse uma atualização segundo a segundo.
       
       
      Essas informações não são salvas em DB, é apenas para consulta.
      Se alguém puder ajudar serei muito grato,
       
      Abraço.
       
      Michael Douglas
    • By D2th3
      Pessoal,

      Sou intermediário em PHP e estou estudando OO. Vi exemplos de do MVC Pattern usando template view contudo de simples substituição do marcador pelos dados. Eu gostaria que você me pudessem indicar um material de estudo, exemplos de código de um Model, Controller e View que carregasse a template e exibisse, contudo dentro dessa template existisse condicionais e loops como marcadores a serem processados pelo PHP.
       
      Agradeço a ajuda aos meus estudos.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.