Ir para conteúdo
Rodrigo5468

Verificar campos e DB

Recommended Posts

Olá,

 

Estou fazendo um sistema de cadastro em PDO OO.

 

Cadastro.php

public function insert() {
	if(isset($usuario) && isset($nomesobrenome) && isset($email) && isset($senha)) {
		if(empty($usuario) OR empty($nomesobrenome) OR empty($email) OR empty($senha)) {
			echo 'Existe campos vazios.</div>';
		}
	}else {
		$verifica = DB::prepare("SELECT * FROM {$this->table} WHERE usuario=:usuario OR nomesobrenome=:nomesobrenome OR email=:email");
		$verifica->bindValue(':usuario',$this->usuario,PDO::PARAM_STR);
		$verifica->bindValue(':nomesobrenome',$this->nomesobrenome,PDO::PARAM_STR);
		$verifica->bindValue(':email',$this->email,PDO::PARAM_STR);
		$verifica->execute();
		
		if($verifica->rowCount() == 0) {
			$sql  = "INSERT INTO $this->table (usuario, nomesobrenome, email, senha) VALUES (:usuario, :nomesobrenome, :email, :senha)";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':usuario', $this->usuario);
			$stmt->bindParam(':nomesobrenome', $this->nomesobrenome);
			$stmt->bindParam(':email', $this->email);
			$stmt->bindParam(':senha', $this->senha);
			return $stmt->execute();
		}else {
			return false;
		}
	}
}

 

 

register.php

			<?php
				$usuarios = new Usuarios();
				
				if(isset($_POST['cadastrar'])) {
					$usuario					= $_POST['usuario'];
					$nomesobrenome				= $_POST['nomesobrenome'];
					$email						= $_POST['email'];
					$senha						= $_POST['senha'];
					
					$usuarios->setUsuario($usuario);
					$usuarios->setNomesobrenome($nomesobrenome);
					$usuarios->setEmail($email);
					$usuarios->setSenha($senha);
					
					#Insert
					if($usuarios->insert()) {
						echo 'Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>';
					}
				}
			?>

Quando eu registro a conta aparece a seguinte frase "Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.". Mas já existe um cadastro no banco de dados não aparece nenhum erro, informando que já existe o usuário, o nome e sobrenome ou o e-mail. E quando existe campos vazios o script cadastra a conta do mesmo jeito. O que  preciso mudar para corrigir o meu código?

 

 

Obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigo5468, existe muitos problemas no seu código, vou falar apenas do problema em questão e outras basicas
 

public function insert() 
{
  if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
    echo 'Existe campos vazios.</div>'; # Dar echo dentro da classe não é bom!
    return false;
  }

  $stmt = DB::prepare("
    SELECT * 
    FROM {$this->table} 
    WHERE usuario=:usuario 
    OR nomesobrenome=:nomesobrenome 
    OR email=:email"
  );

  $stmt->bindValue(':usuario',$this->usuario,PDO::PARAM_STR);
  $stmt->bindValue(':nomesobrenome',$this->nomesobrenome,PDO::PARAM_STR);
  $stmt->bindValue(':email',$this->email,PDO::PARAM_STR);
  $stmt->execute();

  $usuarioExiste = $stmt->rowCount();

  if($usuarioExiste) {
    return false;
  }

  $sql = "INSERT INTO $this->table (usuario, nomesobrenome, email, senha) 
  VALUES (:usuario, :nomesobrenome, :email, :senha)";

  $stmt = DB::prepare($sql);
  $stmt->bindParam(':usuario', $this->usuario);
  $stmt->bindParam(':nomesobrenome', $this->nomesobrenome);
  $stmt->bindParam(':email', $this->email);
  $stmt->bindParam(':senha', $this->senha);

  return $stmt->execute();
		
}

# Esses isset não é necessario, já que as propriedades sempre vão existir
# Você esta esquecendo o  $this-> na validação do campos preenchido
# Você não precisa desse monte de if, else
# Quando quiser encerrar o codigo, use o return

 

12 horas atrás, Rodrigo5468 disse:

$verifica = DB::prepare("SELECT * FROM {$this->table} WHERE usuario=:usuario OR nomesobrenome=:nomesobrenome OR email=:email");

 

Não sei qual é a sua regra de negócio, mas esta certo de que deseja um OR, e não um END?

 

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pow cara!!! O código fincou bem simples e funciona perfeitamente.

Você disse "mas esta certo de que deseja um OR, e não um END?" Não entendi muito bem o end, seria and? Estou começando agora, não sei qual é o melhor para usar o or, end ou and. Se poder me dá uma força.

 

echo 'Existe campos vazios.</div>'; # Dar echo dentro da classe não é bom!

