Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

luanda

Verificar se um registro já existe

Recommended Posts

Fiz um sistema bem simples de cadastro, onde o usuário digita as informações e o código envia esses dados para o banco. Acontece que esse código não impede que várias pessoas cadastrem-se com o mesmo username e e-mail, mesmo eu tendo declarado unique para estes na tabela.

<?php
    include "conexao.php";
?>

<?php
    
    // captura dos dados digitados no formulário //
	$nome=$_POST ['nome'];
    $sobrenome=$_POST ['sobrenome'];
	$username=$_POST ['username'];
	$email=$_POST ['email'];
    $senha=$_POST ['senha'];
    $telefone=$_POST ['telefone'];
	
    $sql = mysql_query("INSERT INTO cadastro (nome,sobrenome,username,email,senha,telefone)  VALUES ('$nome', '$sobrenome','$username','$email','$senha','$telefone')") or die(mysql_error());
    
    $resultado = mysql_query ($sql);
   header ("Location:../usuario/index.php");
?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, seja bem-vindo.

 

Independente do seu código PHP, se as chaves estão definidas corretamente você não deveria conseguir cadastrar registros duplicados, mas o mais correto seria você fazer essa validação também na aplicação antes de inserir o registro, pois assim você consegue avisar o usuário sobre a duplicidade dos dados.

 

Em outras palavras, você deveria antes fazer um SELECT com WHERE email = 'email@email.com', por exemplo. Apenas após um retorno vazio desse select você executa o INSERT.

 

Exporte sua tabela e poste aqui para vermos como suas chaves UNIQUE estão definidas.

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, Matheus Tavares disse:

Olá, seja bem-vindo.

 

Independente do seu código PHP, se as chaves estão definidas corretamente você não deveria conseguir cadastrar registros duplicados, mas o mais correto seria você fazer essa validação também na aplicação antes de inserir o registro, pois assim você consegue avisar o usuário sobre a duplicidade dos dados.

 

Em outras palavras, você deveria antes fazer um SELECT com WHERE email = 'email@email.com', por exemplo. Apenas após um retorno vazio desse select você executa o INSERT.

 

Exporte sua tabela e poste aqui para vermos como suas chaves UNIQUE estão definidas.

Matheus, obrigada pela ajuda. Consegui achar um código que consegue avisar sobre a duplicata para o usuário, mas no caso ele só funciona com o username (tentei usando or e-mail no select mas não foi, com certeza estou fazendo errado). 

-- phpMyAdmin SQL Dump
-- version 4.1.4
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Generation Time: 02-Nov-2018 às 13:20
-- Versão do servidor: 5.6.15-log
-- PHP Version: 5.4.24

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `mao_na_massa`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `cadastro`
--

