Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

alissong

Update com Foreach

Recommended Posts

Pessoal, 

 

Estou criando um formulário que atualizar os valores de custo e venda do produto conforme o critério de busca do usuário.

Veja o formulário de busca:

<?php
#Arquivo de funções *************************************
 require_once("verifica.php");
 include_once("conexao/bdinc.php");

#********************************************************

if ($_SERVER['REQUEST_METHOD'] == 'GET') {
	$ajuste_preco = $_GET['percentual'];
	$criterio = $_GET['criterio'];
    $busca = $_GET['busca'];
	
 }
 
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Relatorio de Fornecedores</title>
<script type="text/javascript">
function mudar(x,y){

x.style.backgroundColor=y;
}
//-->
</script>
</head>
<body>
<table  width="100%" cellspacing="1" cellpadding="0" bgcolor="#000000">
<tr>
<td  width="100%" bgcolor="#E1E1E1">
   <form name="con_ajuste_preco_produto" method="post" action="cad_ajuste_preco_venda.php">
   <table border="1" width="100%" cellpadding="0" class="tabela">
     <br> 
     <tr align="center" class="cabecalho">
        <td width = "5%"><label><b>Selecao</b></label></td>
		<td width = "8%"><label><b>Cod. Produto</b></label></td>
        <td width = "30%"><label><b>Nome Produto</b></label></td>
        <td width = "8%"><label><b>Pre&ccedil;o Custo</b></label></td>
        <td width = "8%"><label><b>Margem Segura&ccedil;a</b></label></td>
		<td width = "8%"><label><b>Pre&ccedil;o Venda</b></label></td>
		<td width = "15%"><label><b>Pre&ccedil;o Custo Ajustado</b></label></td>
		<td width = "15%"><label><b>Pre&ccedil;o Venda Ajustado</b></label></td>
        <td width = "5%"><label><b>Data Inclus&atilde;o</b></label></td>
     </tr>
<?php

// Pegar o criterio para o SQL da consulta
$sql1 = "SELECT cod_produto,descricao,preco_custo,lucratividade,preco_venda,date_format(data_inclusao, '%d/%m/%Y')
FROM produto
WHERE cod_produto LIKE '".$busca."'
ORDER BY data_inclusao DESC,cod_produto,descricao";

$sql2 = "SELECT cod_produto,descricao,preco_custo,lucratividade,preco_venda,date_format(data_inclusao, '%d/%m/%Y')
FROM produto
WHERE descricao LIKE '".$busca."%'
ORDER BY data_inclusao DESC,cod_produto,descricao";

$sql3 = "SELECT cod_produto,descricao,preco_custo,lucratividade,preco_venda,date_format(data_inclusao, '%d/%m/%Y')
FROM produto
ORDER BY cod_produto,descricao";

// Seleciona no banco de dados com o LIMIT indicado pelos números acima
switch ($criterio) {
    case 1:
		$criterio = $sql1;
        break;
    case 2:
		$criterio = $sql2;
        break;
    case 3:
		$criterio = $sql3;       
        break;
        default;
                $criterio = $sql3;  
        break;

}
$res = mysqli_query($con,$criterio);
$Cor = "";

//VERIFICA A QUANTIDADE DE REGISTROS RETORNADOS
$registros = mysqli_num_rows($res);

if($registros > 0){
$valor = $ajuste_preco;

while ($linha = mysqli_fetch_array($res)){
if ($Cor == "#FFFFFF") $Cor = "#ECF2F8"; else $Cor = "#FFFFFF";
$preco_custo_ajustado = $linha[2] * (1 + ($valor/100));  
$preco_venda_ajustado = $preco_custo_ajustado * (1 + ($linha[3]/100));  
echo " <tr bgcolor='" . $Cor . "' onmouseover=\"mudar(this,'#FFE2CC');\" onmouseout=\"mudar(this,'" . $Cor . "');\">";
echo " <td class='tabela'><input type='checkbox' name='produto[]' value='$linha[0]' checked ='true'></td>";
echo " <td class='tabela'>$linha[0]</td>";
echo " <td style='text-align:left' class='tabela'>$linha[1]</td>";
echo " <td style='text-align:right;color:red' class='tabela'>$linha[2]</td>";
echo " <td align ='right' class='tabela'>$linha[3]</td>";
echo " <td style='text-align:right;color:blue' class='tabela'>$linha[4]</td>";
echo " <td style='text-align:right;color:red' class='tabela'><input type='text' name='produto[]' readonly='true' value=".number_format($preco_custo_ajustado, 2, ',', '.')."></td>";
echo " <td style='text-align:right;color:blue' class='tabela'><input type='text' name='produto[]' readonly='true' value=".number_format($preco_venda_ajustado, 2, ',', '.')."></td>";
echo " <td style='text-align:right' class='tabela'>$linha[5]</td>";

echo "</tr>"; 
}//fecha if while
}//fecha if
else {
echo "<b>N&atilde;o existe(em) entrada(s) para o crit&eacute;rio de busca !<b>";

}//fecha else
?>
<tr>
<td><input type="submit" value="Atualizar" class="botao"></td>
</tr>
</table>
</td>
</tr>
<?php
mysqli_close($con);
?>
 
