Ir para conteúdo
Frank K Hosaka

O autoload do Omar só funciona no projeto dele

Recommended Posts

O projeto do Omar é outra coisa! O autoload dele funciona como mágica.

Eu copiei a função autoload no meu projeto, e o máximo que eu consegui foi a mensagem "Erro interno no servidor ao encontrar dados cruciais de funcionamento!".

Ou seja, o problema não é o meu notebook e sim o meu projeto. Acho que o autoload quis dizer que o meu projeto é uma grande porcaria:


arquivo /mvc/controles/controle.php
<?php
session_start();
require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/usuários.php';
class controle {
    private $usuários;
    public function __construct(){
        $this->usuários=new usuários();}
    public function login() {
        $mensagem="";
        require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/login.php';}
    public function menu($email,$senha){
        $validaEmail=$this->usuários->validaEmail($email);
        $validaSenha=$this->usuários->validaSenha($email,$senha);
        if(!$validaEmail || !$validaSenha){
            $mensagem="Dados inválidos!";
            require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/login.php';exit;}
        $_SESSION['id']=$this->usuários->id;
        $_SESSION['nome']=$this->usuários->nome;
        $_SESSION['email']=$this->usuários->email;
        require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/menu.php';}
    public function alterarSenha(){
        $mensagem="";
        $email=$_SESSION['email'];
        require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/alterarSenha.php';}
    public function senhaAlterada($senhaAlterada){
        $this->usuários->atualizarSenha($_SESSION['email'],$senhaAlterada);
        return $this->login();}}
$controle=new controle();
if(isset($_POST['email'])){$controle->menu($_POST['email'],$_POST['senha']);}
if(isset($_POST['senhaAlterada'])){$controle->senhaAlterada($_POST['senhaAlterada']);}
if(isset($_GET['sair'])){$controle->login();}
if(isset($_GET['senha'])){$controle->alterarSenha();}

arquivo /mvc/controles/controleDiário.php
<?php
session_start();
require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/diário.php';
require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/funções.php';
class controleDiário {
    private $diário;
    public function __construct(){
        $this->diário=new diário();}
    public function início($dia){
        $consultas=$this->diário->consulta($dia);
        $lçtos=$consultas[0];
        $somaDébito=$consultas[1];
        $somaCrédito=$consultas[2];
        require $_SERVER['DOCUMENT_ROOT']."/mvc/visões/diário.php";exit;}}
$diário=new controleDiário();
if(isset($_POST['novaData'])){$diário->início($_POST['novaData']);}
if(isset($_GET)){$dia=date('Y-m-d');$diário->início($dia);}

arquivo /mvc/index.php
<?php
require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/funções.php';
$controle=new controle();
$controle->login();


arquivo /mvc/modelos/conexão.php
<?php
class conexão {
    private static $pdo;
    public function __construct(){}
    public static function instância(){
        $dbname="mvc";
        $user="root";
        $password="";
        if($_SERVER['SERVER_NAME']=="exemplo.net"){
            $dbname="u123_Hostinger";
            $user="u123_Hostinger";
            $password="JamesBond";}
        if(!self::$pdo){
            self::$pdo=new PDO("mysql:host=localhost;dbname=$dbname",$user,$password);}
        return self::$pdo;}}

arquivo /mvc/modelos/diário.php
<?php
require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/conexão.php';
class diário extends conexão {
    private $pdo;
    public function __construct(){
        $this->pdo=conexão::instância();}
    public function consulta($dia){
        $stmt=$this->pdo->query("select sum(valor) as somaDébito from diário 
            where contaD>0 and dia='$dia'");
        $somaDébito=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['somaDébito'];
        $stmt=$this->pdo->query("select sum(valor) as somaCrédito from diário 
            where contaC>0 and dia='$dia'");
        $somaCrédito=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['somaCrédito'];
        $stmt=$this->pdo->query("select * from diário where
            dia='$dia'");
        return [$stmt->fetchAll(PDO::FETCH_OBJ),$somaDébito,$somaCrédito];}}

arquivo /mvc/modelos/funções.php
<?php
spl_autoload_register(function ($Class) {
    $includeDir = false;
    $findDir = ['controles','modelos','visões'];
    foreach ($findDir as $DirName) {
        if (!$includeDir
            && file_exists(__DIR__ . FindClass($DirName, $Class))
            && !is_dir(__DIR__ . FindClass($DirName, $Class))) {
            include_once (__DIR__ . FindClass($DirName, $Class));
            $includeDir = true;}}
    if (!$includeDir) {
        die("Erro interno no servidor ao encontrar dados 
            cruciais de funcionamento!");}});
function FindClass($dir, $class) {
    return (
        DIRECTORY_SEPARATOR
        . '..'
        . DIRECTORY_SEPARATOR . 'class'
        . DIRECTORY_SEPARATOR . $dir
        . DIRECTORY_SEPARATOR . $class . '.php');}
function dec($value){
    if($value!==null){
    return number_format($value,2,',','.');}}


arquivo /mvc/modelos/usuários.php
<?php
require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/conexão.php';
class usuários extends conexão {
    public $id, $nome, $email; 
    public function validaEmail($email){
        $stmt=conexão::instância()->query("select email from usuários 
            where email='$email'");
        return $stmt->fetch(PDO::FETCH_ASSOC);}
    public function validaSenha($email,$senha){
        $stmt=conexão::instância()->query("select * from usuários 
            where email='$email'");
        $linha=$stmt->fetch(PDO::FETCH_ASSOC);
        $verSenha=$linha['senha'];
        $this->id=$linha['id'];
        $this->nome=$linha['nome'];
        $this->email=$linha['email'];
        return password_verify($senha,$verSenha);}
    public function atualizarSenha($email,$novaSenha){
        $hash=password_hash($novaSenha,PASSWORD_BCRYPT,['cost'=>12]);
        return conexão::instância()->query("update usuários set
            senha='$hash' where email='$email'");}}

arquivo /mvc/visões/alterarSenha.php
<?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/básico.html'; ?>
<style>
html,body {height: 100%}
body {display: flex;align-items: center;padding-top: 40px;padding-bottom: 40px;background-color: #f5f5f5;}
.form-signin {max-width: 330px;padding: 15px;}
.form-signin .form-floating:focus-within {z-index: 2;}
</style>
<body class="text-center">
<main class="form-signin w-100 m-auto">
  <?php if($mensagem!==""): ?>
    <div class="alert alert-success">
    <?=$mensagem?>
    </div>
  <?php endif; ?>
  <form method=post action=/mvc/controles/controle.php>
    <h1 class="h3 mb-3 fw-normal">alterar senha</h1>
    <div class="form-floating">
      <input type="email" class="form-control" value=<?=$email?>>
      <label for="floatingInput">Email</label>
    </div>
    <div class="form-floating">
      <input type="password" class="form-control" id="floatingPassword" name="senhaAlterada" autofocus required>
      <label for="floatingPassword">Senha</label>
    </div>
    <button class="w-100 btn btn-lg btn-primary" type="submit">Entrar</button>
  </form>
</main>


arquivo /mvc/visões/básico.html
<!DOCTYPE html>
<html lang="en">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
    rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" 
    crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" 
    integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" 
    crossorigin="anonymous"></script>
<title>projeto mvc</title>

arquivo /mvc/visões/diário.php
<?php
include $_SERVER['DOCUMENT_ROOT']."/mvc/visões/menu.php"; ?>
<table class='table table-striped'>
Lançamentos do dia
<form method=post action='../controles/controleDiário.php'>
<input type=date name=novaData value=<?=$dia?> onchange=submit()>
</form>
<th>lçto<th>contad<th>contac<th>valor<th>hist
<?php foreach($lçtos as $lçto): ?>
<tr>
<td><?=$lçto->lçto?>
<td><?=$lçto->contad?>
<td><?=$lçto->contac?>
<td class=text-end><?=dec($lçto->valor)?>
<td><?=$lçto->hist?>
<?php endforeach; ?>
<tr><td><td><td><td><?=dec($somaDébito)?><td>Soma dos Débitos
<tr><td><td><td><td class=text-danger><?=dec($somaCrédito)?>
    <td class=text-danger>Soma dos Créditos

arquivo /mvc/visões/login.php
<?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/básico.html'; ?>
<style>
html,body {height: 100%}
body {display: flex;align-items: center;padding-top: 40px;padding-bottom: 40px;background-color: #f5f5f5;}
.form-signin {max-width: 330px;padding: 15px;}
.form-signin .form-floating:focus-within {z-index: 2;}
</style>
<body class="text-center">
<main class="form-signin w-100 m-auto">
  <?php if($mensagem!==""): ?>
    <div class="alert alert-success">
    <?=$mensagem?>
    </div>
  <?php endif; ?>
  <form method=post action=/mvc/controles/controle.php>
    <h1 class="h3 mb-3 fw-normal">projeto mvc</h1>
    <div class="form-floating">
      <input type="email" class="form-control" name=email placeholder="name@example.com" autofocus required>
      <label for="floatingInput">Email</label>
    </div>
    <div class="form-floating">
      <input type="password" class="form-control" id="floatingPassword" placeholder="Senha" name="senha" required>
      <label for="floatingPassword">Senha</label>
    </div>
    <button class="w-100 btn btn-lg btn-primary" type="submit">Entrar</button>
  </form>
</main>


arquivo /mvc/visões/menu.php
<?php 
require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/básico.html';
date_default_timezone_set('America/Sao_Paulo');
?>
<body style="max-width:500px;margin:0 auto">
<header class="navbar navbar-light sticky-top bg-light flex-md-nowrap p-0"> 
projeto mvc                                        
  <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=controleDiário.php>Diário</a></li>
        <?php } ?>
    </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="../controles/controle.php?sair">Sair</a></li>
    <li><a class="dropdown-item" href="../controles/controle.php?senha">Mudar a senha</a></li>
  </ul>
  </div>
</header>

Essa listagem é enorme e o projeto não funciona, mas se você quiser testar, você pode copiar tudo e salvar como c:\wamp64\www\script.txt, e nesse mesmo diretório executar "localhost/scriptin.php" (ele vai criar a pasta mvc e todas pastas e todos os arquivos)
 

arquio ScriptIn.php
<?php
if (!is_dir("mvc")){
    mkdir("mvc");
    mkdir("mvc/controles");
    mkdir("mvc/modelos");
    mkdir("mvc/visões");}
$script=file_get_contents("script.txt");
$ocorrencias=substr_count($script,"arquivo /mvc/");
$substring = "arquivo /mvc/";
$posicao = [];
$posicao[0]=strpos($script,$substring);
for($i=1;$i<=$ocorrencias-1;$i++){
    $posicao[$i]=strpos($script,$substring,$posicao[$i-1]+1);}
$codigo=[];
for($i=0;$i<=$ocorrencias-2;$i++){
    $codigo[]=substr($script,$posicao[$i],$posicao[$i+1]-$posicao[$i]);}
$codigo[]=substr($script,$posicao[$ocorrencias-1],strlen($script)-$posicao[$ocorrencias-1]);
for($i=0;$i<=$ocorrencias-1;$i++){
    $lines=explode("\n",$codigo[$i]);
    $arquivo=trim(substr($lines[0],9));
    $criar=fopen($arquivo,"w");
    $tamanhoNome=strlen($arquivo)+9;
    $conteudo=trim(substr($codigo[$i],$tamanhoNome));
    file_put_contents($arquivo,$conteudo);
    fclose($criar);}
echo "Trabalho encerrado";

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alterei a função FindClass, assim

 

function FindClass($dir, $class) {
    return (
        $_SERVER['DOCUMENT_ROOT']
        . DIRECTORY_SEPARATOR . 'mvc'
        . DIRECTORY_SEPARATOR . $dir
        . DIRECTORY_SEPARATOR . $class . '.php');}

Ele funcionou dentro do index.php, mas na hora que o controle.php invocou new usuários(), o PHP disse que não encontrou essa classe, quando esperava pelo menos mensagem de erro interno. A minha tese é que a rotina do login atualizou a página e mandou para o espaço a engenharia do autoload.

Esse é o mesmo problema que enfrento com as constantes do define. Sendo assim, a minha única saída foi usar sempre endereço absoluto e na hora de invocar uma conexão uso os dados dentro da classe e não tento esconder atrás de uma constante.

 

Eu fiz uma pesquisa sobre a possibilidade de disponibilizar todas as constantes e funções para todos os módulos do PHP e tudo indica que existe uma extensão chamada phpize, mas só está disponível para quem usa Linux.

Compartilhar este post


Link para o post
Compartilhar em outros sites
15 horas atrás, Frank K Hosaka disse:

Eu fiz uma pesquisa sobre a possibilidade de disponibilizar todas as constantes e funções para todos os módulos do PHP e tudo indica que existe uma extensão chamada phpize, mas só está disponível para quem usa Linux.

Nem pensar em usar isso, só vai complicar sua vida ainda mais.

 

Vamos por parte...

DIRECTORY_SEPARATOR é uma constante nativa do PHP ela vem configurado de acordo com a separação padrão do sistema operacional, se a separação usa barra, o valor será "/", se a separação usa contra-barra o valor será "\".

Quase impossível encontrar um SO que não reconheça a separação pela barra comum, ou seja

Isso: 'dirA' . DIRECTORY_SEPARATOR . 'dirB' . DIRECTORY_SEPARATOR . 'dirC' . DIRECTORY_SEPARATOR

É a mesma coisa de usar: 'dirA/dirB/dirC/

Na verdade eu só uso que desse modo ao bater os olhos em cima já vejo que tem algo sendo anexo alí.

 

Você pode usar a constante mágica nativa do PHP  "__DIR__" sempre retorna o diretório do arquivo em  que ela é acionada.

Digamos que eu queira voltar uma diretório atrás e entrar em outro: __DIR__ . '../outro_diretorio'

Ou seja do local atual retroceda e entre em outro, essa é uma das melhores dicas que sempre apresento as pessoas, pois assim fica muito mais fácil apontar locais de arquivos, se começar por onde está arquivo que vai anexar outro evitando qualquer discordância gerada por um de reescrita por htaccess em exemplo no apache.

Citar

Constantes nativas do PHP sempre vão funcionar pois estão ligadas ao código raiz do PHP

 

Notei um problema bem perigoso no código, isso pode gerar uma dor de cabeça para ajeitar no futuro...

Existem em seu código arquivos, diretórios e afins que usam caracteres diacríticos 

20 horas atrás, Frank K Hosaka disse:

require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/usuários.php';

20 horas atrás, Frank K Hosaka disse:

require $_SERVER['DOCUMENT_ROOT'].'/mvc/visões/login.php';}

 

Fora o nome de classes, métodos, funções, objetos etc... que estão com letras acentuadas, isso nunca deve acontecer, vemos incontáveis pessoas que cometem esse erro depois ficam malucas tentando corrigir codificação, acentuações e tais.

É como construir uma casa, se faz o alicerce errado, não adianta mais concerta-lo depois do telhado pronto, é derrubar tudo e reiniciar do zero.

 

  • POO não tem essa de "eu vou fazer do meu jeito porque assim fica melhor", o padrão deve ser LEI INVIOLÁVEL.
  • Classes sempre devem ter nomes iniciadas com letras maiúsculas
  • O nome do arquivo deve ser idêntico ao nome da classe.
  • Métodos de classe devem sempre começar com letras minúsculas e se for mais de uma palavra ficam juntas sendo a segunda começando com letra maiúscula. Expl: meuMetodo()
  • Funções devem começar com letras maiúsculas e segue o mesmo dos métodos de classe ao usar palavras compostas.

 

Voltando ao problema...

Não sei se de fato isso vai interferir na composição do PHP, mas quando tentei aderir tive muitos problemas parecidos, e todo mundo que conheço que usou passou por problemas.

Usar uma barra antes para indicar o caminho de um arquivo, como aqui:

20 horas atrás, Frank K Hosaka disse:

<form method=post action=/mvc/controles/controle.php>

Em teoria o php irá gerar na memória o código do controle.php, por causa da barra ele irá ao topo da arquitetura, antes do index, não sei se é realmente isso

Além do mais você usa uma má prática de sintaxes depurativas que não é usar propriedades de atributos entre aspas, o não uso é apenas para fins de testes de desempenho pois vai forçar muito mais a máquina porque o navegador vai ter que concertar seu erro antes de renderizar o HTML e nem sempre ele corrige corretamente uma vez que há muito código do html mau escrito, assim como tem barras na propriedade que indica o arquivo para onde deve redirecionar o navegador pode chegar a enviar uma informação incoerente ao servidor que terá que entregar a composição da arquitetura completamente bagunçada.

Você pode colocar propriedades fora de aspas?

Pode, mas somente se não utiliza um linguagem de servidor por trás como o PHP, é nos mesmos princípios de escrever uma string dentro de uma função em usar aspas.

 

Algumas coisas que você pode testar:

Dentro da tag <head> do html você pode usar:

<base href="endereco_http_do_website" />

Assim seu html sempre será definido a partir de onde está o arquivo index ou seja a partir da raiz. Não influência diretamente no php, exceto em informações que vem do usuário, como endereço de um arquivo para formulários

Para agilizar esse processo existe uma função no mesmo projeto BaseURI.php que sabe qual o endereço físico real independente do provedor, servidor ou diretórios acessados.

 

15 horas atrás, Frank K Hosaka disse:

Ele funcionou dentro do index.php, mas na hora que o controle.php invocou new usuários(), o PHP disse que não encontrou essa classe, quando esperava pelo menos mensagem de erro interno. A minha tese é que a rotina do login atualizou a página e mandou para o espaço a engenharia do autoload.

Por isso mencionei um possível erro, é que controle.php está sendo gerado e anexo na memória antes do index.php ou seja antes que a função ou constantes existam.

 

Similar a um problema é que se você tem 2 arquivos A & B.

No arquivoA uma variável é criada, depois disso faço o inclusão do arquivoB e esse também vai reconhecer a variável pois ele está na memória depois.

Por outro lado usamos o objeto XMLHttpRequest anexar o arquivoB ao A, nesse caso a variável ainda não existe para ele pois B está logo após o cabeçalho HTTP, mesmo que seja renderizado no HTML depois, o PHP o processa antes que sequer o arquivoA exista.

Uma solução bem simples para essa situação é criar um arquivo coringa, esse irá carregar e definir tudo aquilo que será usado praticamente a todo momento.

Esse arquivo coringa você o requisita novamente sempre quando precisar dos tais dados de uso periódico.

O projeto usa um arquivo coringa como esse:

https://github.com/Spell-Master/wesite_pessoal/blob/master/system/config.php

 

Ou seja sempre que algo for anexo e os dados mais importantes gerados em config.php não existir novamente requisito ele sempre usando a função nativa do PHP require_once.

 

Teste esses conceitos e vamos ver no que ai dar. No entanto acredito que só o uso de um arquivo coringa já deve solucionar o problema.

 

Por fim deixo dicas de softwares bem mais eficientes, são gratuitos e o melhor não possuem propaganda nem rouba dados de sua máquina:

Substituir o wampserver por: https://www.apachefriends.org/pt_br/download.html

Substituir o vscode por: https://netbeans.apache.org/front/main/

Depois que passar a usar nunca mais vai querer usar outros. O netbeans mesmo a melhor IDE que existe, te ajuda muito te puxa a orelha quase sempre quando se tenta inventar moda e escrever o código errado, de fato o netbeans não te deixa escrever sintaxes de código errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

sempre que algo for anexo e os dados mais importantes gerados em config.php não existir novamente requisito ele sempre usando a função nativa do PHP require_once.

Eu acredito que essa é a única solução para usar o autload e as constantes, o de invocar o arquivo coringa assim que o PHP reclamar que não encontra alguma coisa. Quanto a gramática, estou usando a minha improvisação. Ao invés de Models, Views and Controllers, estou usando modelos, visões e controles, tudo em minúsculo e com acentos, inclusive o nome da classe. Quanto ao trabalho que eu dou para o navegador por não colocar aspas nos atributos, eu só coloco quando vejo que o navegador não responde do jeito que esperava. Eu sou calouro aqui, eu não faço nada que os veteranos sugerem.

Mas eu agradeço  por compartilhar o seu projeto. Eu vou desmontá-lo e ver se consigo fazer igual, usando as minhas improvisações. Quero ver por que o __DIR__ funciona no seu projeto, mas não funciona no meu. Por enquanto, obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos começar pelo começo e pelo seu sistema de autoload em /mvc/modelos/funções.php, notei que você está utilizando um mecanismo personalizado para carregar suas classes. Isso é uma parte fundamental do projeto, pois um autoload eficiente e preciso é essencial para a gestão das dependências.

Aqui está o seu trecho de código atual:

spl_autoload_register(function ($Class) {
    $includeDir = false;
    $findDir = ['controles','modelos','visões'];
    foreach ($findDir as $DirName) {
        if (!$includeDir
            && file_exists(__DIR__ . FindClass($DirName, $Class))
            && !is_dir(__DIR__ . FindClass($DirName, $Class))) {
            include_once (__DIR__ . FindClass($DirName, $Class));
            $includeDir = true;}}
    if (!$includeDir) {
        die("Erro interno no servidor ao encontrar dados 
            cruciais de funcionamento!");}});


Sugestões de Melhoria:

  1. Evite usar diretórios com acentos ou caracteres especiais, como visões. Isso pode causar inconsistências em diferentes ambientes de servidor. Prefira nomes em inglês ou sem acentuação, como views.
  2. Ao nomear diretórios e classes, adote uma convenção consistente. Por exemplo, use PascalCase para nomes de classes e camelCase para métodos e funções.
  3. Certifique-se de que o caminho gerado pela função FindClass seja o correto. Utilizar __DIR__ é uma boa prática, mas a função deve construir corretamente o caminho até o arquivo da classe.

Agora, vamos falar sobre a conexão com o banco de dados em /mvc/modelos/conexão.php.

Aqui está o trecho de código referente à sua classe conexão:

class conexão {
    private static $pdo;
    public function __construct(){}
    public static function instância(){
        $dbname="mvc";
        $user="root";
        $password="";
        // ... código omitido ...
        if(!self::$pdo){
            self::$pdo=new PDO("mysql:host=localhost;dbname=$dbname",$user,$password);}
        return self::$pdo;}}

 

Sugestões de Melhoria:

  1. Renomeie a classe para evitar acentos. Por exemplo, use Conexao em vez de conexão.
  2. Considere a segurança e manutenção do seu código. Armazenar credenciais de banco de dados diretamente no código não é uma prática segura. Idealmente, essas informações devem estar em um arquivo de configuração externo ou variáveis de ambiente.
  3. Embora o padrão singleton possa ser útil em alguns casos, ele pode limitar a testabilidade e a flexibilidade da sua aplicação. Pense em alternativas como a injeção de dependências para gerenciar suas conexões de banco de dados.

Por último, mas não menos importante, vamos olhar para a forma como você está lidando com a entrada do usuário em /mvc/controles/controle.php. Notei que você está passando diretamente a entrada do usuário para consultas SQL, o que pode ser uma porta aberta para ataques de injeção de SQL.

Aqui está um exemplo do seu código:

public function validaEmail($email){
    $stmt=conexão::instância()->query("select email from usuários 
        where email='$email'");
    return $stmt->fetch(PDO::FETCH_ASSOC);}

Sugestões de Melhoria:
 

Nunca insira diretamente dados do usuário em suas consultas SQL. Use prepared statements para evitar injeção de SQL. Com prepared statements, sua consulta deve se parecer com isto:

$stmt = conexão::instância()->prepare("SELECT email FROM usuarios WHERE email = :email");
$stmt->execute(['email' => $email]);
return $stmt->fetch(PDO::FETCH_ASSOC);

Novamente, evite usar acentos e caracteres especiais nos nomes de classes e tabelas.
 

Implementando essas sugestões, você não só aumentará a segurança e a robustez do seu projeto, mas também tornará o código mais limpo, organizado e de acordo com as melhores práticas de desenvolvimento. Se precisar de mais alguma ajuda, não hesite em perguntar!


Só vou colocar abaixo como faria um refactory nos trechos acima:

Antes:

spl_autoload_register(function ($Class) {
    $includeDir = false;
    $findDir = ['controles','modelos','visões'];
    foreach ($findDir as $DirName) {
        if (!$includeDir
            && file_exists(__DIR__ . FindClass($DirName, $Class))
            && !is_dir(__DIR__ . FindClass($DirName, $Class))) {
            include_once (__DIR__ . FindClass($DirName, $Class));
            $includeDir = true;}}
    if (!$includeDir) {
        die("Erro interno no servidor ao encontrar dados 
            cruciais de funcionamento!");}});

 

Depois:

spl_autoload_register(function ($class) {
    $includeDir = false;
    $directories = ['controllers', 'models', 'views'];
    foreach ($directories as $dirName) {
        $filePath = __DIR__ . DIRECTORY_SEPARATOR . $dirName . DIRECTORY_SEPARATOR . $class . '.php';
        if (!$includeDir && file_exists($filePath) && !is_dir($filePath)) {
            include_once ($filePath);
            $includeDir = true;
            break;
        }
    }
    if (!$includeDir) {
        die("Internal server error: Unable to locate crucial operational data!");
    }
});


Antes:
 

class conexão {
    private static $pdo;
    public function __construct(){}
    public static function instância(){
        $dbname="mvc";
        $user="root";
        $password="";
         // ... código omitido ...
        if(!self::$pdo){
            self::$pdo=new PDO("mysql:host=localhost;dbname=$dbname",$user,$password);}
        return self::$pdo;}}

Depois:
 

class Conexao {
    private static $pdo;
    public function __construct() {}
    public static function getInstance() {
        $dbname = "mvc";
        $user = "root";
        $password = "";
        // ... código omitido ...
        if (!self::$pdo) {
            self::$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $user, $password);
        }
        return self::$pdo;
    }
}

Antes: 
 

public function validaEmail($email){
    $stmt=conexão::instância()->query("select email from usuários 
        where email='$email'");
    return $stmt->fetch(PDO::FETCH_ASSOC);}

Depois:

public function validaEmail($email) {
    $stmt = Conexao::getInstance()->prepare("SELECT email FROM usuarios WHERE email = :email");
    $stmt->execute(['email' => $email]);
    return $stmt->fetch(PDO::FETCH_ASSOC);
}

Essas mudanças aumentam a segurança e a robustez do seu projeto, e também tornam o código mais claro, organizado e alinhado com as melhores práticas de desenvolvimento em PHP. Isso facilita a manutenção e a escalabilidade do projeto.

Para aumentar a segurança das suas credenciais de banco de dados e outras informações sensíveis, é recomendável carregar esses dados de um arquivo .env externo ao invés de tê-los diretamente no código. Para isso, você pode usar o pacote vlucas/phpdotenv, que é amplamente utilizado na comunidade PHP. Aqui está como você pode fazer isso:

Primeiro, instale o pacote usando Composer (se você ainda não tem o Composer, terá que instalá-lo primeiro):

composer require vlucas/phpdotenv

Crie um arquivo .env na raiz do seu projeto com o seguinte conteúdo:
 

DB_NAME=mvc
DB_USER=root
DB_PASSWORD=sua_senha_aqui

No seu arquivo Conexao.php, você pode carregar as variáveis de ambiente e usar os valores para conectar-se ao banco de dados:
 

Antes:
 

class Conexao {
    private static $pdo;
    public function __construct() {}
    public static function getInstance() {
        $dbname = "mvc";
        $user = "root";
        $password = "";
         // ... código omitido ...
        if (!self::$pdo) {
            self::$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $user, $password);
        }
        return self::$pdo;
    }
}


Depois:

use Dotenv\Dotenv;

class Conexao {
    private static $pdo;
    public function __construct() {}
    public static function getInstance() {
        $dotenv = Dotenv::createImmutable(__DIR__);
        $dotenv->load();
        
        $dbname = $_ENV['DB_NAME'];
        $user = $_ENV['DB_USER'];
        $password = $_ENV['DB_PASSWORD'];
        // ... restante do código ...
        if (!self::$pdo) {
            self::$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $user, $password);
        }
        return self::$pdo;
    }
}


Certifique-se de adicionar o .env ao seu .gitignore para evitar que suas credenciais sejam expostas se você estiver usando controle de versão como Git.

Essa abordagem não apenas melhora a segurança do seu aplicativo, mas também facilita a gestão de configurações em diferentes ambientes (desenvolvimento, teste, produção), pois você pode ter arquivos .env separados para cada ambiente sem precisar alterar o código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer ao auxílio dos amigos, mas preciso entender e resolver um problema.
       
      Tenho uma Rotina que o usuário seleciona os produtos que deseja para requerer ao setor responsável.
       
      O usuário escolhe um produto qualquer e Clicla em um button para incluir a lista.

      O problema que estou enfrentando é que após escolher o produto e teclar ENTER o Sistema já salva no BD.
       
      Gostaria de criar uma Tecla de Atalho, para quando incluir/escolher o produto na lista, o usuário tecla como exemplo:
      ALT+A  para agregar a lista
      ALT+S para salvar a lista de itens desejados.

      Assim, quando teclar enter, o sistema não dispara o GRAVAR na Base de Dados.

      Grato,

      Cesar
       
       
       
×

Informação importante

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