Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com acesso a classe


Alexandre Carmo

Pergunta

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:

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 completa é essa:
<?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/>";
}

?>

Link 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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...