Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PDO e php - Chamada para uma função de membro prepare() em um não-objeto


@papaja acertou em cheio na cabeça. Sua conexão PDO falhou, portanto, você não tem um objeto PDO para executar o método de preparação.

Em cima da minha cabeça, acho que você está perdendo a citação final na string $ dsn. Você provavelmente deseja adicionar o seguinte após $this->dbname e antes do ponto e vírgula:
. "'"

Isso é uma aspa simples envolta em aspas duplas. Eu uso a seguinte sintaxe para criar a string DSN:
"mysql:host=$this->HOST;dbname=$this->DATABASE"

De qualquer forma, crie um arquivo de teste para que você saiba exatamente qual é o problema. O arquivo de teste deve ficar assim:
class TestDatabase{

    private $host      = DB_HOST;
    private $user      = DB_USER;
    private $pass      = DB_PASS;
    private $dbname    = DB_NAME;
    private $dbh;


    public function __construct(){

        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;

        $options = array(
            PDO::ATTR_PERSISTENT    => true,
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
        );

        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
    }
}

Observe que não estamos executando a instanciação do objeto PDO dentro de um bloco try catch. Enquanto você nunca faça isso em produção, será útil para seu teste porque lançará uma exceção fatal contendo todos os detalhes de sua conexão.

Agora instancie a classe de teste e prossiga depurando os erros que você recebe. Novamente, eles serão mais detalhados do que o erro anterior porque será uma exceção PDO não capturada.