</table>
    <p align=right><font face=Arial size=1><a href="index.php" title="Retornar"><< Retornar</a></p>
</form>
</body>
</html>

Agora veja o código que estou fazendo para atualizar os valores:

 

<?php 
# Função para conectar o banco de dados
    include("verifica.php");
    include("conexao/bdinc.php");
# Fim da conexão

?>
<!DOCTYPE html>
<HTML>
<html lang="pt-br">
<HEAD>
 <TITLE>FORMUL&Aacute;RIO DE AN&Aacute;LISE CONT&Aacute;BIL</TITLE>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1"> 
</HEAD>
<BODY>
<?php 
 $produtos  = isset($_POST['produto']) ? $_POST['produto'] : '';
 $valores[]  = array_chunk($produtos, 3, true); 

  	
// verifica se a PERMISSÃO ja está cadastrada...
     
     foreach ($valores as $id => $produto) {		
		
		$cod_prod              = intval($produto[0][0]);      
		$preco_custo_ajustado  = str_replace(",",".",$produto[0][1]);
        $preco_venda_ajustado  = str_replace(",",".",$produto[0][2]); 
	
	 
// INICIO - SQL DO FORMULÁRIO
   $up_produto = ("UPDATE produto SET preco_custo = '$preco_custo_ajustado', preco_venda = '$preco_venda_ajustado' WHERE cod_produto = $cod_prod");
	
// FIM - SQL DO FORMULÁRIO

// INICIO - EXECUÇÃO DO COMANDO SQL  e APAGANDO A SESSION
	if (!mysqli_query($con,$up_produto))
  {
  die('Error: ' . mysqli_error($con));
  }    
// FIM - EXECUÇÃO DO COMANDO SQL 
}// Fecha o if foreach 

	echo "<script language=JavaScript> window.alert('O produto foi alterado com sucesso !'); </script>";
    echo "<script>window.location = 'movimentos.php?mov=ajuste_preco_produto'</script>"; 

?> 
</BODY>
</HTML>

Agora veja como esta saindo o array:

Array
(
    [0] => Array
        (
            [0] => 5450
            [1] => 24,48
            [2] => 36,71
        )

    [1] => Array
        (
            [3] => 5451
            [4] => 26,93
            [5] => 40,40
        )

    [2] => Array
        (
            [6] => 1824
            [7] => 7,13
            [8] => 10,69
        )

    [3] => Array
        (
            [9] => 1828
            [10] => 14,57
            [11] => 21,86
        )

    [4] => Array
        (
            [12] => 1829
            [13] => 16,30
            [14] => 24,44
        )

    [5] => Array
        (
            [15] => 1830
            [16] => 15,50
            [17] => 23,25
        )

    [6] => Array
        (
            [18] => 1831
            [19] => 15,99
            [20] => 23,99
        )

    [7] => Array
        (
            [21] => 1835
            [22] => 16,40
            [23] => 24,60
        )

    [8] => Array
        (
            [24] => 1838
            [25] => 6,96
            [26] => 10,44
        )

    [9] => Array
        (
            [27] => 1855
            [28] => 9,65
            [29] => 14,47
        )

    [10] => Array
        (
            [30] => 2319
            [31] => 13,23
            [32] => 19,85
        )

    [11] => Array
        (
            [33] => 3335
            [34] => 4,56
            [35] => 6,84
        )

    [12] => Array
        (
            [36] => 3577
            [37] => 22,50
            [38] => 33,75
        )

    [13] => Array
        (
            [39] => 4275
            [40] => 7,25
            [41] => 10,87
        )

)

