Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.@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?
ObrigadoVocê 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.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.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.
Obrigado pela ajuda Gabriel.
Vou tentar aqui. Valeu mesmo.
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)
{
{