Olá pessoa lestou com problema ao acessar que consulta dados no banco, se eu acessar apenas uma classe rola se eu acessar mais de uma a primeira executa e as demais apresentam problemas, essa é a mensagem de erro:
Fatal error: Call to a member function query() on a non-object in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\teste\pdo\AgendaDAO.class.php on line 56
A linha informada e é essa, não entendo o motivo do erro:
<?php
class AgendaDAO
{
// irá receber uma conexão
public $p = null;
// construtor
public function AgendaDAO(){
$this->p = new Conexao();
}
// realiza uma inserção
public function Insere( $agenda ){
try{
$stmt = $this->p->prepare("INSERT INTO agenda (nome, email, telefone) VALUES (?, ?, ?)");
$stmt->bindValue(1, $agenda->getNome() );
$stmt->bindValue(2, $agenda->getEmail() );
$stmt->bindValue(3, $agenda->getTelefone() );
$stmt->execute();
// fecho a conexão
$this->p = null;
// caso ocorra um erro, retorna o erro;
}
catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); }
}
// realiza um Update
public function Update( $agenda, $condicao ){
try{
// preparo a query de update – Prepare Statement
$stmt = $this->p->prepare("UPDATE agenda SET nome=?, email=?, telefone=? WHERE id=?");
$this->p->beginTransaction();
$stmt->bindValue(1, $agenda->getNome() );
$stmt->bindValue(2, $agenda->getEmail() );
$stmt->bindValue(3, $agenda->getTelefone() );
$stmt->bindValue(4, $condicao);
// executo a query preparada
$stmt->execute();
$this->p->commit();
// fecho a conexão
$this->p = null;
}
catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); }
}
// remove um registro
public function Deleta( $id ){
try{
$num = $this->p->exec("DELETE FROM agenda WHERE id=$id");
// caso seja execuado ele retorna o número de rows que foram afetadas.
if( $num >= 1 ){return $num;}
else {return 0;}
// caso ocorra um erro, retorna o erro;
}
catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); }
}
public function Lista($query=null){
try{
if( $query == null ){
$stmt = $this->p->query("SELECT * FROM agenda");}
else{$stmt = $this->p->query($query);}
$this->p = null;
return $stmt;
}
catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); }
}
}
?>
A classe de conexão:
<?php
//ela herdará os métodos e atributos do PDO através da palavra-chave extends
class Conexao extends PDO
{
private $dsn = 'mysql:host=servidor;port=3306;dbname=agenda';
private $user = 'root';
private $password = '123456';
public $handle = null;
function __construct() {
try {
//aqui ela retornará o PDO em si, veja que usamos parent::_construct()
if ( $this->handle == null ) {
$dbh = parent::__construct( $this->dsn , $this->user , $this->password );
$this->handle = $dbh;
return $this->handle;
}
}
catch ( PDOException $e ) {
echo 'Conexão falhou. Erro: ' . $e->getMessage( );
return false;
}
}
//aqui criamos um objeto de fechamento da conexão
function __destruct( ) {
$this->handle = NULL;
}
}
?>
A classe Agenda
<?php
include_once 'Conexao.class.php';
include_once 'AgendaDAO.class.php';
include_once 'Agenda.class.php';
// instancio a classe Agenda
$agenda = new Agenda();
//setando os dados de contato
$agenda->setNome("xxxxxx xxx");
$agenda->setEmail("xxxxx@gmail.com");
$agenda->setTelefone("9999-9999");
// instancio a classe Data Access Object para Agenda
$DAO = new AgendaDAO();
// inserir contato na agenda
$DAO->Insere($agenda);
//para listar nome e email de todos os contatos
foreach ($DAO->Lista() as $contato){
echo $contato["nome"]." – ".$contato["email"]."<br/>";
}
?>
Pergunta
Alexandre Carmo
Olá pessoa lestou com problema ao acessar que consulta dados no banco, se eu acessar apenas uma classe rola se eu acessar mais de uma a primeira executa e as demais apresentam problemas, essa é a mensagem de erro:
Fatal error: Call to a member function query() on a non-object in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\teste\pdo\AgendaDAO.class.php on line 56
A linha informada e é essa, não entendo o motivo do erro:
$stmt = $this->p->query("SELECT * FROM agenda");}
que fina na class AgendaDAO, na seguinte função:
A classe completa é essa: A classe de conexão: A classe AgendaLink para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.