Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia pessoal,
Tenho um código na minha aplicação que verifica se já existe um CNPJ já gravado no banco de dados antes de executar o INSERT, caso já exista o CNPJ no banco de dados é impresso uma mensagem informando que o CNPJ já existe no banco de dados e não permite executar o INSERT. O código está fuincionando perfeitamente exceto o bloqueio do INSERT caso exista o CNPJ. Será que alguém poderia me dar uma ajuda a resolver este problema???
O Código é este:
if(isset($_POST)) {
$status = TRUE;
//VALIDAÇÃO DO CNPJ
if(isset($_POST['idCnpj'])) {
$txtCnpj = $_POST['idCnpj'];
$txtCnpj = (trim($txtCnpj));
$remover = array(".","/","-");
$novoCnpj = str_replace($remover,"", $txtCnpj);
if(!empty($novoCnpj)) {
require_once("bd/conexao_cnpj.php");
$sql = mysql_query("SELECT * FROM tb_cliente WHERE cli_cnpj='$novoCnpj'");
$qry = mysql_fetch_array($sql);
if("$qry[cli_cnpj]" == $novoCnpj) {
$status = FALSE;
echo "CNPJ já cadastrado! </br>";
}
}
}
}
Na verificação if("$qry[cli_cnpj]" == $novoCnpj) se o CNPJ informado pelo usuário foi igual a um existente no banco de dados o status é alterado para FALSE que deveria impedir o INSERT, pois o INSERT só é possível quando o status for TRUE, o que está acontecendo é que a verificação está sendo feita corretamente a mensagem CNPJ já cadastrado! é mostrada na tela porém o INSERT é feito normalmente.
Agradeço desde já a ajuda neste caso.
>
Oi Jorgito,
Tem como você colocar a verificação de FALSE ou TRUE?
Caso você realmente esteja gravando na variável $status o valor de FALSE, ai está o problema, deveria ser false, em letras minúsculas.
Na verificação também tem que ser assim.
Rodrigo, não muda nada com false em minúsculo, já havia tentado assim antes. Tem outras validações que seguem a mesma lógica, somente esta de bloquear o INSERT que não funciona.
Coloca a verificação do INSERT pra eu dar uma olhada
if($status == TRUE) {
$query = $conexao->prepare("INSERT INTO tb_cliente (cli_cnpj, cli_nome, cli_vinculo, cli_sigla, cli_uasg, cli_website, fk_id_endereco_tb_cliente) VALUES (?, ?, ?, ?, ?, ?, ?)") or die ($conexao->error);
$query->bind_param("sssssss", $novoCnpj, $txtCliente, $txtVinculo, $txtSigla, $txtUasg, $txtSite, $id_Endereco);
$retornoCliente = $query->execute();
$id_Cliente = $conexao->insert_id;
}
Coloca a verificação do INSERT pra eu dar uma olhada
Segue no post abaixo a verificação do INSERT, soment quando o $status for TRUE deve ser realizado o INSERT.
Cara, faz os seguintes testes,
Em algumas verificações minhas de verdadeiro ou falso eu uso 3 sinais de =.
Outro teste é o seguinte, você pode colocar assim:
Substitui isso: if($status == TRUE)
Por Isso: if($status)>
Cara, faz os seguintes testes,
Em algumas verificações minhas de verdadeiro ou falso eu uso 3 sinais de =.
Outro teste é o seguinte, você pode colocar assim:
Substitui isso: if($status == TRUE)
Por Isso: if($status)
Já tentei assim tb antes e mesmo assim não resolve... :(
Não é mais fácil você fazer um if(mysql_num_rows($sql) != 0){ cadastra } else { avisa duplicata } ?
Há duas alternativas, não importa qual utilizar, mas compreenda que cada uma possui seus prós e contras.
A primeira está aqui:
http://forum.imasters.com.br/topic/515831-consulta-com-array/
Ao invés de pesquisar por ID, pesquise pelo CNPJ.
A outra, é definir o CNPJ como unique, e usar a mesma estrutura que eu te passei no outro post. O CNPJ deve ser salvo sem máscara, somente os números, no fomarto varchar/string. Caso repetir o valor, uma exceção será lançada, e se eu não estiver enganado, o erro code da exceção será 1062.
Logo:
catch (mysqli_sql_exception $e) {
$conexao->rollback();//se algo deu errado, realiza o rollback da transação
if($e->getCode() == 1062) {
printf('Registro duplicado: %s' , $e);
} else {
echo $e;//Ele implementa __toString()
}
}>
Há duas alternativas, não importa qual utilizar, mas compreenda que cada uma possui seus prós e contras.
A primeira está aqui:
http://forum.imasters.com.br/topic/515831-consulta-com-array/
Ao invés de pesquisar por ID, pesquise pelo CNPJ.
A outra, é definir o CNPJ como unique, e usar a mesma estrutura que eu te passei no outro post. O CNPJ deve ser salvo sem máscara, somente os números, no fomarto varchar/string. Caso repetir o valor, uma exceção será lançada, e se eu não estiver enganado, o erro code da exceção será 1062.
Logo:
catch (mysqli_sql_exception $e) {
$conexao->rollback();//se algo deu errado, realiza o rollback da transação
if($e->getCode() == 1062) {
printf('Registro duplicado: %s' , $e);
} else {
echo $e;//Ele implementa __toString()
}
}
Valeu mesmo Gabriel, consegui resolver com a primeira forma mesmo... Cara vc saberia de algum curso on line de PHP que ensinam a usar corretamente o PDO e o mysqli ?????
Acho que um curso seria demais para essas duas bibliotecas. Na realidade, ambas exploram o lado da orientação a objetos (MySQLi também prove programação estruturada, considere-a híbrida). Entendendo de OO, fica fácil saber utilizá-las.
Aqui no fórum há ótimos exemplos para ambos os casos. Eu particularmente uso PDO, pois trabalho com vários SGBDs, e não somente com MySQL. Entretanto, entendendo o uso da PDO, eu consigo implementar MySQLi facilmente, pois seu conceito é bem parecido.
Na realidade, é mais fácil estudar PDO do que MySQLi, pois não há brecha para confundir os conceitos OO e procedural.
PHP Data Objects -> Manual, o mais importante, como sempre.
Desenvolvendo com PDO PHP Data Objects -> Aqui há o básico da PDO (sem prepared statements);
http://forum.imasters.com.br/topic/426023-exibir-dados-da-tabela-usando-pdo/?p=1681778 -> Exemplo completo do João Bastista Neto usando prepared statements.
Oi Jorgito,
Tem como você colocar a verificação de FALSE ou TRUE?
Caso você realmente esteja gravando na variável $status o valor de FALSE, ai está o problema, deveria ser false, em letras minúsculas.
Na verificação também tem que ser assim.