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

Campo de Nome enviando sem ser preenchido

Olá!

Consegui fazer normalmente o envio de dados, quando preencho Nome e Preço ele envia normalmente, quando deixo de preencher preço ele não envia pro banco, mas quando eu não preencho o Nome e só o Preço ele envia pro banco vazio. Como impedir isso?

<?php include_once "cabecalho.php" ?>

    <?php
function insereProduto($con, $nome, $preco) {
  $query = "insert into produtos (nome, precos) values ('".$nome."','".$preco."')";
  return mysqli_query($con, $query);
}

    $nome = $_GET["nome"];
    $preco = $_GET["preco"];
    $con = mysqli_connect('localhost','root','','loja');

$query = "insert into produtos (nome, precos) values ('".$nome."','".$preco."')";

if(insereProduto($con, $nome, $preco)) {
  ?>
<p class="alert-success">Produto <?php echo $nome; ?>, <?php echo $preco; ?> adicionado com sucesso!</p>

<?php  }else {

$msg = mysqli_error($con);

  ?>

  <p class="alert-danger">Não foi enviado! <?= $msg ?></p>
<?php }
mysqli_close($con);
     ?>


   <?php include_once "rodape.php" ?>
3 respostas

Bom dia Charles

O MySQL espera que o valor do produto seja populado com um valor numérico válido. No caso de passar ele vazio, ele é uma string '' (vazia) e então o SQL em questão quebra. Já no caso do nome do produto, o MySQL espera uma string válida. No caso '' (valio) é uma string válida e então não é retornado erro algum.

Pra evitar que seja gravado produtos sem nome e sem preço, você tem que adicionar uma validação em algum lugar do código, conforme abaixo:

Opção 1: Adicionando a validação na função insereProduto

<?php 

include_once "cabecalho.php";

function insereProduto( $con, $nome, $preco )
{
  //adicionando uma verificação para garantir que o nome e o preco sejam preenchidos
  if( strlen( $nome ) > 0 && is_numeric( $preco ) )
  {  
    $query = "insert into produtos( nome, precos ) values ( '".$nome."', '".$preco."' )";
    return mysqli_query($con, $query);
  }
  else
    return false;  
}

$nome = $_GET["nome"];
$preco = $_GET["preco"];
$con = mysqli_connect('localhost','root','','loja');

//A linha abaixo não é necessária
//$query = "insert into produtos (nome, precos) values ('".$nome."','".$preco."')";

if( insereProduto( $con, $nome, $preco ) )
{
  ?>
  <p class="alert-success">Produto <?php echo $nome; ?>, <?php echo $preco; ?> adicionado com sucesso!</p>
  <?php  
}
else 
{
  $msg = mysqli_error($con);
  ?>
  <p class="alert-danger">Não foi enviado! <?= $msg ?></p>
  <?php 
}
mysqli_close($con);

include_once "rodape.php"
?>

Opção 2: Colocando a validação antes da função insereProduto

<?php 

include_once "cabecalho.php";

function insereProduto( $con, $nome, $preco )
{
    $query = "insert into produtos( nome, precos ) values ( '".$nome."', '".$preco."' )";
    return mysqli_query($con, $query);
}

$nome = $_GET["nome"];
$preco = $_GET["preco"];


//A linha abaixo não é necessária
//$query = "insert into produtos (nome, precos) values ('".$nome."','".$preco."')";

//adicionando uma verificação para garantir que o nome e o preco sejam preenchidos
if( strlen( $nome ) > 0 && is_numeric( $preco ) )
{

  $con = mysqli_connect('localhost','root','','loja');
  if( insereProduto( $con, $nome, $preco ) )
  {
    ?>
    <p class="alert-success">Produto <?php echo $nome; ?>, <?php echo $preco; ?> adicionado com sucesso!</p>
    <?php  
  }
  else 
  {
    $msg = mysqli_error($con);
    ?>  
    <p class="alert-danger">Não foi enviado! <?= $msg ?></p>
    <?php 
  }
  mysqli_close($con);
}
else
{  
?>  
    <p class="alert-danger">O Nome e Valor do Produto são obrigatórios! </p>
<?php  
}

include_once "rodape.php"
?>

A vantagem na opção 1 é que, independente de quais os lugares que você chama a função insereProduto, a validação já vai estar implementada e funcionando.

A vantagem na opção 2 é que, a mensagem de retorno pro cliente ficou mais clara e pode ser personalizada conforme necessário.

solução!

Você tem algumas outras opções para que isso não aconteça. A primeira validação deve ser do lado do cliente, nele você deve colocar o atributo :

required="required"

Dentro da tag input, por exemplo : <input type="text" name="nome" id="nome" required="required">

A partir daí ele já não deixa o cliente enviar valores nulos a partir do formulário, parece a solução, mas você deve fazer a verificação dentro do servidor também.

A melhor maneira de você fazer isso é utilizando a função do php empty($var); então no seu exemplo deveria ficar assim :

function insereProduto( $con, $nome, $preco )
{
  //adicionando uma verificação para garantir que o nome e o preco sejam preenchidos
  if(!empty($nome) && !empty($preco) && is_numeric( $preco ) )
  {  
    $query = "insert into produtos( nome, precos ) values ( '".$nome."', '".$preco."' )";
    return mysqli_query($con, $query);
  }
  return false;  
}

A função empty($var) verifica todas as possibilidades da variável ser nula.

O que é visto abaixo é considerado vazio:
  • "" (uma string vazia)
  • 0 (0 como um inteiro)
  • 0.0 (0 como um ponto flutuante)
  • "0" (0 como uma string)
  • NULL
  • FALSE
  • array() (um array vazio)
  • $var; (uma variável declarada, mas sem valor)

Pessoal, obrigado.