Solucionado (ver solução)
Solucionado
(ver solução)
17
respostas

Php

Ajuda. No formulário de cadastro de produtos, além de cadastrar e alterar os produtos (igualzinho a apostila do FP-73 eu gostaria de enviar um submit apenas do primeiro campo que é codigo do produto, deixando os demais em branco, pesquisar se este produto existe no BD, caso sim, retornar com os dados e preencher todos os campos do formulário. Se não, retornar o apenas esse código que busquei no BD, preencher este campo e após ,preencheria o restante dos campos (este seria um produto novo) e no final utilizaria o botão submit.

Como fazer esse código? Ja tentei várias formas utilizando o mesmo formulário de cadastro de produto e nada parece dar certo.

Esse é a lógica do formulário de cadastro de produto que faz alteração e cadastro de produtos ao mesmo tempo:

<?php

$categorias = listaCategorias($conexao);
$marcas = listaMarcas($conexao);

    $produto = new Produto();
    $produto->setCategoria(new Categoria());
    $produto->setMarca(new Marca());
    $ehAlteracao = false;
        $action = "adiciona-produto.php";
        if (array_key_exists('id', $_GET)) {
    $id = $_GET['id'];
        $produto = buscaProduto($conexao, $id);
    $ehAlteracao = true;
        $action = "altera-produto.php";
}

?>
<h1><?=$ehAlteracao ? "Alterar" : "Cadastrar" ?> produto</h1>
<form action="<?=$action ?>" method="post">
<input type="hidden" name="id" value="<?=$produto->getId() ?>" />

abraços e obrigado

17 respostas

Se eu entendi corretamente, você quer um formulário único para cadastrar ou editar.

Se esta página receber um ID válido, abriria em modo de edição, caso contrário em modo de cadastro. De acordo com a situação, o "action" do formulário seria alterado.

Uma forma de chegar neste resultado seria a seguinte:

<?php

$categorias = listaCategorias($conexao);
$marcas = listaMarcas($conexao);

$produto = new Produto();
$produto->setCategoria(new Categoria());
$produto->setMarca(new Marca());
$ehAlteracao = false;
$action = "adiciona-produto.php";
$id = "";

//Campos do formulario
$nome = "";
//Inserir os demais campos do formulario



if (array_key_exists('id', $_GET)) {
    $id = $_GET['id'];
    if ($id <> ""){
        $produto = buscaProduto($conexao, $id);
        $ehAlteracao = true;
        $nome = $produto->getNome() ;
        //Carregar os demais campos do formulário

        $action = "altera-produto.php";
    }
}

?>
<h1><?=$ehAlteracao ? "Alterar" : "Cadastrar" ?> produto</h1>
<form action="<?=$action ?>" method="post">

    <input type="text" name="nome" value="<?=$nome; ?>" />
<!-- Adicionar os demais campos do formulário -->

    <input type="hidden" name="id" value="<?=$id; ?>" />

</form>

No exemplo acima eu apenas inseri o campo nome, mas você pode usar a mesma lógica para adicionar mais campos.

Muito obrigado Daniel, desculpe por eu não ter sido objetivo com minha pergunta, esse formulário unico eu já tenho funcionando (cadastrar e editar o produto em uma só arquivo). Só não sei se eu poderia ou como faria para utilizar a mesma pagina (se é assim mesmo que poderia ser feito) para que:

O Usuário digite (apenas) o primeiro campo eu consiga submetê-lo (apenas o primeiro campo) deixando os demais em branco, para consultar o código digitado do primeiro campo no BD.

Se esse código do produto existir (existe o produto), retornar com os dados do produto para preenchimento dos campos do formulário para inclusão de mais um item deste mesmo produto, caso não exista, preencher o código no BD e devolver esse código preenchido na pagina de cadastro de produto e deixar os demais campos para que sejam preechidos e submetidos ao BD para cadastramento deste novo produto.

Abraços

Neste caso uma solução seria a seguinte, você mantém esse formulário de inserir/alterar do jeito que está, e cria um segundo formulário, dentro da mesma página, que seria exibido somente para pesquisar.

Se a página não receber parâmetro ID, você mostra apenas o formulário de pesquisa.

Se tiver recebido o ID (seja por GET ou POST), se oculta o formulário de pesquisa, e se mostra o formulário de inserir ou alterar.

O código anterior teria a seguinte alteração:

<?php
$categorias = listaCategorias($conexao);
$marcas = listaMarcas($conexao);


$ehAlteracao = false;
$action = "";
$id = "";
$mensagem = "";

//Campos do formulario
$nome = "";
//Inserir os demais campos do formulario


if (isset($_GET["id"])) {
    $id = $_GET['id'];
} else {
    if (isset($_POST["id"])) {
        $id = $_POST['id'];
    }
}

if ($id <> ""){

    $produto = buscaProduto($conexao, $id);
    if($produto === false){
        $mensagem = "Produto não localizado!";
        $action = "adiciona-produto.php";
        $produto = new Produto();
        $produto->setCategoria(new Categoria());
        $produto->setMarca(new Marca());
    } else {
        $ehAlteracao = true;
        $nome = $produto->getNome() ;
        //Carregar os demais campos do formulário
        $mensagem = "Produto localizado!";
        $action = "altera-produto.php";
        $produto->setCategoria(new Categoria());
        $produto->setMarca(new Marca());
    }
}


?>


<?
if ($action == "") {
?>

    <h1>Pesquisar Produto</h1>
    <form action="<?=$action ?>" method="post">

        <p>Digite o código do produto que deseja localizar</p>

        <input type="text" name="id"/>
        <input type="submit" value="Pesquisar!">
    </form>



<?
} else {
?>

<h1><?=$ehAlteracao ? "Alterar" : "Cadastrar" ?> produto</h1>
    <p><? echo $mensagem;?></p>
    <form action="<?=$action ?>" method="post">

        <input type="text" name="nome" value="<?=$nome; ?>" />
        <!-- Adicionar os demais campos do formulário -->

        <input type="hidden" name="id" value="<?=$id; ?>" />

    </form>


<?
}
?>

A função de buscaProduto teria o seguinte ajuste

function buscaProduto($conexao, $id) {

        $query = "select * from produtos where id = {$id}";
        $resultado = mysqli_query($conexao, $query);


        if (mysqli_num_rows($resultado)==0){
            return false;
        } else {
            $produto_buscado = mysqli_fetch_assoc($resultado);


            $categoria = new Categoria();
            $categoria->setId($produto_buscado['categoria_id']);

            $nome = $produto_buscado['nome'];
            $descricao = $produto_buscado['descricao'];
            $preco = $produto_buscado['preco'];
            $usado = $produto_buscado['usado'];
            $isbn = $produto_buscado['isbn'];
            $tipoProduto = $produto_buscado['tipoProduto'];

            if ($tipoProduto == "Livro") {
                $produto = new Livro($nome, $preco, $descricao, $categoria, $usado);
                $produto->setIsbn($isbn);
            } else {
                $produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
            }

            $produto->setId($produto_buscado['id']);

            return $produto;
        }

    }

Muito obrigado Daniel, acredito que sua lógica é minha salvação. Mas como eu sou novo em Php fiz as substituições e não funcionou, provavelmente porque não entendi como substituir a pagina de adiciona-produto. Segue a minha que estou desenvolvendo, você poderia analisar e me mostrar em quais trechos eu deverei fazer as alterações? A pagina banco-produto já refiz a função buscaProduto como você pediu . Obrigado.

<?php
require_once 'conecta.php';
require_once 'banco-marca.php';
require_once 'banco-produto.php';
require_once 'produto.php';
require_once 'banco-categoria.php';

?>
<!--require_once 'logica-usuario.php';
verificaUsuario(); -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
        <title>Sistema Florença</title>
            <link href="css/bootstrap.css" rel="stylesheet" />
            <link href="css/loja.css" rel="stylesheet" />
                  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>

</head>

<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <a href="/index.php" class="navbar-brand">Sistema Florença</a>
            </div>
            <div>
    <ul class="nav navbar-nav">
        <li><a href="produto-formulario.php">Adiciona Produto</a></li>
        <li><a href="produto-lista.php">Lista Produtos</a></li>
        <li><a href="logout.php">Sair</a></li>
    </ul>

            </div>
        </div>
    </div>

<main class="container">
    <article class="principal">

<?php

$categorias = listaCategorias($conexao);
$marcas = listaMarcas($conexao);

    $produto = new Produto();
    $produto->setCategoria(new Categoria());
    $produto->setMarca(new Marca());
    $ehAlteracao = false;
        $action = "adiciona-produto.php";
        if (array_key_exists('id', $_GET)) {
    $id = $_GET['id'];
        $produto = buscaProduto($conexao, $id);
    $ehAlteracao = true;
        $action = "altera-produto.php";
}

?>
<h1><?=$ehAlteracao ? "Alterar" : "Cadastrar" ?> produto</h1>
<form action="<?=$action ?>" method="post">
<input type="hidden" name="id" value="<?=$produto->getId() ?>" />

<br>

<div class="form-group">
    <label>Codigo Barras:</label>
        <input type="text" name="codigo" class="form-control"
            value="<?=$produto->getCodigo() ?>" autofocus="">
</div>

<div class="form-group">
<label>Nome:</label>
<input class="form-control" type="text" name="nome"
    value="<?=$produto->getNome() ?>">
</div>

<div class="form-group">
    <label>Referencia:</label>
        <input type="number" name="referencia" class="form-control"
            value="<?=$produto->getReferencia() ?>">
</div>

</div>
<div class="form-group">
    <label>Preço:</label>
        <input type="text" name="preco" class="form-control"  
            value="<?=$produto->getPreco() ?>">

</div>
<div class="form-group">
    <label>Peso:</label>
        <input type="number" name="peso" class="form-control"
            value="<?=$produto->getPeso() ?>">

</div>
<div class="form-group">
    <label>Medida da Caixa:</label>
        <input type="text" name="medida" class="form-control"
            value="<?=$produto->getMedida() ?>">
</div>

<div class="form-group">
    <label>Ncm:</label>
        <input type="number" name="ncm" class="form-control"
            value="<?=$produto->getNcm() ?>">
</div>

<div class="form-group">
    <label>Descrição:</label>
        <textarea class="form-control" name="descricao"><?=$produto->getDescricao() ?></textarea>
</div>

<div class="form-group">
    <label>Marca:</label>
        <select name="marca_id" class="form-control">
<?php
foreach($marcas as $marca) :
$essaEhAMarca = $produto->getMarca()->getId()
== $marca->getId();
$selecao = $essaEhAMarca ? "selected='selected'" : "";
?>
    <option value="<?=$marca->getId() ?>" <?=$selecao ?> >
            <?=$marca->getNome() ?>
    </option>
    <?php endforeach ?>

</select>
</div>

<div class="form-group">
    <label>Categoria:</label>
        <select name="categoria_id" class="form-control">
<?php
foreach($categorias as $categoria) :
$essaEhACategoria = $produto->getCategoria()->getId()
== $categoria->getId();
$selecao = $essaEhACategoria ? "selected='selected'" : "";
?>
    <option value="<?=$categoria->getId() ?>" <?=$selecao ?> >
            <?=$categoria->getNome() ?>
    </option>
    <?php endforeach ?>

</select>
</div>

<div class="form-group">
    <select name="destaque" class="form-control" value="<?=$produto->getDestaque() ?>">
<option value="2">Sem Destaque</option>    
<option value="1">Com Destaque</option>    
</select>
</div>

        <button class="btn btn-primary" type="submit">Salvar</button>
</form>


</body>



</html>

Pelo que eu vi, a sua idéia é criar uma página que substitua a página de "produto-formulário.php" (inserir) e a "produto-altera-formulario.php" (alterar)

O formulário que você fez não vai precisar alterar. Os campos "value" do formulário puxam os valores da classe "produtos", que pode estar vazia (ao inserir) ou com os dados (ao atualizar)

O começo da página vai ter que alterar. As alterações do seu arquivo ficariam assim:

<?php
require_once 'conecta.php';
require_once 'banco-marca.php';
require_once 'banco-produto.php';
require_once 'produto.php';
require_once 'banco-categoria.php';

?>
<!--require_once 'logica-usuario.php';
verificaUsuario(); -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
        <title>Sistema Florença</title>
            <link href="css/bootstrap.css" rel="stylesheet" />
            <link href="css/loja.css" rel="stylesheet" />
                  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>

</head>

<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <a href="/index.php" class="navbar-brand">Sistema Florença</a>
            </div>
            <div>
    <ul class="nav navbar-nav">
        <li><a href="produto-formulario.php">Adiciona Produto</a></li>
        <li><a href="produto-lista.php">Lista Produtos</a></li>
        <li><a href="logout.php">Sair</a></li>
    </ul>

            </div>
        </div>
    </div>

<main class="container">
    <article class="principal">

<?php

$action = "";
$categorias = listaCategorias($conexao);
$marcas = listaMarcas($conexao);
$id = "";

if (isset($_GET["id"])) {
    $id = $_GET['id'];
} else {
    if (isset($_POST["codigo_barras"])) {
        $id = buscaIDdoProdutoPeloCodigoInterno($conexao, $_POST["codigo_barras"]); //Funcao nova que pesquisa o seu codigo e retorna o ID do registro no banco (se existir)
    }
}

if ($id <> ""){

    $produto = buscaProduto($conexao, $id);
    if($produto === false){
        $mensagem = "Produto não localizado!";
        $action = "adiciona-produto.php";
        $produto = new Produto();
        $produto->setCategoria(new Categoria());
        $produto->setMarca(new Marca());
    } else {
        $ehAlteracao = true;
        $nome = $produto->getNome() ;
        //Carregar os demais campos do formulário
        $mensagem = "Produto localizado!";
        $action = "altera-produto.php";
        $produto->setCategoria(new Categoria());
        $produto->setMarca(new Marca());
    }
}

?>

<?php
if ($action == "") {
?>
   <h1>Pesquisar Produto</h1>
   <form action="<?=$action ?>" method="post">

        <p>Digite o Codigo Barras do produto que deseja localizar</p>

        <input type="text" name="codigo_barras"/>
        <input type="submit"  class="btn btn-primary"  value="Pesquisar!">
   </form>

<?php
} else {
?>

<h1><?=$ehAlteracao ? "Alterar" : "Cadastrar" ?> produto</h1>
<form action="<?=$action ?>" method="post">
    <input type="hidden" name="id" value="<?=$produto->getId() ?>" />

    <br>

    <div class="form-group">
        <label>Codigo Barras:</label>
            <input type="text" name="codigo" class="form-control"
                value="<?=$produto->getCodigo() ?>" autofocus="">
    </div>

    <div class="form-group">
    <label>Nome:</label>
    <input class="form-control" type="text" name="nome"
        value="<?=$produto->getNome() ?>">
    </div>

    <div class="form-group">
        <label>Referencia:</label>
            <input type="number" name="referencia" class="form-control"
                value="<?=$produto->getReferencia() ?>">
    </div>

    </div>
    <div class="form-group">
        <label>Preço:</label>
            <input type="text" name="preco" class="form-control"  
                value="<?=$produto->getPreco() ?>">

    </div>
    <div class="form-group">
        <label>Peso:</label>
            <input type="number" name="peso" class="form-control"
                value="<?=$produto->getPeso() ?>">

    </div>
    <div class="form-group">
        <label>Medida da Caixa:</label>
            <input type="text" name="medida" class="form-control"
                value="<?=$produto->getMedida() ?>">
    </div>

    <div class="form-group">
        <label>Ncm:</label>
            <input type="number" name="ncm" class="form-control"
                value="<?=$produto->getNcm() ?>">
    </div>

    <div class="form-group">
        <label>Descrição:</label>
            <textarea class="form-control" name="descricao"><?=$produto->getDescricao() ?></textarea>
    </div>

    <div class="form-group">
        <label>Marca:</label>
            <select name="marca_id" class="form-control">
            <?php
            foreach($marcas as $marca) :
            $essaEhAMarca = $produto->getMarca()->getId()
            == $marca->getId();
            $selecao = $essaEhAMarca ? "selected='selected'" : "";
            ?>
                <option value="<?=$marca->getId() ?>" <?=$selecao ?> >
                        <?=$marca->getNome() ?>
                </option>
                <?php endforeach ?>

            </select>
    </div>

    <div class="form-group">
        <label>Categoria:</label>
            <select name="categoria_id" class="form-control">
            <?php
            foreach($categorias as $categoria) :
            $essaEhACategoria = $produto->getCategoria()->getId()
            == $categoria->getId();
            $selecao = $essaEhACategoria ? "selected='selected'" : "";
            ?>
            <option value="<?=$categoria->getId() ?>" <?=$selecao ?> >
                    <?=$categoria->getNome() ?>
            </option>
        <?php endforeach ?>

    </select>
    </div>

    <div class="form-group">
        <select name="destaque" class="form-control" value="<?=$produto->getDestaque() ?>">
            <option value="2">Sem Destaque</option>    
            <option value="1">Com Destaque</option>    
        </select>
    </div>

        <button class="btn btn-primary" type="submit">Salvar</button>
</form>
<?php
}
?>

Se você abrir direto, vai aparecer um formulário pedindo para digitar o código de barras.

Se você informar o código e postar o formulário, ele vai pesquisar para ver se acha esse código no banco (segue nova função, verifique se o nome do campo está correto em relação ao seu banco de dados). Desta forma, qualquer novo cadastro vai ter que primeiro digitar o seu código interno. Isso é algo bom para evitar repetições por acidente.

Se o código digitado for localizado, abre seu formulário em modo de edição, caso contrário abre o formulário vazio.

Se você tiver vindo da página de listagem de produto, a página vai receber um ID (GET), então nesse caso já abre direto em modo de edição.

A função nova para pesquisar pelo seu código de produto seria a seguinte:

function buscaIDdoProdutoPeloCodigoInterno($conexao, $codigoInterno) {
    $retorno = 0;
    $query = "select * from produtos where codigo = '" . $codigoInterno . "'";
    $resultado = mysqli_query($conexao, $query);
    while($produto_array = mysqli_fetch_array($resultado)) {
        $retorno = $produto_array["id"];
    }
    return $retorno;

}

Daniel, muito obrigado mesmo!!!! Não tenho como te agradecer.

A busca funcionou perfeito quando existe um código no BD ela retornou para edição. show !!!!!! Melhor impossível.

Mas quando fiz uma busca com um código que não existe no BD ele não retornou para pagina de inserir novo produto (não sei onde errei). E desta forma, não consigo ver se o codigo do produto digitado retornou. (Eu gostaria que o usuário não precisasse digitar novamente o código do produto, ele já aceitasse o código que foi buscado no BD como ponto de partida para o novo produto e preencha somente o restante do formulário)

abraços!!!

Como você informou que a pesquisa/atualização funcionam, talvez o problema seja na função de busca produto.

Creio que isso pode ser resolvido fazendo um pequeno ajuste. Quando você pesquisa, você utiliza essa função nova "buscaIDdoProdutoPeloCodigoInterno". Ela vai retornar o código do produto no banco, se ele achar, caso contrário, retorna zero.

O ajuste seria apenas nesta parte do código:

if ($id <> ""){
    if($id == 0){ //Alteração! Não achou o produto na pesquisa
        $mensagem = "Produto não localizado!";
        $action = "adiciona-produto.php";
        $produto = new Produto();
        $produto->setCategoria(new Categoria());
        $produto->setMarca(new Marca());
        //Alteração - Preencher automaticamente o código
        $produto->setCodigo($_POST["codigo_barras"]); //Verifique se a sua classe produto tem esse método de definir o codigo
    } else {
        $produto = buscaProduto($conexao, $id); 
        $ehAlteracao = true;
        $nome = $produto->getNome() ;

        $mensagem = "Produto localizado!";
        $action = "altera-produto.php";
        $produto->setCategoria(new Categoria());
        $produto->setMarca(new Marca());
    }
}

Daniel me ajude, continua não funcionando. Ele retorna a mesma pagina de pesquisa como se nada tivesse acontecido, não aparece nenhum erro. Parece que não acessa a pagina adiciona-produto. No console não aparece esta ação nem o retorno. Fiz um teste utilizando o antigo produto-formulario para ver se o DAO e o adiciona-produto poderiam ter algum problema e ele incluiu o produto certinho. A alteração continua show, sem problemas. Minha classe produto parece que está certa veja:

public function getCodigo()
{
return $this->codigo;
}
public function setCodigo($codigo)
{
$this->codigo = $codigo;
}

Ah me lembrei de outra questão para te perguntar. No adiciona-produto tem redirecionamento que retornam para pagina produto-formulario. Será que talvez não estão travando o retorno?

$dao = new ProdutoDAO($conexao);
if ($dao->insereProduto($produto)) {
?>
<p class ="Alert-Sucess">
                O Produto <?=$produto->getNome() ?>, R$ <?=$produto->getPreco() ?> 
                Foi adicionado com sucesso!

<noscript> 
Se não for direcionado automaticamente, clique <a href="produto-formulario.php">aqui</a>. 
</noscript>
</p>
<?php
} else {
?>
<p class="alert-danger">O produto <?=$produto->getNome() ?> não foi adicionado</p>
<?php
}
?>

<script language="JavaScript"> 
window.location="produto-formulario.php"; 
</script>

Deve ser algum problema com o caminho.

Quando essa página que você criou for aberta, o comportamento padrão deve ser abrir o formulário de pesquisa. Quando for feita a pesquisa, ele vai postar os dados para ele mesmo, então neste momento, ele deve sumir e aparecer o formulário completo, que pode estar com os dados preenchidos ou não. Por isso que tem aquela variavel "action". O seu problema é apenas quando você informa o código que não existe, ou esse problema deixou de ocorrer?

Por padrão essa variável "action" é vazia (para postar para ele mesmo). Se ele recebe o ID (que pode vir da página de listagem, ou ser retornado pela pesquisa feita no formulário de busca da própria página), ele deve mudar, para "adiciona-produto.php" ou "altera-produto.php". Além disso, deve voltar o formulário completo, e sumir o formulário de pesquisa.

Quando você postar os dados do formulário completo, ele deve ir para uma das duas páginas que eu citei acima (de acordo com a ação).

Você postou uma parte da página de "adiciona-produto". Pelo que eu vi da programação, ao cair nela já redireciona automaticamente para a página de "produto-formulário", então essa mensagem de sucesso ou erro (já programadas) não vão aparecer para o seu usuário.

Eu não sei qual o nome que você deu para esta página nova que faz tudo, mas, se você deu o nome de "produto-formulario", do jeito que está, o comportamento que vai ocorrer é esse que você descreveu, ou seja.

1 - Abre a pagina de produtos (aparece formulário para pesquisar) 2 - Pesquisa o código 3 - O código não foi localizado, abre em branco 4 - O usuário preenche os campos e posta 5 - Quando cai em "adiciona-produto", volta para a página de produtos (aparece formulário para pesquisa, e não aparece nenhum aviso se gravou ou não)

Para que ele imprima na tela (na "adiciona-produto") as mensagens que já existem, teria que forçar um delay, ou seja, redirecionar após um certo tempo. Isso você faz com javascript, para atrasar em 5 segundos ficaria assim.

 <script type="text/javascript">
    setTimeout(function(){window.location="produto-formulario.php"} , 5000);
    </script>

Obrigado pelas dicas Daniel ajudou a entender melhor os comportamentos. O que está acontecendo: Quando o usuario chama a pagina de produto-formulario, abre a janela de pesquisar o codigo. ok. Se digito um código que existe no BD, a alteração funciona perfeitamente. Mas, quando o código do produto não existe, o comportamento é de que ele não faz nada, fica estático na pagina de pesquisar o código, e pelo que entendi, o comportamento seria abrir uma tela de cadastro do produto, e do jeito que te pedi, com a parte do código que o usuário havia consultado (do novo produto) já no seu respectivo campo,

//Alteração - Preencher automaticamente o código
        $produto->setCodigo($_POST["codigo_barras"]); //Verifique se a sua classe produto tem esse método de definir o codigo

Bastando ele preencher o restante. Mas o que ocorre é que ele não faz nada, fica estático na tela de consulta esperando um novo código não abre a tela completa de cadastro do produto.

Você pode me ajudar nessa? Onde eu devo olhar dentro do sistema para corrigir isso? Muito obrigado

Agora ficou mais claro. Vai precisar colocar alguns avisos no seu código para poder ver onde está ocorrendo a falha

Minha suspeita é que no caso de pesquisar um código não existente, aquela função de pesquisa está retornando vazio ao invés de zero, por isso pula a parte de configurar o cadastro de um novo produto, e fica preso no formulário de pesquisa

Para garantir que o teu servidor não está escondendo as mensagens de erro, você pode forçar a exibição de erros, colocando os seguintes comandos no começo do seu arquivo


<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
?>

Depois, você vai colocar alguns avisos de testes, para ver em que parte está ocorrendo a falha. O trecho que precisa testar é o seguinte:

$id = "";

if (isset($_GET["id"])) {
    echo ("* recebendo GET *"); //Aviso de teste
    $id = $_GET['id'];
} else {
    if (isset($_POST["codigo_barras"])) {
        echo ("* inicio recebendo POST *"); //Aviso de teste
        $id = buscaIDdoProdutoPeloCodigoInterno($conexao, $_POST["codigo_barras"]); //Funcao nova que pesquisa o seu codigo e retorna o ID do registro no banco (se existir)
        echo ("* O ID localizado foi : " . $id . " *"); //Aviso de teste
        echo ("* fim recebendo POST *"); //Aviso de teste
    }
}


echo ("* O ID pesquisado foi : " . $id . " *"); //Aviso de teste

if ($id <> ""){
    echo ("* O ID nao esta vazio * "); //Aviso de teste
    if($id == 0){ //Alteração! Não achou o produto na pesquisa
        echo ("* inicio novo registro * "); //Aviso de teste
        $mensagem = "Produto não localizado!";
        $action = "adiciona-produto.php";
        $produto = new Produto();
        $produto->setCategoria(new Categoria());
        $produto->setMarca(new Marca());
        //Alteração - Preencher automaticamente o código
        $produto->setCodigo($_POST["codigo_barras"]); //Verifique se a sua classe produto tem esse método de definir o codigo
        echo ("* fim novo registro * "); //Aviso de teste
    } else {
        echo ("* atualizar novo registro * "); //Aviso de teste
        $produto = buscaProduto($conexao, $id); 
        $ehAlteracao = true;
        $nome = $produto->getNome() ;

        $mensagem = "Produto localizado!";
        $action = "altera-produto.php";
        $produto->setCategoria(new Categoria());
        $produto->setMarca(new Marca());
        echo ("* fim atualizar novo registro * "); //Aviso de teste
    }
}

Coloque também avisos de testes na função de pesquisa

function buscaIDdoProdutoPeloCodigoInterno($conexao, $codigoInterno) {
    $retorno = 0;
    echo ("* inicio funcao pesquisa * "); //Aviso de teste
    $query = "select * from produtos where codigo = '" . $codigoInterno . "'";
    $resultado = mysqli_query($conexao, $query);
    echo ($query); //Aviso de teste
    while($produto_array = mysqli_fetch_array($resultado)) {
        echo ("* loop pesquisa * "); //Aviso de teste
        $retorno = $produto_array["id"];
    }

    //Codigo novo - apenas para teste
    if ($retorno ==""){
        echo ("* retornou id vazio... * "); //Aviso de teste
        $retorno = 0;
    }

    echo ("* fim pesquisa * "); //Aviso de teste
    return $retorno;

}

Nossa, muito obrigado Daniel, segue resultado:

1) alteração (id existe) inicio funcao pesquisa select from produtos where codigo = '214234' loop pesquisa loop pesquisa fim pesquisa inicio recebendo POST inicio funcao pesquisa select from produtos where codigo = '214234' loop pesquisa loop pesquisa fim pesquisa * O ID localizado foi : 30 fim recebendo POST O ID pesquisado foi : 30 O ID nao esta vazio atualizar novo registro fim atualizar novo registro *