Você também escreveu isso no código. Também não acho legal dar echo dentro da classe. Eu queria puxar um echo e colocar as informações na página register.php como posso fazer isso?

Exemplo:

			<?php
				$usuarios = new Usuarios();
				
				if(isset($_POST['cadastrar'])) {
					$usuario					= $_POST['usuario'];
					$nomesobrenome				= $_POST['nomesobrenome'];
					$email						= $_POST['email'];
					$senha						= $_POST['senha'];
					
					$usuarios->setUsuario($usuario);
					$usuarios->setNomesobrenome($nomesobrenome);
					$usuarios->setEmail($email);
					$usuarios->setSenha($senha);
					
					#Insert
					if($usuarios->insert()) {
						echo 'Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>';
					}
                  	#Dar echo aqui falando que existe campos vazios.
                  	#Dar echo aqui falando que algum dado que ele tentou registrar já existe no banco de dados.
				}
			?>

 

 

Obrigado por tudo cara, muito obrigado mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

25 minutos atrás, Rodrigo5468 disse:

echo 'Existe campos vazios.</div>'; # Dar echo dentro da classe não é bom!

Você também escreveu isso no código. Também não acho legal dar echo dentro da classe.

Você pode gerar exceções...

 

Ex dentro do seu contexto:

<?php
public function insert() 
{
	if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {	
		throw new Exception('Existe campos vazios.');
	}
	....

Ai na hora de executar algo +/- assim:

<?php
try {

	$usuario					= $_POST['usuario'];
	$nomesobrenome				= $_POST['nomesobrenome'];
	$email						= $_POST['email'];
	$senha						= $_POST['senha'];
	$usuarios->setUsuario($usuario);
	$usuarios->setNomesobrenome($nomesobrenome);
	$usuarios->setEmail($email);
	$usuarios->setSenha($senha);

	if($usuarios->insert()){
		echo '<div class="success">Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>';
	}
    
} catch (Exception $e) {
	echo '<div class="error">'. $e->getMessage() .'</div>';    
}

 

Ps: foi um exemplo simples, aprofundar é preciso.

 

Leia mais:

http://php.net/manual/pt_BR/language.exceptions.php

 

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Princípio orientado à objeto denominado Tell, don't ask. BasicamenteVocê deve mandar/dizer para que uma classe/objeto faça algo e não perguntar a ela sobre o que, ou se, ela realizou. Exceto se o nome do método é uma pergunta (get, is, has, can, etc..).

 

Em um método denominado insert espera-se que o método insira um registro. Se tudo ocorrer certo, um registro será inserido. Se um registro não foi inserido, algo que não estava esperado ocorreu. Se inesperado ocorreu, é uma exceção.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 horas atrás, Rodrigo5468 disse:

if($usuarios->insert()) { echo 'Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>'; } #Dar echo aqui falando que existe campos vazios. #Dar echo aqui falando que algum dado que ele tentou registrar já existe no banco de dados.


Você esta muito viciado em if, else rsrs (brincadeira)

Melhorando mais um pouco, ficaria assim:

public function insert() 
{
  if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
    return 'Existe campos vazios!';
  }

  $stmt = DB::prepare("
    SELECT * 
    FROM {$this->table} 
    WHERE usuario=:usuario 
    OR nomesobrenome=:nomesobrenome 
    OR email=:email"
  );

  $stmt->bindValue(':usuario',$this->usuario,PDO::PARAM_STR);
  $stmt->bindValue(':nomesobrenome',$this->nomesobrenome,PDO::PARAM_STR);
  $stmt->bindValue(':email',$this->email,PDO::PARAM_STR);
  $stmt->execute();

  $usuarioExiste = $stmt->rowCount();

  if($usuarioExiste) {
    return 'Usuario já existe!';
  }

  $sql = "INSERT INTO $this->table (usuario, nomesobrenome, email, senha) 
  VALUES (:usuario, :nomesobrenome, :email, :senha)";

  $stmt = DB::prepare($sql);
  $stmt->bindParam(':usuario', $this->usuario);
  $stmt->bindParam(':nomesobrenome', $this->nomesobrenome);
  $stmt->bindParam(':email', $this->email);
  $stmt->bindParam(':senha', $this->senha);

  if ($stmt->execute()) {
	return '<div class="success">Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.</div>';
  }

  return 'Falha ao cadastrar!';	
		
}
<?php
        $usuario = $_POST['usuario'];
        $nomesobrenome = $_POST['nomesobrenome'];
        $email = $_POST['email'];
        $senha = $_POST['senha'];
      
        $usuarios->setUsuario($usuario);
        $usuarios->setNomesobrenome($nomesobrenome);
        $usuarios->setEmail($email);
        $usuarios->setSenha($senha);
      
        echo $usuarios->insert();


