Jump to content
Nightmare SEP

[Resolvido] PDO: Erro na function

Recommended Posts

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.

 

Share this post


Link to post
Share on other sites

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");
}

 

  • Obrigado! 1

Share this post


Link to post
Share on other sites

@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

Share this post


Link to post
Share on other sites

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.

  • Obrigado! 1

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

  • +1 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.