Ir para conteúdo

Arquivado

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

Rodrigo5468

Login

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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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).

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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. 

Compartilhar este post


Link para o post
Compartilhar em outros 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();
		}
	}

 

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
×

Informação importante

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