Note como o uso do return evita o uso de else, e deixa o código mais simples, como da mesma forma em 

echo $usuarios->insert();

Não é necessário o uso de if elseif. Não deixe de ver a ótima dica do  Tell, don't ask que o Gabriel sugeriu

 

5 horas atrás, Rodrigo5468 disse:

Você disse "mas esta certo de que deseja um OR, e não um END?" Não entendi muito bem o end, seria and?


Sim, um and, escrevi errado :)

Por exemplo:
Considere que esse registro existe no banco: joao, joao da silva, joao@joao.com

Se tentar cadastrar joao, joao dos santos, joao@joao.com
Com o OR, sera cadastrado, com o AND não

De uma pesquisa por "logica de programação, operadores logicos"

Editado por EdCesar
Refatoração: Retirado try catch
  • +1 1

Compartilhar este post


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

Você esta muito viciado em if, else rsrs (brincadeira)

Essa técnica pode se enquadrar como 'early return' 

 

o @EdCesar esqueceu de lançar a exceção...


Não faz sentido ter blocos de try sem uso de 

 

throw new Exception('Oppss.. isso não deveria acontecer.');



Tem alguns artigos para exemplificar o uso do early return independente de usar blocos de try/catch

http://blog.alura.com.br/quanto-mais-simples-melhor/

https://softwareengineering.stackexchange.com/a/18473

 

 

 

 

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
47 minutos atrás, gabrieldarezzo disse:

o @EdCesar esqueceu de lançar a exceção...


@gabrieldarezzo,  bem observado, atualizei e retirei o try cath.
Nesse caso caso dele, acho que dar apenas o return com a mensagem de falha ou sucesso, deixa o código mais simples

Tem outras coisas também que é importante tratar, também como:

$nome = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';

ou no PHP 7:

$usuario = $_POST['usuario'] ?? '';

Foge do tópico, mas fica a dica :)

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi tudo por enquanto, mas estou com uma pequena dúvida, por favor me esclareça.

@EdCesarpode perceber que você citou esses dois últimos códigos.

"Tem outras coisas também que é importante tratar, também como:

$nome = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';

ou no PHP 7:

$usuario = $_POST['usuario'] ?? '';

"

 

 

Eu tenho meus três "private" que irei utilizar para mostrar o usuário os dados incorretos, e que ele precisa corrigir para cadastrar no sistema.

private

private $usuario;
private $nomesobrenome;
private $email;

Aqui nesses seguintes códigos eu quero especificar os campos, usarei o código acima de exemplo que você deixou? Eu testei aqui mas não obtive resultados, se poder me deixar um exemplo.

if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
	return 'Existe campos vazios!';
}

#####################

if($usuarioExiste) {
	return 'Usuario já existe!';
}

Eu quero especificar se é o usuário, nomesobrenome ou e-mail que está vazio, ou se algum desses dados já existem. Exemplo:

"O campo usuário está vazio, por favor, preencha!"

"O endereço de e-mail que você forneceu já existe em nosso banco de dados, tente usar outro."

 

 

Muito obrigado por tudo mais uma vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá novamente!

 

Fiz aqui para ter uma validação um pouco melhor, mas acho que estou fazendo errado, pois não está funcionando perfeitamente.

Verificando se existe campos em brancos, e quais deles estão em branco.

if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
	if(empty($this->usuario)) {
		return 'Usuário está em branco.';
	}elseif(empty($this->nomesobrenome)) {
		return 'Nome/Sobrenome está em branco.';
	}elseif(empty($this->email)) {
		return 'E-mail está em branco está em branco.';
	}elseif(empty($this->senha)) {
		return 'Senha está em branco.';
	}else{
		return 'Usuário, Nome/Sobrenome, E-mail, Senha, estão em branco.';
	}
	
	return 'Preencha todos os campos em branco.';
}

Verificando se existe algum campo registrado no banco de dados, e quais deles são.

public function insert() {
	if($this->usuario) {
		return 'Campo Usuário já está cadastrado em nosso banco de dados.';
	}elseif($this->nomesobrenome) {
		return 'Campo Nome/Sobrenome  já está cadastrado em nosso banco de dados.';
	}elseif($this->email) {
		return 'Campo E-mail já está cadastrado em nosso banco de dados.';
	}else{
		return 'Algum desses campos já estão cadastrado em nosso banco de dados: Usuário, Nome/Sobrenome ou E-mail.';
	}
	
	return 'Algum dado que você tentou inserir já consta em nosso banco de dados.';
}

 

 

Quando chega para verificar se a senha está em branco ou não, ele prossegue e cadastra o usuário com senha nula. E a mensagem de erro para verificar se existe algum dado já em nosso banco de dados, ele sempre mostra a opção Usuário. Por favor, como faço para arrumar este pequeno detalhe?

 

 

