Ir para conteúdo
Fórum Script Brasil
  • 0

Classe: um <form> para login e também para alterar a senha


Frank K Hosaka

Pergunta

Usando o método da tentativa e erro, estou mudando o meu projeto PHP para o projeto Classe.

No antigo projeto, eu tinha os arquivos login.php, alterarSenha.php, sair.php. Estudando as classes, consegui diminuir o serviço para dois arquivos: o login.php e loginView.php, assim:

arquivo config.php
<?php
session_start();

date_default_timezone_set('America/Sao_Paulo');

$baseDir = $_SERVER['SERVER_NAME'] === 'frank.com' ? 
    $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/Frank/';

defined('HOST') || define('HOST', 'localhost');
defined('DBNAME') || define('DBNAME', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? 'Diario' : 'diario');
defined('USER') || define('USER', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? 'Root' : 'root');
defined('PASSWORD') || define('PASSWORD', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? '1234' : '');
defined('lctoBaixaEstoque') || define('lctoBaixaEstoque',12234);
defined('lctoAcertoMais') || define('lctoAcertoMais',12235);
defined('lctoAcertoMenos') || define('lctoAcertoMenos',12531);
defined('diaAcerto') || define('diaAcerto','2024-06-30');

spl_autoload_register(fn ($class)
     => require str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php');

class Conexao
{
    private static $pdo;

    public static function instancia()
    {
        if(!self::$pdo)
        {
            self::$pdo=new PDO("mysql:host=".HOST.";dbname=".DBNAME,USER,PASSWORD);
        }
        return self::$pdo;
    }

    function delete($sql)
    {
        return $this->instancia()->query("delete from $sql");
    }
    
    function exec($sql)
    {
        return $this->instancia()->query($sql);
    }
    
    public function insert($sql)
    {
        return $this->instancia()->query("insert into $sql");
    }
    
    function select($sql)
    {
        $stmt=$this->instancia()->query("select $sql");
        return $stmt->fetchAll(PDO::FETCH_OBJ);
    }
    
    function update($sql)
    {
        return $this->instancia()->query("update $sql");
    }
        
}

function apuracao($dia) 
{
    $ano=date('Y',strtotime($dia));
    $mes=date('m',strtotime($dia));
    $mesVetor=['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho',
        'Agosto','Setembro','Outubro','Novembro','Dezembro'];
    $apuracao=$mesVetor[$mes-1] . " de $ano";
    $primeiroDia="$ano-$mes-01";
    $ultimoDia=date('Y-m-t',strtotime($primeiroDia));
    return json_decode(json_encode(['apuracao'=>$apuracao,'primeiroDia'=>$primeiroDia,
        'ultimoDia'=>$ultimoDia]));
}

function aspas($bling) 
{
    $primeiroCaractere=$bling[0];
    $ultimoCaractere=$bling[-1];
    if($primeiroCaractere==='"' && $ultimoCaractere==='"') 
    {
        $bling=substr($bling,1,-1);
        return str_replace('""','"',$bling);
    }
}

function dec($value) 
{
    return ($value) ? number_format($value,2,',','.') : null;
}

function deca($num) 
{   
    $value=str_replace(".","",$num); 
    return str_replace(",",".",$value);
}

function decv($num) 
{   
    return str_replace(".",",",$num);
}

function fmt($date) 
{ 
    return date('d/m/y',strtotime($date));
}

function fmt2($data) 
{
    return date('m/Y',strtotime($data));
}

function fmt3($data) 
{
    return date('d/m',strtotime($data));}

function pvenda($custo,$margem) 
{
    $calculo=intval($custo*(1+$margem/100)*100)/100;
    $fracao=$calculo-intval($calculo);
    if ($fracao < 0.09) 
    {
        $pvenda=intval($calculo);
    } else {
        if ($fracao <= 0.59) 
        {
            $pvenda=intval($calculo)+0.5;
        } else {
            $pvenda=intval($calculo)+1;
        }
    }		
    return dec($pvenda);
}

function view($arquivo, $array = null)
{
    if (!is_null($array))
    {
        foreach ($array as $var => $value)
        {
            ${$var} = $value;
        }
    }
    ob_start();
    include $arquivo . ".php";
    ob_flush();
}

?>

<!DOCTYPE html>
<html lang="en">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Projeto PHP</title>
<style>
@media (min-width: 768px) { main, header {width: 25%;margin: auto} }
@media (max-width: 767px) { main, header {width: 75%;margin: auto} }
a {color:blue;text-decoration:none}
a:hover {color:black;}
form {margin:0}
.linha {line-height:0px}
summary{list-style:none}
td {white-space: nowrap}
</style>
<body class="bg-body-tertiary">
  
arquivo index.php
<?php 
ini_set('display_errors', 1);
require 'config.php';
$rota='Login_login';
if($_GET)
{
    if(strpos(key($_GET),"_")==0)
    {
        exit;
    }
    $rota=isset($_GET) ? key($_GET) : $rota;
}
$segmentos=explode('_',$rota);
$nomeControle=$segmentos[0] ?? 'Login';
$metodo=$segmentos[1] ?? 'login';
$parametro=$segmentos[2] ?? null;
$controle=new $nomeControle();
$controle->$metodo($parametro);

arquivo login.php
<?php 
class Login
{
    public function alterarSenha()
    {
      return view('loginView',
          ['mensagem'=>null,'titulo'=>'Alterar senha']);
    }

    public function login()
    {
      if(!isset($_SESSION['nome']))
      {
        return view('loginView',
          ['mensagem'=>null,'titulo'=>'Projeto Classe']);
      } else {
		return view('menuView');
	  }
    }

    public function sair()
    {
      session_destroy();
      return view('loginView',
        ['mensagem'=>null,'titulo'=>'Projeto Classe']);
    }

    public function senhaAlterada()
    {
      $senhaAlterada=$_POST['senhaAlterada'];
      $hash=password_hash($senhaAlterada,PASSWORD_BCRYPT,['cost'=>12]);
      $id=$_SESSION['id'];
      (new Conexao)->update("tbusuarios set senha='$hash' where id=$id");
      return view('loginView',
        ['mensagem'=>null,'titulo'=>'Projeto Classe']);
    }

    public function verificar()
    {
      $email=$_POST['email'];
      $senha=$_POST['senha'];
      $usuario=(new Conexao)->select("* from tbusuarios where email='$email'");
      if(!$usuario)
      {
        return view('loginView',
          ['mensagem'=>'Email inválido!','titulo'=>'Projeto Classe']);
      }
      $confirmar=$usuario[0]->senha;
      $validaSenha=password_verify($senha,$confirmar);
      if(!$validaSenha) 
      {
        return view('loginView',
          ['mensagem'=>'Senha inválida!','titulo'=>'Projeto Classe']);
      }
      $_SESSION['id']=$usuario[0]->id;
      $_SESSION['nome']=$usuario[0]->nome;
      return view('menuView');
    }
}

arquivo loginView.php
<div style="height:150px"></div> <!--empurrar o form para o meio da tela-->
<main>
    <?php if($mensagem): ?>
    <div class="alert alert-success"><?=$mensagem?></div>
    <?php 
    endif;
    $action=($titulo=="Alterar senha") ? "?Login.senhaAlterada" : "?Login.verificar";
    ?>
    <form method=post action=<?=$action?>>
        <h1 class="h3 mb-3 fw-normal"><?=$titulo?></h1>
        <div class="form-floating">
        <input type="email" class="form-control" name=email autofocus>
        <label>Email</label>
        </div>
        <div class="my-1"></div>
        <div class="form-floating">
        <?php $chave=($titulo=="Alterar senha") ? "senhaAlterada" : "senha"; ?>
        <input type="password" class="form-control"
            name=<?=$chave?> required ondblclick="this.type='text'">
        <label>Duplo clique para ver a Senha</label> <!--Google Chrome não mostra o olho-->
        </div>
        <div class="my-3"></div>
        <button class="w-100 btn btn-lg btn-primary" type="submit">Entrar</button>
    </form>
</main>

arquivo menuView.php
<header class="navbar navbar-light sticky-top bg-light flex-md-nowrap p-0"> 
  Classe                                       
  <div class=dropdown>
    <button type=button class="btn btn-outline-primary dropdown-toggle" data-bs-toggle=dropdown id=btmenu>
      Menu
    </button>
    <ul class="dropdown-menu">
      <?php if($_SESSION['id']==1): ?>
      <li><a class=dropdown-item href=?Diario.inicio>Diário</a></li>
      <li><a class=dropdown-item href=?Balancete.inicio>Balancete</a></li>
      <li><a class=dropdown-item href=?Pagar.inicio>Pagar</a></li>
      <li><a class=dropdown-item href=?Outros.inicio>Outros</a></li>
      <?php endif; ?>
      <li><a class=dropdown-item href=?Orcamento.inicio>Orçamento</a></li>
      <li><a class=dropdown-item href=?Pessoa.inicio>Pessoa</a></li>
      <li><a class=dropdown-item href=?Produto.inicio>Produto</a></li>
      <li><a class=dropdown-item href=?Venda.inicio>Relatório de Venda</a></li>
      <li><a class=dropdown-item href=?MercadoPago.inicio>Mercado Pago</a></li>
    </ul>
  </div>
  <div class="dropdown">
  <button class="btn btn-outline-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
  <?=$_SESSION['nome']?>
  </button>
  <ul class="dropdown-menu">
    <li><a class=dropdown-item href=?Login.sair>Sair</a></li>
    <li><a class=dropdown-item href=?Login.alterarSenha>Alterar senha</a></li>
  </ul>
  </div>
</header>

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...