2) inclusão (id não existe) inicio funcao pesquisa select from produtos where codigo = '8888888888888888888' retornou id vazio... fim pesquisa inicio recebendo POST inicio funcao pesquisa select from produtos where codigo = '8888888888888888888' retornou id vazio... fim pesquisa * O ID localizado foi : 0 fim recebendo POST * O ID pesquisado foi : 0

A pesquisa estava retornando vazio ao invés de zero, esse último ajuste corrigiu isso, mas, ele não foi para as etapas seguintes, devia ter aparecido " O ID nao esta vazio " , " inicio novo registro " e " fim novo registro "

Tente os seguintes ajustes e teste somente a inclusão:

if ($id != ""){
    echo ("* O ID nao esta vazio * "); //Aviso de teste
    if($id == 0){ //Alteração! Não achou o produto na pesquisa
        echo ("* inicio novo registro * "); //Aviso de teste

        //Restante do código igual

Se der errado, tente assim:

if ($id != ""){
    echo ("* O ID nao esta vazio * "); //Aviso de teste
    if($id == "0"){ //Alteração! Não achou o produto na pesquisa
        echo ("* inicio novo registro * "); //Aviso de teste

        //Restante do código igual

Oi Daniel, os testes de inclusão dos dois codigos retornaram assim:

1) inicio funcao pesquisa select from produtos where codigo = '8888888888888888888' retornou id vazio... fim pesquisa inicio recebendo POST inicio funcao pesquisa select from produtos where codigo = '8888888888888888888' retornou id vazio... fim pesquisa * O ID localizado foi : 0 fim recebendo POST *

2) inicio funcao pesquisa select from produtos where codigo = '8888888888888888888' retornou id vazio... fim pesquisa inicio recebendo POST inicio funcao pesquisa select from produtos where codigo = '8888888888888888888' retornou id vazio... fim pesquisa * O ID localizado foi : 0 fim recebendo POST *

Oi Daniel, estou tentando entender a lógica, e tenho uma dúvida:

Quando enviamos o action para o buscaIdPeloCodigoProduto ele retorna que o id é VAZIO. Porque ele faz uma nova pesquisa, retorna vazio novamente e depois diz que localizou um id=0 ?

solução!

A minha idéia era fazer com que a função buscaIdPeloCodigoProduto retornasse sempre um valor númerico. Se achar o produto, retorna o id do produto, caso contrário retorna zero.

Então o que eu queria era que quando o id retornado fosse zero, a programação entrar no formulário de cadastro, caso contrário, entrar no modo de atualização.

Como isso não funcionou, eu fiz a seguinte alteração.

A função BuscaProduto não mudou


function buscaIDdoProdutoPeloCodigoInterno($conexao, $codigoInterno) {
    $retorno = 0;
    $query = "select * from produtos where codigo = '" . $codigoInterno . "'";
    $resultado = mysqli_query($conexao, $query);
    while($produto_array = mysqli_fetch_array($resultado)) {
        $retorno = $produto_array["id"];
    }

    if ($retorno ==""){
        $retorno = 0;
    }

    return $retorno;

}

Uma parte do código inicial da página foi refatorado da seguinte forma:

$action = "";
$categorias = listaCategorias($conexao);
$marcas = listaMarcas($conexao);
$id = "";
$comando = ""; //Nova variavel!

if (isset($_GET["id"])) {
    $id = $_GET['id'];
    $comando = "ATUALIZAR";
    $ehAlteracao = true;
} else {
    if (isset($_POST["codigo_barras"])) {

        $id = buscaIDdoProdutoPeloCodigoInterno($conexao, $_POST["codigo_barras"]); //Funcao nova que pesquisa o seu codigo e retorna o ID do registro no banco (se existir)

        if($id == 0){
             $comando = "NOVO";
             $ehAlteracao = false;
        } else {
            $comando = "ATUALIZAR";
            $ehAlteracao = true;

        }
    }
}

if ($comando == "NOVO"){
     $mensagem = "Produto não localizado!";
    $action = "adiciona-produto.php";
    $produto = new Produto("", "", "", new Categoria(), "");
    //Importante! Verifique o construtor de sua classe produto e crie um produto com dados vazios! Na minha classe produtos o construtor recebia nome,preco, descricao, new Categoria() e usado

    $produto->setCategoria(new Categoria());
    $produto->setMarca(new Marca());
    //Alteração - Preencher automaticamente o código
    $produto->setCodigo($_POST["codigo_barras"]); //Verifique se a sua classe produto tem esse método de definir o codigo
} 

if ($comando == "ATUALIZAR"){
    $produto = buscaProduto($conexao, $id); 
    $ehAlteracao = true;
    $nome = $produto->getNome() ;

    $mensagem = "Produto localizado!";
    $action = "altera-produto.php";
    $produto->setCategoria(new Categoria());
    $produto->setMarca(new Marca());
}

Agora a página vai ter o comportamento desejado.

Daniel, valeu !!!! Funcionou perfeitamente.

Quero te agradecer pelo seu conhecimento, sua paciência e principalmente pela aula de Php Orientado a Objetos que você nos proporcionou. Aprendi muito com você.

Muito obrigado

abraços

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software