Ao testar o formulário para inserir produtos no banco de dados, inseri apenas o preço e o banco de dados aceitou mesmo eu tendo colocado a coluna nome como not null. Como faço para corrigir essa falha?
Ao testar o formulário para inserir produtos no banco de dados, inseri apenas o preço e o banco de dados aceitou mesmo eu tendo colocado a coluna nome como not null. Como faço para corrigir essa falha?
Luis, vou colar aqui a minha resposta.
$query = "insert into produtos (nome, preco) values ('{$nome}', {$preco})";
$conexao = mysqli_connect('localhost', 'root', 'suaSenha', 'seuBanco');
Mas para verificar seu erro, faz um echo nas variáveis $preco e $nome. Verifica o conteúdo delas.
Acho difícil ter inserido um registro sem nome, quando esta coluna foi definida como not Null.
Melhor dizendo, impossível.
Dá uma olhada na definição da tua tabela.
Se for o caso, dropa a tabela e cria novamente, pois não acredito que você tenha dados a perder nela.
Se quiser, posta o seu código pra gente ver...
Eu vi o seu código. Aparentemente correto! Seria bom você fazer o echo das duas variáveis, pois talvez você esteja perdendo o valor de $nome. Teria que ver seu formulário...
echo $preco;
echo $nome;
Oi, Sidnei
Fiz o que vc falou, mas o problema persiste. Vou colocar o php e o sql abaixo pra vc ver. Já revisei e refiz inúmeras vezes e não consigo encontrar o erro. Obrigado!
<?php include("cabecalho.php");?> <?php include("conecta.php"); $nome = $_GET["nome"]; $preco = $_GET["preco"];
function InsereProduto($conexao, $nome, $preco){ $query = "insert into produtos (nome, preco) values ('{$nome}', '{$preco}')"; return mysqli_query($conexao, $query); }
if(InsereProduto($conexao, $nome, $preco)) { ?>
Produto <?= $nome ?>, <?= $preco ?> adicionado com sucesso!
<?php } else { $msg = mysqli_error($conexao); ?>O produto não pode ser adicionado: <?= $msg ?>
<?php } ?> <?php include("rodape.php")?>SQL: create table produtos (ID integer auto_increment not null, nome varchar(255) not null, preco decimal not null);
O problema é que o mysql está interpretando que NOT NULL é diferente de vazio. Coloquei no if para ele não aceitar o valor "" e funcionou, mas ainda não resolveu o problema do bd.
Luis, acabo de testar, e você tem razão. Pra mim ele também inseriu em branco!
Mas você fez o echo pra ver o conteúdo da variável? por que ela está em branco (nula) ??
Então, Sidnei, fiz o echo tbem e ele aceitou os valores do 'nome' em branco. Pelo que eu pesquisei pelos fóruns o sql entende que o campo vazio do varchar não é nulo. Se vc for inserir direto pelo mysql colocando no campo nome "", ele irá aceitar. Agora estou procurando alguma solução, mas não estou achando.
Eu alterei o banco, fiz a coluna nome como Char not null. Mas deu o mesmo problema...
Vou pesquisar também.
luis, pelo o que entendi nas pesquisas, isto é inevitável.
Dá uma olhada neste link de nossos patrícios portugueses:
http://www.portugal-a-programar.pt/topic/50842-mysql-coluna-aceita-null-no-update/
O jeito é tratar mesmo a variável.No seu caso, como vem de um form, você deve fazer uma validação para que o campo não seja vazia no form.
Logo você chega nesta parte do curso (validation)
Por enquanto, eu acho que a tua solução tá boa, perguntando se é = "" , e não deixando gravar...
Se voc~e descobrir algo diferente avisa, ok?
Pode deixar, Sidnei, assim que achar uma solução eu posto aqui.
Luís, como o Sidnei falou, o problema é que NOT_NULL
é diferente de NOT_EMPTY
, e creio que os bancos não tem NOT_EMPTY.
Inserir "" no banco, é inserir um valor, o valor vazio. O que pode fazer, mas realmente é no código, é colocar algo como $nome = $_POST['nome'] != "" ? $_POST['nome'] : null;
. O que estamos fazendo nesse caso é usando um if ternário
. O if ternário serve para, dependendo da condição lógica ( tudo antes do ? ), a atribuição é uma ou outra. Antes dos :
(dois pontos) é o true
e após ele é o false
.
Veja se isso lhe ajuda, abraço.
Luis, isso aconteceu comigo tbm! apenas retire as "" da variável preço para que seu código funcione, veja:
Seu código: <?php include("cabecalho.php");?> <?php include("conecta.php"); $nome = $_GET["nome"]; $preco = $_GET["preco"];
Alteração: <?php include("cabecalho.php");?> <?php include("conecta.php"); $nome = $_GET["nome"]; $preco = $_GET[preco];
NULL
e Vazio
são coisas diferentes. Para tratar isso a nível banco você poderia utilizar uma trigger
ou uma procedure
mas esses tópicos são mais avançados e mais relacionados com o trabalho de um DBA ou de um AD.
Para evitar que os dados que serão inseridos não sejam vazios você deve tratá-los na aplicação.
O uso do if
é a maneira mais correta.
Utilize
$nome = $_GET["nome"];
e em seguida
if(!is_null($nome) && !empty($nome)) {
// Realiza a operação
} else {
// Exibe mensagem orientando ao usuário para preencher o campo corretamente.
}
Como essa condição deve ser testada em diversas colunas, você pode criar uma function
ou método para testar se o valor é nulo ou vazio.
Exemplo:
function vazio($input) {
$output = false;
if(is_null($input) or empty($input))
$output = true;
return $output
}
Nesse caso a função retornará true para quando o campo for nulo ou vazio.
Aí é só usar para testar a variável $nome.
if(!vazio($nome)) {
// Realiza a operação
} else {
// Exibe mensagem de erro!
}
Espero ter ajudado.
Eu gostaria de saber por que não consigo utilizar o mysqli?
Jalyson, para responder melhor sua questão, favor abrir uma nova dúvida com mais detalhes do erros que estão ocorrendo e qual SO você está utilizando. Podemos lhe ajudar melhor por lá.
Abraço
Deu certo Paulo. Obrigado.