CREATE TABLE IF NOT EXISTS `cadastro` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `sobrenome` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `username` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `senha` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `telefone` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `nivel` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'usuario',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`,`email`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=12 ;

--
-- Extraindo dados da tabela `cadastro`
--

INSERT INTO `cadastro` (`id`, `nome`, `sobrenome`, `username`, `email`, `senha`, `telefone`, `nivel`) VALUES
(3, 'luanda', 'oliveira', 'estrabso', 'kkk@gmail.com', '123', '22221111', 'admin'),
(9, 'luanda', 'anne', 'kiminseok', 'akakka@jakak', '111111', '(22) 22222-2222', 'usuario'),
(8, 'luann', 'ssss', 'akka', 'akakka@jakak', '123', '22222222222', 'usuario'),
(7, 'poxa', 'poxa', 'poxa', 'poxa@poxa.poxa', 'poxa', '(99) 9999-9999', 'usuario');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem como imaginei... a definição das suas chaves UNIQUE estão incorretas.

Você está definindo apenas uma chave dupla, dessa forma:

UNIQUE KEY `username` (`username`,`email`)

Com isso você está dizendo ao banco que você não deseja registros com o mesmo username e e-mail simultaneamente.

Para funcionar da forma que você quer, você precisa definir duas chaves UNIQUE separadas, uma para o username e outra para o e-mail.

 

Assim:

CREATE TABLE `cadastro` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `sobrenome` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `username` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `senha` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `telefone` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `nivel` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'usuario',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT username, email FROM cadastro WHERE username = 'joao' OR email = 'mail@mail.com'

Ou seja se existir um username joao não cadastra, mas se houver também um mail mail@mail.com;  Mesmo que não seja no mesmo registro onde está joão também não cadastra.

<?php
$conn = new mysqli('endereco_do_banco', 'login', 'senha', 'nome_do_banco_de_dados');
if ($conn->connect_errno) {
    die("Não conectado por causa disso: %s\n", $conn->connect_error);
} else {
    $sql = "SELECT username, email FROM cadastro WHERE username = '{$username}' OR email = '{$email}'";
    $result = $conn->query($sql);
    if ($result->num_rows) {
        echo ("Não pode cadastrar porque existe um username ou email cadastrado");
    } else {
       //// ---- Aqui entra o código do cadastro :)
    }
}
mysqli_close($conn);

 

Observações.

* Detesto esse treco de mysqli, por isso não testei o código acima, mas parece está correto.

* Esqueça disso: mysql se for usar use mysqli, melhor use PDO.

* Seu código ou o que mostrei não possui nenhum tipo de segurança, pois apenas pega um valor e passa para execução, ou seja nada impede que por exemplo no username venha um código malicioso. Então filtre os dados antes de enviar-los para o banco.

 

Aqui um pequeno guia para começar a manipular o banco de dados de uma forma coerente: https://forum.imasters.com.br/topic/565800-crud-introdução-a-pdo/

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Omar~ disse:

SELECT username, email FROM cadastro WHERE username = 'joao' OR email = 'mail@mail.com'

Ou seja se existir um username joao não cadastra, mas se houver também um mail mail@mail.com;  Mesmo que não seja no mesmo registro onde está joão também não cadastra.


<?php
$conn = new mysqli('endereco_do_banco', 'login', 'senha', 'nome_do_banco_de_dados');
if ($conn->connect_errno) {
    die("Não conectado por causa disso: %s\n", $conn->connect_error);
} else {
    $sql = "SELECT username, email FROM cadastro WHERE username = '{$username}' OR email = '{$email}'";
    $result = $conn->query($sql);
    if ($result->num_rows) {
        echo ("Não pode cadastrar porque existe um username ou email cadastrado");
    } else {
       //// ---- Aqui entra o código do cadastro :)
    }
}
mysqli_close($conn);

 

Observações.

* Detesto esse treco de mysqli, por isso não testei o código acima, mas parece está correto.

* Esqueça disso: mysql se for usar use mysqli, melhor use PDO.

* Seu código ou o que mostrei não possui nenhum tipo de segurança, pois apenas pega um valor e passa para execução, ou seja nada impede que por exemplo no username venha um código malicioso. Então filtre os dados antes de enviar-los para o banco.

 

Aqui um pequeno guia para começar a manipular o banco de dados de uma forma coerente: https://forum.imasters.com.br/topic/565800-crud-introdução-a-pdo/

 

 

Omar, acabei dando um jeito aqui que consegui fazer com que ele não aceitasse o registro duplicado. O código ficou bem maior (por burrice minha mesmo), mas funcionou.

 

<?php
    
    // captura dos dados digitados no formulário //
	$nome=$_POST ['nome'];
    $sobrenome=$_POST ['sobrenome'];
	$username=$_POST ['username'];
	$email=$_POST ['email'];
    $senha=$_POST ['senha'];
    $telefone=$_POST ['telefone'];

    $verifica_user = mysql_query("SELECT * FROM cadastro WHERE  username='$username' LIMIT 1") or die(mysql_error());
    $verifica_user = mysql_num_rows($verifica_user);

    $verifica_email = mysql_query("SELECT * FROM cadastro WHERE  email='$email' LIMIT 1") or die(mysql_error());
    $verifica_email = mysql_num_rows($verifica_email);

    if($verifica_user > 0){echo "Este user já está sendo utilizado!" ;
    }elseif($verifica_email > 0){echo "Esse e-mail já está sendo utilizado!";}
    else{
	
    $sql = mysql_query("INSERT INTO cadastro (nome,sobrenome,username,email,senha,telefone)  VALUES ('$nome', '$sobrenome','$username','$email','$senha','$telefone')") or die(mysql_error());
    
    $resultado = mysql_query ($sql);
   header ("Location:../usuario/index.php");
    }
?>

E não estou tão preocupada com a segurança dos dados porque isso é pra um trabalho do colégio, nada profissional. Além disso, sobre o PDO, minha professora só nos ensinou com o uso do mysql, então não sei usá-lo. Mas obrigada pela ajuda!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.