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 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.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • 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, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
×

Informação importante

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