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, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • 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
×

Informação importante

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