Ir para conteúdo

POWERED BY:

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 ILR master
      Tudo bem pessoal?
       
      No código abaixo, estou fazendo uma consulta nas tabelas, banners e banners_referencia
      Meu objetivo é trazer resultados com valores iguais ao nome da cidade declarada na $cidade ou resultados com a referencia Total.
      O problema é que está trazendo todos os resultados. Tenho 10 linhas, 1 com o nome da cidade e duas com o valor Total, então o resultado teria que ser de apenas 3 linhas, mas mostra tudo.
       
      $banner = "SELECT A.*, B.* FROM banners A, banners_referencia B WHERE B.cod_referencia = A.cod_referencia AND A.cidade = '$cidade' OR B.referencia = 'Total' ORDER BY RAND()";
      $banner = mysqli_query($conexao, $banner) or die ("Banner não encontrado");
      while($busca= mysqli_fetch_array($banner)){
          print $busca['cidade'].'<br>';
      };
       
      Alguém consegue me ajudar?
    • Por Rafael_Ferreira
      Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha. 
       
       
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
×

Informação importante

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