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.