Mas quando clico em atualizar somente grava no banco de dados o primeiro dado:

(
            [0] => 5450
            [1] => 24,48
            [2] => 36,71
        )

Alguém sabe me informar como fazer para percorrer todas as linhas no foreach?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Temos uma matriz, os dados estão todos na posição 0 da variável e o laço de repetição está executando nesse indice, por isso ele vai executar apenas uma vez.

Array
(
    [0] => Array

Veja, tem um array de arrays (matriz), o foreach só vai funcionar no primeiro nível dessa matriz, portanto só vai executar uma vez, para acessar a primeiro indice, que é onde tem o segundo nivel da matriz, ou o array interno, que é o que precisamos acessar.

 

Os índices internos do array estão sequenciais, devido ao uso da função array_chunk, eles vão do 0 ao 40, nesse caso, temos duas opções:

  1. Fazer um contador para acessar os índices (mais difícil e menos performático)
  2.  Resetar os indices toda vez dentro do laço de repetição (mais fácil e mais performático)

 

Por esses motivos que está atualizando somente o primeiro dado.

 

Os problemas estão aqui:

foreach ($valores as $id => $produto) {		
		
		$cod_prod              = intval($produto[0][0]);      
		$preco_custo_ajustado  = str_replace(",",".",$produto[0][1]);
        $preco_venda_ajustado  = str_replace(",",".",$produto[0][2]); 

Segue como deve ficar:

//Acessa o primeiro indice da matriz para pegar o array com todos os dados
$valores = $valores[0];

foreach ($valores as $id => $produto) {
//Reseta os indices do array $produto, para que as informações sempre fiquem nos indices sequenciais corretos
        $produto = array_values($produto);
		
	$cod_prod = intval($produto[0]);      
	$preco_custo_ajustado  = str_replace(",",".",$produto[1]);
        $preco_venda_ajustado  = str_replace(",",".",$produto[2]); 

 

Espero ter ajudado!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

hyvOK,

 

Você é o cara! Muito obrigado pela ajuda.

Agora segue o código para ajudar alguém um dia?

<?php 
# Função para conectar o banco de dados
    include("verifica.php");
    include("conexao/bdinc.php");
# Fim da conexão

?>
<!DOCTYPE html>
<HTML>
<html lang="pt-br">
<HEAD>
 <TITLE>FORMUL&Aacute;RIO DE AN&Aacute;LISE CONT&Aacute;BIL</TITLE>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1"> 
</HEAD>
<BODY>
<?php 
// Acessa os produtos selecionado na Checkbox ...
 $produtos  = isset($_POST['produto']) ? $_POST['produto'] : '';
 $valores[]  = array_chunk($produtos, 3, true); 
     
//Acessa o primeiro indice da matriz para pegar o array com todos os dados
 $valores = $valores[0];

// Faz o loop para update no banco de dados 
     foreach ($valores as $id => $produto) {		
//Reseta os indices do array $produto, para que as informações sempre fiquem nos indices sequenciais corretos
       	$produto = array_values($produto);
	    $cod_prod              = intval($produto[0]);      
		$preco_custo_ajustado  = str_replace(",",".",$produto[1]);
        $preco_venda_ajustado  = str_replace(",",".",$produto[2]);  
		
	
/*	echo '<pre>';
		print_r($cod_prod);
		print_r($preco_custo_ajustado);
		print_r($preco_venda_ajustado);		
		echo '</pre>';
	 }
	 */
	 
 
// INICIO - SQL DO FORMULÁRIO
   $up_produto = ("UPDATE produto SET preco_custo = $preco_custo_ajustado, preco_venda = $preco_venda_ajustado WHERE cod_produto = $cod_prod");
	
// FIM - SQL DO FORMULÁRIO

// INICIO - EXECUÇÃO DO COMANDO SQL  PARA UPDATE NO BANCO

	if (!mysqli_query($con,$up_produto))
		{
			die('Error: ' . mysqli_error($con));
		}      
  
// FIM - EXECUÇÃO DO COMANDO SQL 

}// Fecha o if foreach 

	echo "<script language=JavaScript> window.alert('O produto foi alterado com sucesso !'); </script>";
    echo "<script>window.location = 'movimentos.php?mov=ajuste_preco_produto'</script>"; 
	
?> 
</BODY>
</HTML>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.