Ir para conteúdo

Arquivado

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

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.

 

Compartilhar este post


Link para o post
Compartilhar em outros 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");
}

 

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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