Obrigado mais uma vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu código que está com a complexidade ciclomática muito alta. Use early returns para reduzí-la.

 

Quanto a validação, tudo que não permitir a persistência no SGBD é uma exceção, ou seja:

if($this->usuario) {
    throw new RuntimeException('Campo Usuário já está cadastrado em nosso banco de dados.');
}

if($this->nomesobrenome) {
    throw new RuntimeException('Campo Nome/Sobrenome  já está cadastrado em nosso banco de dados.');
}

/** demais validações **/

 

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

o

1 hora atrás, Rodrigo5468 disse:

E como eu posso diminuir ou até tirar a complexidade ciclamática?

 

O me chara disse no post ué:

5 horas atrás, Gabriel Heming disse:

Use early returns para reduzí-la.

 

 

Chegou a abrir os links abaixo?

Em 2017-5-17 at 17:29, gabrieldarezzo disse:

Tem alguns artigos para exemplificar o uso do early return independente de usar blocos de try/catch

http://blog.alura.com.br/quanto-mais-simples-melhor/

https://softwareengineering.stackexchange.com/a/18473

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu já fiz os try/catch e apliquei os exemplos dos links.

Verificar se existe campos em brancos, e quais são

if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
	if(empty($this->usuario))
		return 'Campo Usuário em branco.';
	
	if(empty($this->nomesobrenome))
		return 'Campo Nome/Sobrenome em branco.';
	
	if(empty($this->email))
		return 'Campo E-mail em branco';
	
	if(empty($this->senha))
		return 'Campo Senha em branco.';
}

Verificar quais campos estão cadastrado no banco de dados, e quais são

if($usuarioExiste) {
	if($this->usuario)
		return 'Usuario já existe!';
	
	if($this->nomesobrenome)
		return 'Nome/Sobrenome já existe!';
	
	if($this->email)
		return 'E-mail já existe!';
}

 

Para verificar se os campos em branco, ele funciona perfeitamente, mas quando deixa o campo senha em branco ele não apresenta o erro. E o usuário sempre, sempre mostra o primeiro return que é "Usuário já existe". Estou pesquisando em diversos fóruns, artigos, youtube para conseguir arrumar mas não consigo. Se poder me explicar um pouco mais eu agradeço de coração.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigo5468, legal que você esta se esforçando! Melhorando um pouco mais o seu código, na questão das validações, poderia ficar assim:

 

Para a questão dos campos inválidos

Troque:

if(empty($this->usuario) OR empty($this->nomesobrenome) OR empty($this->email) OR empty($this->senha)) {
	if(empty($this->usuario))
		return 'Campo Usuário em branco.';
	
	if(empty($this->nomesobrenome))
		return 'Campo Nome/Sobrenome em branco.';
	
	if(empty($this->email))
		return 'Campo E-mail em branco';
	
	if(empty($this->senha))
		return 'Campo Senha em branco.';
}

Por isso:

$propriedades = get_class_vars(get_class($this)); 

if (!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
  throw new \Exception('E-mail invalido!');
}

foreach ($propriedades as $propriedade => $valor) {
  if (empty($this->$propriedade)) {
    throw new \Exception('o campo '. $propriedade . ' não foi preenchido!');
  }
}


Se na sua classe você tem mais propriedades do que usuario, nomesobrenome,email e senha, então troque

$propriedades = get_class_vars(get_class($this)); 

do código acima, por:
 

$propriedades = [
  'usuario' => $this->usuario, 
  'nomesobrenome' => $this->nomesobrenome, 
  'email' => $this->email, 
  'senha' => $this->senha
];

 

Para a validação dos dados existentes
 

Troque esse trecho:

$usuarioExiste = $stmt->rowCount();

  if($usuarioExiste) {
    return 'Usuario já existe!';
  }

Por esse:

$resultado = $stmt->fetch(\PDO::FETCH_ASSOC);

$dadosJaExistem = array_intersect([
  'usuario' => $this->usuario, 
  'nomesobrenome' => $this->nomesobrenome, 
  'email' => $this->email], 
  $resultado
);

if ($dadosJaExistem) {
   $mensagem = 'O(s) valor(es): ' . implode(',', $dadosJaExistem)  . ' ja existem no banco de dados, por favor escolha outro(s)';
   throw new Exception($mensagem);
}

 

  • +1 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 2017-5-17 at 18:16, EdCesar disse:
Em 2017-5-17 at 17:29, gabrieldarezzo disse:

o @EdCesar esqueceu de lançar a exceção...


@gabrieldarezzo,  bem observado, atualizei e retirei o try cath.
Nesse caso caso dele, acho que dar apenas o return com a mensagem de falha ou sucesso, deixa o código mais simples

