Nightmare SEP 0 Denunciar post Postado Maio 15, 2018 Bom dia. Estou tendo uma dificuldade pra rodar umas funções com o PDO. Eu tenho um while, e dentro deste while eu chamo algumas funções. Acontece que no meio do while, é retornado um erro e travado o servidor, retornando o erro: Fatal error: Call to a member function prepare() on a non-object in E:\xampp\htdocs\intranet\qualidade\funcoes\funcoes.php on line 197 Arquivo: conexao.php try { $conexao = new PDO("mysql:host=192.168.0.11; dbname=intranet", "bruno", "478569net"); } catch(PDOException $e) { echo $e->getMessage(); } Arquivo: funcoes.php Linha 197: $consulta = $conexao->prepare("SELECT classificacao FROM com_rc_classificacoes WHERE id=:id"); function nome_classificacao($id) { include "conexao.php"; $consulta = $conexao->prepare("SELECT classificacao FROM com_rc_classificacoes WHERE id=:id"); $consulta->bindValue(":id", $id); $consulta->execute(); $dados = $consulta->fetch(PDO::FETCH_ASSOC); $classificacao = $dados['classificacao']; return $classificacao; } Eu só consegui fazer funcionar a função se eu der aquele include "conexao.php"; dentro da função. Mas creio que isso seja errado de se fazer, estou certo? Eu imagino que isso que deve estar fazendo travar o sistema, por estar se conectando repetidamente dentro o while. Como posso corrigir isso? Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Maio 15, 2018 A variável $conexão não existe na função nome_classificacao. Por isso está ocorrendo o erro. Quando você adiciona o include, a variável passa a existir. Mas não é a forma correta. Como você está utilizando o paradigma procedural, crie uma função que retorne a conexão. Dentro da função nome_classificacao, chame essa função para retornar a conexão. function getPDOConnection(string $key , string $host , string $database , string $user = null , string $password = null) { static $pdoList= []; if (!$pdoList[$key] instanceof \PDO) { try { $pdoList[$key] = new \PDO(sprintf('mysql:dbname=%s;host=%s;charset=UTF8' , $host , $database) , $user , $password); $pdoList[$key]->setAttribute(\PDO::ATTR_ERRMODE , \PDO::ERRMODE_EXCEPTION); } catch (\PDOException $exception) { throw new RuntimeException('Could not establish a database connection.' , 0 , $exception); } } return $pdoList[$key]; } E na função que você deseja utilizar: function myFunction() { $conexao = getPDOConnection("conexao-default" , "192.168.0.11" , "intranet", "bruno", "478569net"); } Compartilhar este post Link para o post Compartilhar em outros sites
Nightmare SEP 0 Denunciar post Postado Maio 15, 2018 @Gabriel Heming eu coloquei essa função getPDOConnection dentro do meu arquivo funcoes.php, no início do arquivo, mas está retornando esse erro: Fatal error: Default value for parameters with a class type hint can only be NULL in D:\Wamp\www\qualidade\funcoes\funcoes.php on line 2. Nesta linha: static $pdoList[]; Daí em todas as funções que eu fizer eu tenho que colocar aquela $conexao, com os dados do banco? Se um dia eu mudar esses valores vou ter que alterar em todas as funções? Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Maio 15, 2018 Você não deve estar utilizando a versão 7 do PHP. Apenas remova os type hints. <?php function getPDOConnection($key , $host , $database , $user = null , $password = null) { static $pdoList = []; if (!$pdoList[$key] instanceof \PDO) { try { $pdoList[$key] = new \PDO(sprintf('mysql:dbname=%s;host=%s;charset=UTF8' , $host , $database) , $user , $password); $pdoList[$key]->setAttribute(\PDO::ATTR_ERRMODE , \PDO::ERRMODE_EXCEPTION); } catch (\PDOException $exception) { throw new RuntimeException('Could not establish a database connection.' , 0 , $exception); } } return $pdoList[$key]; } Eu também alterei para NULL para ficar semanticamente correto. Compartilhar este post Link para o post Compartilhar em outros sites
Nightmare SEP 0 Denunciar post Postado Maio 15, 2018 Gabriel, da uma olhada se estou fazendo certo, por gentileza. Ali onde você colocou "conexao-default" eu altero pra alguma coisa? Desculpa vir com essas dúvidas amadoras, eu comecei a programar com PDO na semana passada, então estou bem perdido em algumas coisas como esse problema que estou tendo. Arquivo: funcoes.php <?php function getPDOConnection($key , $host , $database , $user = null , $password = null) { static $pdoList = []; if (!$pdoList[$key] instanceof \PDO) { try { $pdoList[$key] = new \PDO(sprintf('mysql:dbname=%s;host=%s;charset=UTF8' , $host , $database) , $user , $password); $pdoList[$key]->setAttribute(\PDO::ATTR_ERRMODE , \PDO::ERRMODE_EXCEPTION); } catch (\PDOException $exception) { throw new RuntimeException('Could not establish a database connection.' , 0 , $exception); } } return $pdoList[$key]; } /* ****************************************************************************************************************************************************************** ********************************************************************************************************************************************************************* NOME VENDEDOR ********************************************************************************************************************************************************************* ****************************************************************************************************************************************************************** */ function nome_vendedor($id) { $conexao = getPDOConnection("conexao-default" , "192.168.0.11" , "intranet", "bruno", "478569net"); $consulta = $conexao->prepare("SELECT nome FROM usuarios WHERE Id_usuario=:id"); $consulta->bindValue(":id", $id); $consulta->execute(); $dados = $consulta->fetch(PDO::FETCH_ASSOC); $nome = $dados['nome']; return $nome; } /* ****************************************************************************************************************************************************************** ********************************************************************************************************************************************************************* NOME CLASSIFICAÇÃO ********************************************************************************************************************************************************************* ****************************************************************************************************************************************************************** */ function nome_classificacao($id) { $conexao = getPDOConnection("conexao-default" , "192.168.0.11" , "intranet", "bruno", "478569net"); $consulta = $conexao->prepare("SELECT classificacao FROM com_rc_classificacoes WHERE id=:id"); $consulta->bindValue(":id", $id); $consulta->execute(); $dados = $consulta->fetch(PDO::FETCH_ASSOC); $classificacao = $dados['classificacao']; return $classificacao; } /* ****************************************************************************************************************************************************************** ********************************************************************************************************************************************************************* SETOR CLASSIFICAÇÃO ********************************************************************************************************************************************************************* ****************************************************************************************************************************************************************** */ function setor_classificacao($id) { $conexao = getPDOConnection("conexao-default" , "192.168.0.11" , "intranet", "bruno", "478569net"); $consulta = $conexao->prepare("SELECT setor FROM com_rc_classificacoes WHERE id=:id"); $consulta->bindValue(":id", $id); $consulta->execute(); $dados = $consulta->fetch(PDO::FETCH_ASSOC); $setor = $dados['setor']; // Setor switch ($setor) { case "AL": $setor_desc = "ALMOXARIFADO"; break; case "CL": $setor_desc = "CLIENTE"; break; case "FN": $setor_desc = "FORNECEDOR"; break; case "PP": $setor_desc = "PCP"; break; case "PR": $setor_desc = "PRODUÇÃO"; break; case "PJ": $setor_desc = "PROJETO"; break; case "TR": $setor_desc = "TRANSPORTE"; break; case "VD": $setor_desc = "VENDAS"; break; default: $setor_desc = ""; } return $setor_desc; } Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Maio 15, 2018 A princípio está tudo correto. Agora veja que está tendo bastante repetição de código. Pois, você acaba sempre tendo que colocar os dados de conexão. Eu coloquei a primeira variável ($key), para que você possa nomear a conexão e, nas próximas chamadas, apenas recuperar através do nome. Só que eu não implementei esta parte. Fica para estudo pra ti. Compartilhar este post Link para o post Compartilhar em outros sites
Nightmare SEP 0 Denunciar post Postado Maio 15, 2018 Obrigado pela ajuda Gabriel. Vou tentar aqui. Valeu mesmo. Compartilhar este post Link para o post Compartilhar em outros sites