Ir para conteúdo

POWERED BY:

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 violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

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