Ir para conteúdo

Arquivado

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

DinhoPHP

Limitar cadastro

Recommended Posts

Li outras postagens deste forum mas não compreendi. Gostaria de limitar o cadastro em um. Por favor me ajudem e agradeço!



public function insert(){

$sql = "INSERT INTO $this->table (lembrete, dirigente, integrantes, festividade) VALUES (:lembrete, :dirigente, :integrantes, :festividade)";
$stmt = DB::prepare($sql);
$stmt->bindParam(':lembrete', $this->lembrete);
$stmt->bindParam(':dirigente', $this->dirigente);
$stmt->bindParam(':integrantes', $this->integrantes);
$stmt->bindParam(':festividade', $this->festividade);

if($stmt->rowCount() == true):
//Executa o cadastro
return $stmt->execute();

else:
$msg="Desculpe! Já existe informações cadastradas no sistema, sendo possível apenas editá-las ou excluí-las.";
endif;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem duas opções:

 

1. Antes do INSERT, fazer um SELECT para ver se já existe um registro com esses dados

 

2. Adicionar uma chave única (UNIQUE KEY) ao campo que dever ser único. Após fazer o INSERT, verifique se foi retornado erro. Se o erro for de registro duplicado, informe o usuário. Essa validação pode ser feito com o código do erro, que varia conforme o SGBD que você está usando. Veja a documentação dele para mais detalhes

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem duas opções:

1. Antes do INSERT, fazer um SELECT para ver se já existe um registro com esses dados

2. Adicionar uma chave única (UNIQUE KEY) ao campo que dever ser único. Após fazer o INSERT, verifique se foi retornado erro. Se o erro for de registro duplicado, informe o usuário. Essa validação pode ser feito com o código do erro, que varia conforme o SGBD que você está usando. Veja a documentação dele para mais detalhes
Ficou assim:

 

public function insert(){
//Valida o cadastro
$sql="SELECT * FROM $this->table WHERE id = :id";
$stmt=DB::prepare($sql);
$stmt->bindParam(':id', $id);
$stmt->execute();
if($stmt->rowCount() == 1):
//Executa o cadastro
$sql  = "INSERT INTO $this->table (lembrete, dirigente, integrantes, festividade) VALUES (:lembrete, :dirigente, :integrantes, :festividade)";
$stmt = DB::prepare($sql);
$stmt->bindParam(':lembrete', $this->lembrete);
$stmt->bindParam(':dirigente', $this->dirigente);
$stmt->bindParam(':integrantes', $this->integrantes);
$stmt->bindParam(':festividade', $this->festividade);
//Executa o cadastro
return $stmt->execute();
else:
$msg="Desculpe! Já existe informações cadastradas no sistema, sendo possível apenas editá-las ou excluí-las.";
endif;
}

Eu já tinha feito algo semelhante, só que agora não cadastra.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está aqui:

 

if($stmt->rowCount() == 1):

 

Você só está cadastrando se já houver um registro. Pelo que entendi, você quer cadastrar apenas se não houver um, certo? Se for isso, use 0 em vez de 1 nesse if

 

Uma dica de desempenho: você quer apenas contar. Não precisa dos dados. Então é melhor usar o comando COUNT da SQL, desta forma:

 

 

SELECT COUNT(*) as total FROM tabela WHERE condicao;

 

Assim o total será retornado no campo "total". Será uma consulta bem mais rápida :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está aqui:

if($stmt->rowCount() == 1):

Você só está cadastrando se já houver um registro. Pelo que entendi, você quer cadastrar apenas se não houver um, certo? Se for isso, use 0 em vez de 1 nesse if

 

Uma dica de desempenho: você quer apenas contar. Não precisa dos dados. Então é melhor usar o comando COUNT da SQL, desta forma:

SELECT COUNT(*) as total FROM tabela WHERE condicao;

Assim o total será retornado no campo "total". Será uma consulta bem mais rápida :thumbsup:

Primeiramente agradeço até a paciência para comigo e vejo que está explicando muito bem! Estou seguindo esse projeto com a mente cheia de coisas, seguirei com o esforço! Esse zero eu testei com ele. Realizarei novos testes e direi o resultado. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu li novamente o texto e segundo o que programei parece sim, registar se não houver registro. Mas eu não quero que passe de um. Pois esse "cadastro" será exibido para visitante, por tratar-se de um sistema de avisos e não, dados pessoais. Entendeu? Por isso não é interessante mais de um.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O SELECT COUNT deve retornar 0. Só assim o cadastro poderá ser feito. Se retornar maior que 0, significa que já existe um e, se um novo cadastro for feito, haverá duplicidade. Por isso sugeri a alteração do 1 para 0 no seu código.

 

Você tem que definir o seguinte: qual será o identificador único?

 

Em um cadastro de usuários, esse identificador pode ser email ou CPF, por exemplo.

 

Pelo que entendi, seu objetivo é outro. Você não vai restringir por esses dados. Mas precisa de um parâmetro para impedir múltiplos cadastros. A partir daí você poderá montar o SELECT que busca por cadastros prévios, para evitar multiplicidade

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa pela demora, mas venho tentando essa restrição através da ID. No momento segue assim e não cadastra rs:

 

public function insert(){
//Valida o cadastro
//$result=mysql_query("SELECT count(*) as total from Students"); $data=mysql_fetch_assoc($result); echo $data['total'];
$sql="SELECT COUNT (*) as total FROM $this->table";
$stmt=DB::prepare($sql);
//$stmt->bindParam(":id", $id);
if($stmt->fetchAll() == 0):
//Executa o cadastro
$sql = "INSERT INTO $this->table (lembrete, dirigente, integrantes, festividade) VALUES (:lembrete, :dirigente, :integrantes, :festividade)";
$stmt = DB::prepare($sql);
$stmt->bindParam(':lembrete', $this->lembrete);
$stmt->bindParam(':dirigente', $this->dirigente);
$stmt->bindParam(':integrantes', $this->integrantes);
$stmt->bindParam(':festividade', $this->festividade);
//Executa o cadastro
return $stmt->execute();
else:
$msg="Desculpe! Já existe informações cadastradas no sistema, sendo possível apenas editá-las ou excluí-las.";
endif;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, já sabe que eu já vinha agradecido por toda ajuda que me deste, mas nada melhor do que estar com a mente mais aberta para tal tarefa. Resolvi o problema do meu modo deixando o código assim:

 

public function insert(){
//Verifica se há registros, e se houver, segue com a inserção
$linhas="SELECT * FROM $this->table";
$linhas2=DB::prepare($linhas);
$linhas2->execute();
if($linhas2->rowCount() == 0):
$sql = "INSERT INTO $this->table (lembrete, dirigente, integrantes, festividade) VALUES (:lembrete, :dirigente, :integrantes, :festividade)";
$stmt = DB::prepare($sql);
$stmt->bindParam(':lembrete', $this->lembrete);
$stmt->bindParam(':dirigente', $this->dirigente);
$stmt->bindParam(':integrantes', $this->integrantes);
$stmt->bindParam(':festividade', $this->festividade);
//Executa o cadastro
return $stmt->execute();
else:
$msg="Sorry! Já existe informações cadastradas no sistema, sendo possível apenas editá-las ou excluí-las.";
endif;
}
Mas pesquisei sobre o SELECT COUNT e gostei muito de conhecer este comando, o qual estarei me aprofundando em conhecê-lo. Estou muito agradecido, mas por hora, o que fiz, basta! kkkkkkkkkkkkkkkk :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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