Tem outras coisas também que é importante tratar, também como:


$nome = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';

ou no PHP 7:


$usuario = $_POST['usuario'] ?? '';

Foge do tópico, mas fica a dica :)

 

Gostei.  Eu vou estudar isso também.  Bom domingo a todos.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tive alguns problemas pessoais e não conseguir acessar o fórum.

 

Campos em brancos:

uQkghDO.png

Usando o seguinte código dá esse erro.

$propriedades = [
	'usuario' => $this->usuario, 
	'nomesobrenome' => $this->nomesobrenome, 
	'email' => $this->email, 
	'senha' => $this->senha
];
			
if(!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
	throw new \Exception('E-mail invalido!');
}
			
foreach($propriedades as $propriedade => $valor) {
	if(empty($this->$propriedade)) {
		throw new \Exception('o campo '. $propriedade . ' não foi preenchido!');
	}
}

Mas se eu trocar o trecho "throw new \Exception" por "return" o código funciona. Mas se eu preencher todos os campos, e deixar a senha em branco ele insere um cadastro no banco de dados com a senha em branco. Não dá erro nenhum.

 

 

Já a baste para identificar quais os campos existem já cadastros no banco de dados sempre da um erro que o e-mail está invalido. Já tentei substituir o "throw new Exception" pelo "return" e colocar uma barra invertida no Exception mas nada.

 

Já pesquisei em diversões fóruns, vídeos mas nada não tô conseguindo consertar o código. Poderia me explicar como eu posso conserta-lo?

 

 

Desde já obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta certo, isso é um erro esperado, que só vai ocorrer quando você enviar um e-mail invalido, provavelmente você testou com um e-mail que não contem um formato valido, certo? Para parar de exibir essa tela laranja, e exibir apenas a mensagem, você precisa colocar um try/catch no  $usuarios->insert()

Pare um pouco para entender melhor como funciona os tratamentos de erros, validações, calculo de interseção entre outras coisas que foram colocadas aqui,  perca umas duas horinhas e ganhe dezenas! Tentar "aprender na força" não é um bom caminho, já fiz muito isso, não faço mais :)

Feito isso, estamos aqui para auxiliar. Não deixa de ver:

http://php.net/manual/pt_BR/function.array-intersect.php
http://php.net/manual/en/filter.filters.validate.php
http://php.net/manual/pt_BR/language.exceptions.php

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe a demora, estava sem internet.

@EdCesar eu li todos os links e mais alguns por fora e, cheguei a conclusão que o código está correto (eu acho).

 

uQkghDO.png

Esse erro está falando que o e-mail é invalido, está certo. Mas esse código ele ta em

classes/

 

E tenho o index que deveria aparecer esse erro como um diálogo (pop-up), informando que algum desses dados são inválidos ou já existem no banco de dados.

 

Eu preciso ignorar esse erro, para ele não redirecionar para essa tela e colocar em uma div, como um diálogo. Preciso puxar o erro para o index. Como eu posso fazer isso? Já pesquisei, tentei usar um try/catch e puxar a variável $erro para o index, assim mostrando o erro diagnosticado no arquivo Usuários.php da pasta classes/, mas não conseguir, poderia me dá uma força? Desde já muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites
58 minutos atrás, Rodrigo5468 disse:

[...], tentei usar um try/catch e puxar a variável $erro para o index, assim mostrando o erro diagnosticado no arquivo Usuários.php da pasta classes/, mas não conseguir[...]

 

Mostre-nos como fez e não deu certo.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Estrutura do Projeto.

4FvM6lI.png

 

Usuarios.php

		public function insert() {
			try {
				$propriedades = [
					'usuario' => $this->usuario, 
					'nomesobrenome' => $this->nomesobrenome, 
					'email' => $this->email, 
					'senha' => $this->senha
				];
				
				if(!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
					throw new \Exception('E-mail invalido!');
				}
				
				foreach($propriedades as $propriedade => $valor) {
					if(empty($this->$propriedade)) {
						throw new \Exception('o campo '. $propriedade . ' não foi preenchido!');
					}
				}
			}catch(Exception $e) {
				$error_message = $e->getMessage();
			}
			
			$stmt = DB::prepare("SELECT * FROM {$this->table} WHERE usuario=:usuario OR nomesobrenome=:nomesobrenome OR email=:email");
			$stmt->bindValue(':usuario',$this->usuario,PDO::PARAM_STR);
			$stmt->bindValue(':nomesobrenome',$this->nomesobrenome,PDO::PARAM_STR);
			$stmt->bindValue(':email',$this->email,PDO::PARAM_STR);
			$stmt->execute();
			
			$resultado = $stmt->fetch(\PDO::FETCH_ASSOC);
			
			$dadosJaExistem = array_intersect([
				'usuario' => $this->usuario, 
				'nomesobrenome' => $this->nomesobrenome, 
				'email' => $this->email], 
				$resultado
			);
			
			if($dadosJaExistem) {
				$mensagem = 'O(s) valor(es): ' . implode(',', $dadosJaExistem)  . ' ja existem no banco de dados, por favor escolha outro(s)';
				throw new Exception($mensagem);
			}
			
			$sql = "INSERT INTO $this->table (usuario, nomesobrenome, email, senha) VALUES (:usuario, :nomesobrenome, :email, :senha)";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':usuario', $this->usuario);
			$stmt->bindParam(':nomesobrenome', $this->nomesobrenome);
			$stmt->bindParam(':email', $this->email);
			$stmt->bindParam(':senha', $this->senha);
			
			if ($stmt->execute()) {
				return 'Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.';
			}
			
			return 'Falha ao cadastrar!';
		}

 

