Jump to content

Recommended Posts

Olá.

 

Estou fazendo um sistema de cadastro e login, está funcionando quais perfeitamente. Porem tem alguns erros que eu não consigo resolver, já procurei na internet mas não achei nada relevante. Poderia me ajudar?

Usuarios.php

<?php
	require_once 'Crud.php';
	
	class Usuarios extends Crud {
		protected $table = 'usuarios';
		
		private $usuario;
		private $nomesobrenome;
		private $email;
		private $senha;
		
		public function setUsuario($usuario) {
			$this->usuario = $usuario;
		}
		
		public function setNomesobrenome($nomesobrenome) {
			$this->nomesobrenome = $nomesobrenome;
		}
		
		public function setEmail($email) {
			$this->email = $email;
		}
		
		public function setSenha($senha) {
			if(!empty($senha)) {
				$options = [
					'cost'	=> 11,
				];

				$this->senha = password_hash($senha, PASSWORD_BCRYPT, $options);
				
				if(password_verify($senha, $this->senha)) {
					return true;
				}
			}
			
			return false;
		}
		
		public function insert() {
			$propriedades = [
				'usuario' => $this->usuario, 
				'nomesobrenome' => $this->nomesobrenome, 
				'email' => $this->email, 
				'senha' => $this->senha
			];
			
			if(strlen($this->senha) < 8) {
				return('A sua senha precisa ter pelo menos 8 caracteres.');
				exit();
			}
			
			if(!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
				return('E-mail invalido.');
				exit();
			}
			
			foreach($propriedades as $propriedade => $valor) {
				if(empty($this->$propriedade)) {
					return('O campo '.$propriedade.' não foi preenchido.');
					exit();
				}
			}
			
			$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) . ' já existem no banco de dados, por favor escolha outro(s).';
				return($mensagem);
				exit();
			}
			
			$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!';
				exit();
			}
			
			return 'Falha ao cadastrar.';
		}
		
		public function login($usuario, $email, $senha) {
			try {
				$stmt = DB::prepare("SELECT id, usuario, email, senha FROM $this->table WHERE usuario = :usuario OR email=:email");
				$stmt->execute(array(':usuario'=>$usuario, ':email'=>$email));
				
				$row = $stmt->fetch(PDO::FETCH_ASSOC);
				
				 if($stmt->rowCount() == 1) {
					 if(password_verify($senha, $row['senha'])) {
						$_SESSION['user_session'] = $row['id'];
						
						return true;
					 }else {
						return false;
					 }
				 }
			}catch(PDOException $e) {
				echo $e->getMessage();
			}
		}
		
		public function is_loggedin() {
			if(isset($_SESSION['user_session'])) {
				return true;
			}
		}
		
		public function redirect($url) {
			header("Location: $url");
		}
		
		public function logout() {
			session_destroy();
			unset($_SESSION['user_session']);
			
			return true;
		}
		
		public function update($id) {
			$sql  = "UPDATE $this->table SET usuario = :usuario, nomesobrenome = :nomesobrenome, email = :email, senha = :senha WHERE id = :id";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':usuario', $this->usuario);
			$stmt->bindParam(':nomesobrenome', $this->nomesobrenome);
			$stmt->bindParam(':email', $this->email);
			$stmt->bindParam(':senha', $this->senha);
			$stmt->bindParam(':id', $id);
			return $stmt->execute();
		}
	}

session.php

<?php
	session_start();
	
	function __autoload($class_name){
		require_once 'classes/' . $class_name . '.php';
	}
	
	$session = new Usuarios();
	
	if(!$session->is_loggedin()) {
		$session->redirect('index');
	}

Esses dois arquivos ficam dentro de uma pasta chamada classe.

 

 

E esse fica no diretório raiz.

login.php

<?php
	session_start();
	
	function __autoload($class_name){
		require_once 'classes/' . $class_name . '.php';
	}
	
	$login = new Usuarios();
	
	if($login->is_loggedin()!="") {
		$login->redirect("index");
	}
	
	if(isset($_POST["btn-entrar"])) {
		$usuario	= strip_tags($_POST["usuario_email"]);
		$email		= strip_tags($_POST["usuario_email"]);
		$senha		= strip_tags($_POST["senha"]);
		
		if($login->Login($usuario,$email,$senha)) {
			$login->redirect("index");
		}else {
			$error = "Detalhes errados.";
		}
	}
