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 violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
×

Informação importante

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