index.php

			<?php
				$usuarios = new Usuarios();
				
				if(isset($_POST['cadastrar'])) {
					$usuario = $_POST['usuario'];
					$nomesobrenome = $_POST['nomesobrenome'];
					$email = $_POST['email'];
					$senha = $_POST['senha'];
					
					$usuarios->setUsuario($usuario);
					$usuarios->setNomesobrenome($nomesobrenome);
					$usuarios->setEmail($email);
					$usuarios->setSenha($senha);
					
					echo $usuarios->insert();
					
					if(isset($error_message)) {
						echo $error_message;
					}
				}
			?>

 

 

Já tentei de tudo e ainda estou tentando. Obrigado mais uma vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que toda Exception deve estar isolada dentro de um bloco try{}.

 

 

Errado:

throw new Exception('Opss.. aqui tem coisa errada');

Certo:

try {
	throw new Exception('Opss.. aqui tem coisa errada');
}
 catch(Exception $ex){
	$ex->getMessage();
	die();
}

 

 

Uma opção para cobrir 100% do seu try/exception:

 

<?php

public function insert() {
	
	$propriedades = [
		'usuario' => $this->usuario, 
		'nomesobrenome' => $this->nomesobrenome, 
		'email' => $this->email, 
		'senha' => $this->senha
	];
	
	if(!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
		throw new \Exception('E-mail invalido!');
	}
	
	foreach($propriedades as $propriedade => $valor) {
		if(empty($this->$propriedade)) {
			throw new \Exception('o campo '. $propriedade . ' não foi preenchido!');
		}
	}
	

	$stmt = DB::prepare("SELECT * FROM {$this->table} WHERE usuario=:usuario OR nomesobrenome=:nomesobrenome OR email=:email");
	$stmt->bindValue(':usuario',$this->usuario,PDO::PARAM_STR);
	$stmt->bindValue(':nomesobrenome',$this->nomesobrenome,PDO::PARAM_STR);
	$stmt->bindValue(':email',$this->email,PDO::PARAM_STR);
	$stmt->execute();

	$resultado = $stmt->fetch(\PDO::FETCH_ASSOC);

	$dadosJaExistem = array_intersect([
		'usuario' => $this->usuario, 
		'nomesobrenome' => $this->nomesobrenome, 
		'email' => $this->email], 
		$resultado
	);

	if($dadosJaExistem) {
		$mensagem = 'O(s) valor(es): ' . implode(',', $dadosJaExistem)  . ' ja existem no banco de dados, por favor escolha outro(s)';
		throw new Exception($mensagem);
	}

	$sql = "INSERT INTO $this->table (usuario, nomesobrenome, email, senha) VALUES (:usuario, :nomesobrenome, :email, :senha)";
	$stmt = DB::prepare($sql);
	$stmt->bindParam(':usuario', $this->usuario);
	$stmt->bindParam(':nomesobrenome', $this->nomesobrenome);
	$stmt->bindParam(':email', $this->email);
	$stmt->bindParam(':senha', $this->senha);

	if ($stmt->execute()) {
		return 'Conta registrada com sucesso! Você deverá confirmar a conta em seu endereço de e-mail.';
	}

	return 'Falha ao cadastrar!';
}



$usuarios = new Usuarios();

if(isset($_POST['cadastrar'])) {
	
	
	$usuario = $_POST['usuario'];
	$nomesobrenome = $_POST['nomesobrenome'];
	$email = $_POST['email'];
	$senha = $_POST['senha'];
	
	$usuarios->setUsuario($usuario);
	$usuarios->setNomesobrenome($nomesobrenome);
	$usuarios->setEmail($email);
	$usuarios->setSenha($senha);
	
	try {
		echo $usuarios->insert();	
	} catch(Exception $ex){
		$ex->getMessage();
		die();
	}
		
		
	
	if(isset($error_message)) {
		echo $error_message;
	}
}