?>

index.php

<?php
	require_once("classes/session.php");
	require_once("classes/Usuarios.php");
	
	$auth_user = new Usuarios();
	$user_id = $_SESSION['user_session'];
	
	$stmt = $auth_user->runQuery("SELECT * FROM users WHERE user_id=:user_id");
	$stmt->execute(array(":user_id"=>$user_id));
	
	$userRow=$stmt->fetch(PDO::FETCH_ASSOC);
?>

 

 

 

Os erros que dá são esses...

— Quando vai registrar

f2v1PWg.png

 

— Quando vai fazer o login

bRuWqet.png

 

 

 

Por favor, peço a vocês que me auxilie com os avisos e erros. Muito obrigado.

Share this post


Link to post
Share on other sites

O primeiro erro estoura devido a essa linha: 

 

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

A função array_intersect espera um array no segundo parâmetro, porém o método fetch presente no PreparedStatement retorna um objeto ao invés de um Array.

 

Estoura erro no login porque na linha 8 do arquivo index.php chama-se o método runQuery na instância do objeto de Usuarios, porém esse método não existe.

  • +1 1

Share this post


Link to post
Share on other sites

Uma classe Usuário não é um CRUD. Ela apenas faz uso de um.

 

- A classe X é uma classe Y: usa-se herança;

- A classe Y usa a classe Y: usa-se associação (simples, agregação ou composição).

  • +1 2

Share this post


Link to post
Share on other sites

@FaahWl estou começando a entender, obrigado por me responder.

f2v1PWg.png

Alterei o código e ficou assim, antes:

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

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

Agora o código está assim, agora:

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


//Tentei assim, também
$resultado = array (
	'usuario' => $this->usuario, 
	'nomesobrenome' => $this->nomesobrenome, 
	'email' => $this->email
);

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


//E também tentei assim
$resultado = array (
	'usuario' => $this->usuario, 
	'nomesobrenome' => $this->nomesobrenome, 
	'email' => $this->email
);

$dadosJaExistem = array_intersect($resultado);


//E por fim, também tentei assim
$dadosJaExistem = [
	'usuario' => $this->usuario, 
	'nomesobrenome' => $this->nomesobrenome, 
	'email' => $this->email
];

E sempre, sempre mostrava esse erro agora.

tFT9Kt6.png

No último código faltava que os dados já estavam registrados no banco de dados.

 

A última parte eu não entendi muito bem, sou novo nesse assunto, poderia me ajudar mais?

 

 

@Gabriel Heming tenho um arquivo chamado CRUD, e o Usuarios.php está chamando esse arquivo. Foi isso? Não entendi muito bem, peço a sua colaboração poderia me explicar mais?

 

 

Muito obrigado a todos

Share this post


Link to post
Share on other sites

 

1 minuto atrás, Rodrigo5468 disse:

 

@Gabriel Heming tenho um arquivo chamado CRUD, e o Usuarios.php está chamando esse arquivo. Foi isso? Não entendi muito bem, peço a sua colaboração poderia me explicar mais?

 

 

O código abaixo indica que Usuarios é uma herança de CRUD.

class Usuarios extends Crud {

Entretanto, conforme já mencionado , um não pode ser herança do outro. 

  • +1 1

Share this post


Link to post
Share on other sites

@Gabriel Heming então eu não posso fazer o meu sistema de cadastro e login dessa forma? Se não, posso aproveitar o código até que ponto? E como fazer? Aguardo a sua resposta, obrigado desde já.

 

#Edit

Arquivo Crud.php

<?php
	require_once 'DB.php';
	
	abstract class Crud extends DB {
		protected $table;
		
		abstract public function insert();
		abstract public function update($id);
		
		public function find($id) {
			$sql  = "SELECT * FROM $this->table WHERE id = :id";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':id', $id, PDO::PARAM_INT);
			$stmt->execute();
			return $stmt->fetch();
		}
		
		public function findAll() {
			$sql  = "SELECT * FROM $this->table";
			$stmt = DB::prepare($sql);
			$stmt->execute();
			return $stmt->fetchAll();
		}
		
