Como melhorar minha validação de entrada e saída

Tenho a função inserir , e nela tem uma validação de entrada e saída, primeiro ela faz um select com a função count com um where referenciando o código do produto, depois ela cai na condição ```if($quantidade_db >= $quantidade || mysqli_num_rows($result) == 0) se a quantidade do banco for maior ou igual quantidade inserida pelo usuário ou semysqli_num_rows == 0` ela vai para a inserção, se a condição for falsa, mostra uma mensagem na tela “valor ultrapassa a quantidade em estoque”.

A validação funciona para a saída, mas para entrada, por exemplo, o usuário cadastra o produto com a flag de entrada duas vezes com a quantidade de 50, mas novamente ele cadastra o mesmo produto com a flag de entrada mas com a quantidade de 101, a vai aparecer a mensagem “valor ultrapassa a quantidade em estoque”.

Na entrada o usuário deve digitar a quantidade que ele quiser, e não cair no else para exibir a mensagem.

Como eu poderia resolver esse problema, ou melhorar a validação?``

O código:

<?php

require_once('./base_de_dados/connect_bd.php');

function inserir(){
    //Conectando com o banco de dados
    $dbc = conexao();

    $retorno = array();

    $erros = array();
    $admin;
    $produto;
    $registro;
    $quantidade;

    //função empty verifica se não tem registro inserido

    if($_POST['produto'] == ""){
        $erros[] = 'O campo codigo administrador é obrigatório!';
    }else{
        $produto = $_POST['produto'];
    }

    if($_POST['admin'] == ""){
        $erros[] = 'O campo codigo produto é obrigatório $teste!';
    }else{
        $admin = $_POST['admin'];
    }

    if($_POST['registro'] == ""){
        $erros[] = 'O campo Registro é obrigatório!';
    }else{
        $registro = $_POST['registro'];
    }

    if(empty($_POST['quantidade'])){
        $erros[] = 'O campo quantidade é obrigatório!';
    }else{
        $quantidade = $_POST['quantidade'];
    }

       if(empty($erros)){
      $query = "select SUM(ret.quantidade) AS quantidade,
            ret.nome_produto,
            ret.id_produto
            from(SELECT 
            SUM(p.quantidade) AS QUANTIDADE, 
                p.tipo_registro, 
                p.id_produto, 
                c.nome AS nome_produto, 
                c.imagem
                FROM estoque p JOIN administrador u 
                           ON u.id_admin = p.id_admin 
                           JOIN cadastro_produtos c 
                           ON c.id_produto = p.id_produto
                           WHERE p.tipo_registro = 'entrada'

                           GROUP BY                 
                           p.tipo_registro, 
                           p.id_produto, 
                           c.nome, 
                           c.imagem 
                           UNION
                           SELECT 
                           -SUM(p.quantidade) AS QUANTIDADE, 
                           p.tipo_registro, 
                           p.id_produto, 
                           c.nome AS nome_produto, 
                           c.imagem 
                           FROM estoque p JOIN administrador u 
                           ON u.id_admin = p.id_admin 
                           JOIN cadastro_produtos c 
                           ON c.id_produto = p.id_produto
                           WHERE p.tipo_registro = 'saida'

                           GROUP BY                 
                           p.tipo_registro, 
                           p.id_produto, 
                           c.nome, 
                           c.imagem)ret
                           WHERE ret.id_produto = $produto
                           group by ret.nome_produto,
                           ret.id_produto";





        $result = @mysqli_query($dbc, $query);

        $row = mysqli_fetch_array($result);

        $quantidade_db = $row['quantidade'];


         if($quantidade_db >= $quantidade || mysqli_num_rows($result) == 0){

        //inserir no banco de dados
        $query = "INSERT INTO estoque(id_estoque, quantidade, tipo_registro, id_admin, id_produto, dt_movimentacao) VALUES (NULL, $quantidade,'$registro', '$admin' ,'$produto',CURRENT_TIMESTAMP)";

        $result = @mysqli_query($dbc, $query);
        echo "$query";


        if($result){
            $retorno[] = 'Cadastro realizado com sucesso!';

        }else{
            $erros[] = 'Ocorreu algum erro ao cadastrar o estoque!';
        }
        /** if($quantidade_db <= $quantidade || mysqli_num_rows($result) <= 0){

        //inserir no banco de dados
        $query = "INSERT INTO estoque(id_estoque, quantidade, tipo_registro, id_admin, id_produto, dt_movimentacao) VALUES (NULL, $quantidade,'$registro', '$admin' ,'$produto',CURRENT_TIMESTAMP)";

        $result = @mysqli_query($dbc, $query);
        echo "$query";


        if($result){
            $retorno[] = 'Cadastro realizado com sucesso!';

        }else{
            $erros[] = 'Ocorreu algum erro ao cadastrar o estoque!';
        }


    }else{

        //erro estoque
        echo"<script>alert('Primeiro Digite a entrada'); history.go(-1)</script>";
    }
            **/



    }else{

        $retorno = $erros;

    }

    return $retorno;
}?>

Ola

É dificil falar sobre isso quando nao se conhece o modelo de dados.

ao meu ver vc pode inserir e remover produtos, certo? e se vc pedir para remover 100 mas tem 50, não rola, certo?

pois bem, por que razão vc tem mais de uma entrada por produto no banco de dados? parece simples: entrou 30, soma 30 no campo quantidade. saiu 40, subtrai 40. nada impede de vc ter uma tabela de historico onde vc mostra essas transações mas se vc mantem a quantidade em um lugar, é esse lugar que vc procura.

eu imagino que o seu problema vc resolve sob a seguinte perspectiva: quem são os objetos? vc tem Produtos e vc tem o Estoque. Estoque e Produto tem uma relação. vc realiza açoes como “adicionar” e “remover”.

$estoque->adiciona( $produto, $quantidade ); # pode usar objeto ou product id

$retorno = $estoque->remove( $produto, $quantidade ); # pode lançar exception se nao tem

quando vc abstrai dessa forma, vc percebe que o seu banco de dados é um detalhe da implementação. vc nao pode guardar esses dados em memoria uma hora pode faltar luz, ou o processo acaba, reinicia servidor, certo? entao o banco de dados serializa esses dados. vc armazena e lê disso. é a sua camada de infraestrutura. Produto e Estoque são a sua camada de modelo.

isso leva a vc criar um DAO para acessar o banco de dados. Isso leva vc a separar as responsabilidades.

assim se vc tem regras para remover e inserir, chamando os metodos certos vc jamais erra as validações. E seu codigo fica semantico, fica facil de ler.

por ultimo: seu select tem uma variavel la dentro, alem de ser muito complexo. use prepared statement e nunca concatene strings pra gerar sql. alias em 2016 deve ter alguma solução decente de mapeamento objeto relacional ( ORM ) pra usar em PHP.