Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

BrunoBit

autoload querendo carregar PDO

Recommended Posts

Fala rapaziada.

Estou com um problema aqui referente ao spl_autoload_register, o autoload ta querendo carregar o PDO, eu já utilizei a contra barra "new \PDO", mas mesmo assim está querendo carregar o PDO. Alguém tem ideia do pq?


PHP Fatal error:  Uncaught exception 'Exception' with message 'File /home/meusite/public_html/painel/classes/PDO.php not found in the path' in /home/meusite/public_html/painel/autoload/autoload.php:6

 

Desde já agradeço a ajuda, feliz natal pra todos vocês e fiquem com Deus.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala aí rapaziada.

Graças à ajudar da galera lá no grupo do Desenvolvimento Web no facebook, onde o joão aqui do fórum é admin, consegui resolver o problema.

Meu autoload tava disparando throw exception e iria disparar esse throw sempre que houvesse alguma classe nativa do PHP, ou seja, ele iria engolir qualquer classe nativa como new PDO, new Datetime, new mysqli e etc, e sempre iria disparar o throw pq eu tinha um if que fazia a seguinte verificação:

if(!file_exists($class){
	throw new exception("file not found");
}

Aí com a sugestão do Fernando lá no grupo, eu inverti a lógica:

if(file_exists($class){
	require_once($class);
}

E funcionou perfeitamente e deu uma clareada na minha mente, pq sempre quando o autoload encontrasse alguma classe nativa do PHP iria disparar o throw new exception desnecessariamente e consequentemente iria impedir o funcionamento correto do sistema.

 

Deixei essa nota aqui pq de repente alguém vem do google e pode ta passando pelo mesmo problema e pode existir a possibilidade de ser isso.

 

Valeu rapaziada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala aew Bruno?

Não entendi por completo o problema, mas o que deu para perceber é que você está usando alguma função para carregar classes de forma automatizada, e sua função está querendo carregar até mesmo as classes nativas.

Bem eu tenho essa função.

Spoiler

<?php
/**
 * *********************************************************************
 * @function: Função para auto carregamento de classes
 * *********************************************************************
 * @autor: Spell Master
 * @copyright (c) 2014, Spell Master AND Zeed
 * *********************************************************************
 */

function __autoload($Class) {
    // Liste aqui todas as pastas que contém arquivos de classes
    $findDir = [
        '../class/database',
        '../class/helper',
        '../class/PHPMailer',
        ];
    $includeDir = null;
    foreach ($findDir as $DirName) {
        if (!$includeDir && file_exists(__DIR__ . "\\{$DirName}\\{$Class}.php") && !is_dir(__DIR__ . "\\{$DirName}\\{$Class}.php")) {
            include_once (__DIR__ . "\\{$DirName}\\{$Class}.php");
            $includeDir = true;
        }
    }
    // Isso é opcional
    // Caso a função não encontre o arquivo ela vai retornar isso como erro
    if (!$includeDir) {
        die("Erro ao incluir o arquivo: {$Class}.php");
    }
}

 

 

Se for isso mesmo em "$findDir" coloque todos os diretórios onde estão suas classes.

Então toda vez que instanciar pelo operador new a função vai buscar a classe. Que também funciona lindamente com conceitos de herança nas classes.

Citar

$obj = new MinhaClass(); // Automaticamente a função vai dar include no arquivo MinhaClass.php

E se for esse o caso

Citar

class MinhaClass extends ClassePai {

 // a função vai requisitar MinhaClass.php e ClassePai.php

}

Que também funciona com a classe sendo chamada dentro de outra classe

 

Se for esse seu caso fica aí uma boa solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeito Omar, era exatamente isso, a minha função tava engolindo tudo de forma automatizada, o problema era que eu tava dando throw new exception quando não era encontrada a classe/arquivo, era aí que dava problema quando o autoload encontrava uma classe nativa do PHP (pdo,mysqli,datetime etc).

Minha função estava assim:

function autoloadClasses($class){

	$class = str_replace("\\" , "/" , __DIR__) . "/" . str_replace("\\" , "/" , $class) . ".php";
	if(!file_exists($class)){
		throw new Exception("File path {$class} not found.");
	}

	require_once($class);
}
spl_autoload_register("autoloadClasses");

Eu tava dando um if(!file_exists($class)), ou seja, quando o autoload encontrava um new PDO ou new mysqli ou new Datetime, o meu autoload queria processar essas classes nativas também e no final das contas disparava um throw new exception pq PDO.php e mysqli.php e datetime.php não existe, aí eu inverti a lógica, fiz dessa forma:

function autoloadClasses($class){
	$class = str_replace("\\" , "/" , __DIR__) . "/" . str_replace("\\" , "/" , $class) . ".php";
	if(file_exists($class)){
		require_once($class);
	}
}
spl_autoload_register("autoloadClasses");

E funcionou liso, ou seja, eu tava disparando throw new exception desnecessariamente.

 

E valeu por ter passado seu código, vou botar ele aqui no servidor e estudar ele, vi que você fez de uma forma diferente e ficou bacana.

 

Valeu Omar, abração meu irmão, feliz natal aí pra você e sua família, fiquem com Deus.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • 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 Luiz Henrique
      Olá,
       
      Preciso fazer uma inserção no DB de registros referente a pagamentos, quando for no crédito será realizado o insert com sua respectiva data de compensação e valor da parcela exemplo:
       3 parcelas de 100.00 e cada registro em seu devido mês:
      INSERT INTO tabela (valor, data) VALUES (100, 2022-08-17),(100, 2022-09-17),(100, 2022-10-17) É mais eficiente fazer da forma acima ou colocar 3 INSERT?
      Ou existe forma melhor de fazer isso?
       
      Obrigado.,
       
    • Por Marcones Borges
      Olá, estou precisando de uma ajuda...
       
      Tenho duas tabelas
      ministros
      entradas
       
      Preciso exibir a lista dos ministros que não contam no relatório gerado em entradas.
       
      Fiz assim a combinação.
       

      $sql = "SELECT ministro.id, ministro.area, entrada.beneficiario, entrada.id_benificiario, entrada.id_benificiario, entrada.tipo_lancamento FROM ministro INNER JOIN entrada ON ministro.id = entrada.id_benificiario WHERE ministro.area = entrada.area_beneficiario AND ministro.nome = entrada.beneficiario AND entrada.id_benificiario='[{$id_exer}' AND entrada.tipo_lancamento='ministro'  "; $stm = $conexao->prepare($sql); $stm->execute(); $clientes = $stm->fetchAll(PDO::FETCH_OBJ);
       
      Fiz as combinações direitinho mais não consigui exbir os que estão na tabela ministro e não estão na tabela entrada.
    • Por Marcones Borges
      Olá, sou iniciante em php, estou tentando migrar um código de php 5.6 para pdo mais da erro, não roda....
      Alguém pode me ajudar?

      include '../Connections/functions.php';           function montaSelect()         {  $sql = "SELECT * FROM membros"; $result = $con->query($sql); if ($result->num_rows > 0 )  {   while($dados = $result->fetch_assoc())   {   $opt .= '<option value="'.$dados['id'].'">'.$dados['nome'].'</option>';   } } else {           $opt = '<option value="0">Nenhum Membro cadastrado</option>';     return $opt; }         }
       
      Este era o código original:
       

      // require 'topof.php'; // echo $usuario;         /**          * função que retorna o select          */         function montaSelect()         {                 $sql = "SELECT id, nome FROM membros '";                 $query = mysql_query( $sql );                 if( mysql_num_rows( $query ) > 0 )                 {                         while( $dados = mysql_fetch_assoc( $query ) )                         {                                 $opt .= '<option value="'.$dados['id'].'">'.$dados['nome'].'</option>';                         }                 }                 else                         $opt = '<option value="0">Nenhum Membro cadastrado</option>';                 return $opt;         }
    • Por Sapinn
      Recentemente, o seguinte erro estava aparecendo em meu site 'max_user_connections', depois de muitas pesquisas descobri que o problema era devido a uma conexão persistente de banco de dados, então o removi do meu código e funcionou. Outro problema surgiu agora, meu lastInsertId () está retornando 0. Quando eu uso a conexão persistente, ele funciona se eu removê-lo, ele falha. Eu nem sei mais o que fazer. Vou deixar as partes mais importantes do meu código aqui:
      Conexão:
      public function __construct()     {         $dsn = 'mysql:host='.$this->host.';dbname='.$this->bank;            try {             $this->dbh = new PDO($dsn,$this->user,$this->password);             $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);                               } catch (PDOException $e) {             print "Error!: " . $e->getMessage() . "<br/>";             die();         }               }     public function lastId Inserted(){         return $this->dbh->lastInsertId();     }  
      Pesquisando pelo último Id:
       
       if($this->saleModel->store($data)):                             $sale_id = $this->db->lastId Inserted();                                                         $data['sale_id'] = $sale_id;                             $this->sellModel->sellProduct($data);                             $total = $stock->quant_product - $data['quant_sale'];                             $this->ProductModel->decreaseSales($data['product_id'],$total);                             Url::redirect('sales/sellProducts/'.$sale_id.'');                         endif;  
×

Informação importante

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