		public function delete($id) {
			$sql  = "DELETE FROM $this->table WHERE id = :id";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':id', $id, PDO::PARAM_INT);
			return $stmt->execute();
		}
	}

 

Share this post


Link to post
Share on other sites

Essa é uma questão de modelagem. Veja no link abaixo o exemplo de interface para login, separando a responsabilidade entre Login e Usuário.

Lembrando que é apenas uma interface, logo, a implementação dela é por sua conta.

Share this post


Link to post
Share on other sites

Rodrigo,

 

Não é por meio de tentativa e erro que soluciona um problema, você precisa entender o que realmente está acontecendo. Recomendo você estudar na documentação do php.net o que a função faz, e o que os parâmetros esperam. Assim você poderá entender como essa função te ajudará a resolver esse problema de checar se o usuário já existe.

 

http://php.net/manual/pt_BR/function.array-intersect.php

 

Acredito que a função array_diff te ajude melhor, depois experimente pois se houver diferenças entre os arrays significam que não são iguais, mas se não houver diferenças significa que são iguais.

 

É possível também que o registro que esteja inserindo não exista no banco de dados, então quando você dá o SELECT ele não retorna nada. Use esse código para testar:

 

#Mostra o que tem na variável.
var_dump($resultado);

exit;

 

http://php.net/manual/pt_BR/function.array-diff.php

 

Sobre o segundo ponto, estude sobre Orientação a Objetos com PHP, pois classes, objetos, métodos e atributos são conceitos básicos para se desenvolver.

 