Outro coisa que você pode fazer é tentar isolar o problema.....

 

Ex: está com erro de E-mail?

 

Verificou oq está chegando no parametro ?

-> var_dump($email);die();

 

Fez um teste individual?

Algo simples assim:


$emails = array(
	 'gabrieldarezzo@yahoo.com.br'
	,'darezzo.gabriel@gmail.com'
	,'EmailNaovalido.com'
	,'quasevalido@'
);


foreach($emails as $email){
	if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
		echo "Email: {$email} NOT VALID";
	} else {
		echo "Email: {$email} IS VALID";
	}
	
	echo "\n <br />";
}

 

Enfim vai isolando o problema sempre.

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por rcamu
      Fiz o Select abaixo só que ele não está somando pela coluna correta, onde estou errando?
       
      Na minha estrutura tenho o campo dtConcat e o campo dtConcat2 (essas datas são diferentes uma é para data do pedido e a outra é para a data que efetivou a venda) ele está somando a coluna dtConcat2 mesmo eu colocando no select que quero o mes e ano da coluna dtConcat
       
      SELECT cat.id, cat.nome_vendedor, MONTH (dtConcat) AS mes, YEAR (dtConcat) AS ano, SUM( IF( mov.tipo_venda = 'Atacado', mov.total, 0 ) ) AS Atacado FROM lc_controle AS mov INNER JOIN vendedor AS cat ON cat.id = mov.vendedor where mov.exportado = 'Sim' GROUP BY ano, mes, cat.nome_vendedor ORDER BY nome_vendedor, ano, mes  
    • Por paulo123araujo
      Bom, eu não estou conseguindo conectar com meu banco access.
      Quando eu executo ele sempre cai na mensagem "Banco de dados não encontrado", já verifiquei o php config e o odbc está habilitado.
      Segue o código abaixo:
      <?php $db = $_SERVER["DOCUMENT_ROOT"] ."/db/banco.accdb"; if (!file_exists($db)) { die("Banco de dados não encontrado."); } $dbNew = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=$db; Uid=; Pwd=;"); $sql = "select * from clientes"; $rs = $dbNew->query($sql); while($result = $rs->fetch()) { echo $result[0].": ".$result[1]."<br />"; } ?>  
    • Por WitchMad
      Olá Gente! Se pudessem me ajudar agradeceria bastante!
      Seguinte: Estou precisando cadastrar um valor do INPUT em dois bancos de dados. Onde eu vi a solução acabou não funcionando. Ainda sou um pouco noob em PHP, então se for algo óbvio perdoai
       
      Aqui o arquivo que processa os dados para enviar:
      <?php session_start(); include_once("conexao-alunos.php"); $matricula = filter_input(INPUT_POST, 'matricula', FILTER_SANITIZE_NUMBER_INT); $nome = filter_input(INPUT_POST, 'nome', FILTER_SANITIZE_STRING); $ensino = filter_input(INPUT_POST, 'ensino', FILTER_SANITIZE_STRING); $ano = filter_input(INPUT_POST, 'ano', FILTER_SANITIZE_STRING); $turno = filter_input(INPUT_POST, 'turno', FILTER_SANITIZE_STRING); $nascimento = filter_input(INPUT_POST, 'nascimento', FILTER_SANITIZE_STRING); $situacao = filter_input(INPUT_POST, 'situacao', FILTER_SANITIZE_STRING); $responsavel = filter_input(INPUT_POST, 'responsavel', FILTER_SANITIZE_STRING); $contato = filter_input(INPUT_POST, 'contato', FILTER_SANITIZE_NUMBER_INT); $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); $endereco = filter_input(INPUT_POST, 'endereco', FILTER_SANITIZE_STRING); $cargo = filter_input(INPUT_POST, 'cargo', FILTER_SANITIZE_STRING); $empresa = filter_input(INPUT_POST, 'empresa', FILTER_SANITIZE_STRING); // Aonde eu vi era pra deixar dessa forma na sintaxe "INSERT INTO 'nome da tabela, $nomedobanco'" $result_usuarios = "INSERT INTO 'medio', $dbname (matricula, nome, turno, nascimento, responsavel, contato, email, endereco, cargo, empresa, situacao) VALUES ('$nome', '$turno', '$nascimento', '$responsavel', '$contato', '$email', '$endereco', '$cargo', '$empresa', '$situacao')"; $resultado_usuario = mysqli_query($conn, $result_usuarios); $result_usuarios_tran = "INSERT INTO 'mensalidade', $dbname_tran (matricula) VALUES ('$matricula')"; $resultado_usuario_tran = mysqli_query($conn_tran, $result_usuarios_tran); if (mysqli_insert_id($conn)){ $_SESSION['msg'] = "<p style='color:#00ff2a;'>Usuário Cadastrado com Sucesso</p>"; header("Location: index.php"); } else{ $_SESSION['msg'] = "<p style='color:red;'>Falha ao Cadastrar Usuário</p>"; header("Location: cad_aluno.php"); } ?> E aqui o arquivo de conexão:
      <?php $servidor = "localhost"; $usuario = "root"; $senha = ""; $dbname = "medio"; $conn = mysqli_connect($servidor, $usuario, $senha, $dbname); ?> <?php $dbname_tran = "transacoes"; $conn_tran = mysqli_connect($servidor, $usuario, $senha, $dbname_tran); ?>  
       
    • Por Augusto Assad
      Tudo bom pessoal ?
       
      Sou novo no fórum e preciso de uma ajuda. Precisei criar um banco de dados para armazenar requerimentos de pedidos de alunos. Tipo: histórico escolar, certidão reg. matrícula e etc...
        Montei as tabelas, fiz os relacionamentos e me deparei com o seguinte problema:
      Criei uma tabela chamada tbmatricula onde armazeno as matrículas dos alunos por ano de ingresso. Ex.: 2016.1.00254.11 ... sendo a restrição: um nº matrícula vinculado a 1 aluno por curso.
      Criei uma outra tabela onde armazeno os nomes dos alunos (tbnomealuno), pois um aluno pode ter várias matrículas diferentes em cursos que já tenha feito.
       
      Aí ocorreu o seguinte:
      Inicialmente para testar eu populei as duas tabelas com dados que eu já tinha. Até aí tudo bem pq ficou  por exemplo o id 11 da tabela tbmatricula vinculado com o id 11 da tabela tbnomealuno (2016.1.00254.11 -> é o João Roberto da Silva).
       
      Agora preciso fazer um insert para adicionar aproximadamente 50000 matrículas  x nome de alunos . Sei que posso usar o insert ignore e evitar as duplicações de nº de matrículas. Mas aí surge um problema, pois tenho tabelas diferentes na qual o id de uma não ficará mais alinhado com o id da outra (ex. id 11 nº de matrícula 2016.1.00254.11 pertence a João Roberto da Silva que agora é id 13 na tbnomealuno).
       
      Depois deste texto longo faço a pergunta:
       
      Existe a possibilidade de vincular o nº matrícula  ao nome do aluno sendo que este nome estará em posição diferente na sua respectiva tabela? Porque quando eu fizer um select ou query buscando o nome do aluno,  a matrícula tem de corresponder ao aluno pesquisado.
       
      CREATE TABLE `tbnomealuno` (
        `idnomealuno` int(11) NOT NULL AUTO_INCREMENT,
        `nomealuno` varchar(70) DEFAULT NULL,
        PRIMARY KEY (`idnomealuno`)
      ) ENGINE=InnoDB AUTO_INCREMENT=24964 DEFAULT CHARSET=utf8
       
      CREATE TABLE `tbmatricula` (
        `idmatricula` int(11) NOT NULL AUTO_INCREMENT,
        `matricula` varchar(15) DEFAULT NULL,
        `id_nomealuno` int(11) DEFAULT NULL,
        `id_sitmatricula` int(11) DEFAULT NULL,
        PRIMARY KEY (`idmatricula`),
        KEY `FK_tbmatricula_tbnomealuno` (`id_nomealuno`),
        KEY `idx_tbmatricula_matricula` (`matricula`),
        KEY `FK_tbmatricula_tbsituacaomatricula` (`id_sitmatricula`),
        CONSTRAINT `FK_tbmatricula_tbnomealuno` FOREIGN KEY (`id_nomealuno`) REFERENCES `tbnomealuno` (`idnomealuno`),
        CONSTRAINT `FK_tbmatricula_tbsituacaomatricula` FOREIGN KEY (`id_sitmatricula`) REFERENCES `tbsituacaomatricula` (`idsitmatricula`)
      ) ENGINE=InnoDB AUTO_INCREMENT=49684 DEFAULT CHARSET=utf8
       
      obrigado e desculpe o texto longo
       
       
       
       
    • Por Junior Junior
      Olá eu tenho tentado criar uma plantaforma que faça login e registro com php mysqli e ajax porém toda vez q tento fazer login ja com um usuario cadastro no banco de dados ele não funciona aparece que ta dando erro, porém não identifiquei o erro, e o registro também alguém poderia me ajudar a desenvolver?
      meu arquivo valida para login;
       
      meu arquivo validareg.php valida o registro:
      arquivo formulario do registro:
      parte do arquivo de login: 
      e por fim o ajaxlogin que faz a função ajax
       
×

Informação importante

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