Qualquer dúvida comenta ai.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By violin101
      Caros amigos, membros do grupo, saudações...
       
      Se postei minha dúvida na opção errada peço desculpa.
       
      Estou com uma pequena dúvida.
       
      Quando cadastro usuários na MySql utilizo PASSWORD_HASH para criptografar a Senha.
       
      Estou montando uma rotina, onde o usuário que esqueceu sua senha o sistema envia por e-mail a sua senha, mas me deparei com um pequeno problema.
       
      a senha criada pelo usuário, como por exemplo: 12345678 usando o PASSWORD_HASH fica desta forma: $2y$10$ukBckA5D2aSApHwv/GOKi.P/drP.jwAHOK/9SmWIgRxLUE.x9z.ZK
       
      Quando tento enviar a senha para o usuário vai conforme acima, preciso enviar apenas 12345678. Como consigo descriptografar o PASSWORD_HASH ?
       
      Grato,
       
      Cesar
    • By elisandrodceza
      Alguma ideia para pesquisar os $id recebidos por get em um arquivo diferente ? como se percebe no código funcional a baixo, os $id estão duplicados para funções diferente. Quero adicionar eles em outro arquivo para uma melhor organização com as variáveis $id e $client,  mas de uma maneira que possa pesquisar tanto qual é a $id e o $client para ser informado por email quando o client ler o qrcode, quanto se a $id está na lista para ser redirecionado.
       
       
      ARQUIVO auth_code.php
       
      <?php
          $id = $_GET['id'];
          $ip = $_SERVER['REMOTE_ADDR'];
          $browser = $_SERVER['HTTP_USER_AGENT'];
          $to = "suporte@eatech.inf.br";
          $success = false;

              if ($id == '2623F52846F8A03DA4ADFA9392486807') $client = "Card Contato";
              if ($id == '2BDBDDA17456A1060E156BE7A487FC') $client = "Client 1";
              if ($id == 'E7EA229948A4997C2F72219D6A2764') $client = "Client 2";
              if ($id == '07118879907903166B2C3BE7408EFD') $client = "Client 3";
              if ($id == 'FED09C7CC40ACD77A0BDEA57E894A3') $client = "Client 4";
              if ($id == 'C042D3187B52E87D6E6196567101EF') $client = "Client 5";
              if ($id == '7DCD0215BEC8AF587AD886E407A485') $client = "Client 6";
       
          $messagem = "Cliente: $client<br><br>ID: $id<br><br>IP: $ip<br><br>Browser: $browser"; 
          $assunto = "qrCode digitalizado";
          $headers = "MIME-Version: 1.0\n";
          $headers .= "Content-type: text/html; charset=iso-8859-1\n";
          $headers .= "From: $client\n";
          
          $success = mail($to, $assunto, $messagem, $headers);
          
          if ($id == '2623F52846F8A03DA4ADFA9392486807')
              { header('Location: download/contato.vcf');}
       
          else
              if (

              $id == '2BDBDDA17456A1060E156BE7A487FC' # Client 1
              or $id == 'E7EA229948A4997C2F72219D6A2764' # Client 2
              or $id == '07118879907903166B2C3BE7408EFD' # Client 3
              or $id == 'FED09C7CC40ACD77A0BDEA57E894A3' # Client 4
              or $id == 'C042D3187B52E87D6E6196567101EF' # Client 5
              or $id == '7DCD0215BEC8AF587AD886E407A485' # Client 6
              )
              { header('Location: download/index.php?id=' . $id. '.pdf');}
       
          else
              { echo "<script>alert('Este qrCode ainda não está cadastrado no sistema, tente novamente mais tarde!');history.go(-1) </script>";}
      ?>
    • By rfael023
      Bom dia, Pessoal.

      Sou iniciante em PHP e estou trabalhando na integração de uma API. Estou tendo um pouco de dificuldade em índices de um array, segue abaixo o trecho do código:


       
      1 2 3 4 5 6 7 foreach ($Lista as $SMS) {           foreach ($SMS as $key => $value) {                   echo "{$key} : {$value}\n";         } }

      O resultado é o seguinte:

      telefone : 5519333333333
      id : 921

      telefone : 5519344444444
      id : 922

      telefone : 5519555555555
      id : 923

      Ou seja, eu tenho vários arrays com 2 posições dentro de um único array.

      Eu preciso jogar o ID e o Telefone em variáveis, porém ele não está entendendo meu índice:
       
      1 2 3 4 $sms->setTo($SMS['telefone']); echo $sms->getTo(); $sms->setId($SMS['id']); echo $sms->getId();

      Resultado:

      5,52E+12
      Notice: Undefined index: id in C:\xampp1\htdocs\SMSM\exemplos\envio_multiplo_teste.php on line 42
      5,52E+12
      Notice: Undefined index: id in C:\xampp1\htdocs\SMSM\exemplos\envio_multiplo_teste.php on line 42
      5,51198E+12
      Notice: Undefined index: id in C:\xampp1\htdocs\SMSM\exemplos\envio_multiplo_teste.php on line 42
      5,51198E+12
      Notice: Undefined index: id in C:\xampp1\htdocs\SMSM\exemplos\envio_multiplo_teste.php on line 42
      5,53176E+11
      Notice: Undefined index: id in C:\xampp1\htdocs\SMSM\exemplos\envio_multiplo_teste.php on line 42
      5,53176E+11
      Notice: Undefined index: id in C:\xampp1\htdocs\SMSM\exemplos\envio_multiplo_teste.php on line 42

      Alguém consegue me ajudar?

      Agradeço, desde já!
    • By z101
      Sou iniciante, nunca usei PHP na vida e preciso concluir uma tabela de distribuição de frequencia e o polígono de um array, o pouco que vi é muito confuso, alguém aqui já teve que fazer isso antes? 
       
       
    • By MatheusSmidt
      Bom dia,
      Estou precisando de ajuda com o código do formulário de um sistema de cadastro.
      A página é para consulta mas tem a possibilidade de adicionar ou retirar "faltas" de cada profissional cadastrado através de botões simples e também apagar um ou múltiplos profissionais da lista, através de checkbox..
      Essa ações atualizam o banco de dados e já retornam na tela automaticamente.
      O problema é que não fui eu que estruturei o código PHP e não consigo aliar as duas funções que falei anteriormente. Quando consigo fazer funcionar o sistema de adição e redução de faltas, consigo apenas excluir o último nome da lista, mesmo selecionando vários. E quando consigo resolver a parte de excluir vários nomes, não consigo adicionar e reduzir o número de faltas.
       
      Provavelmente é um problema no "WHILE" ou na abertura e fechamento de formulário. Porém não consegui resolver.
      Se alguém conseguir resolver seria ótimo.
      Agradeço desde já. Em anexo envio um print da página para melhor entendimento.
       
       
       
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.