Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Problema : Erro 500 ao importar a classe Artigo.php

Bom dia galera, sigo aqui estudando o php com orientação a objetos e agora me deparei com o seguinte problema:

A atividade em questão precisa adicionar dados dentro de um banco de dados mysql, assim dentro do arquivo adicionar-artigo.php importei a conexão com o banco(connection.php) e a classe Artigo(Artigo.php). Porém ao inserir o ultimo em questão a página retorna o erro 500.

Pensei que o problema estava em torno da classe Artigo porém a pagina principal que instancia a mesma classe esta funcionando 100%.

O código php do arquivo **adicionar-artigo-php** é:
<?php

require '../connection.php';
require '../src/Artigo.php'; // esta dando erro!

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $artigo = new Artigo($mysql);
    $artigo->adicionarArtigo($_POST['titulo'], $_POST['conteudo']);
?>

A classe Artigo.php

<?php

require_once 'connection.php';

class Artigo {
    private mysqli $mysql;

    public function __construct(mysqli $mysql) {
        $this->mysql = $mysql;
    }

    public function exibirTodos(): array
    {
        $consulta = 'SELECT id, titulo, conteudo FROM artigos';
        $resultado = $this->mysql->query($consulta);
        $artigos = $resultado->fetch_all(MYSQLI_ASSOC);
        return $artigos;
    }

    public function encontrarCorpoArtigo(string $id): array{

        # Usando a sintaxe anti mysql injection
        $sql = 'SELECT id, titulo, conteudo FROM artigos WHERE id LIKE ?';
        $consultaArtigo = $this->mysql->prepare($sql);
        $consultaArtigo->bind_param('s', $id);
        $consultaArtigo->execute();
        $artigo = $consultaArtigo->get_result()->fetch_assoc();
        return $artigo;
    }

    public function adicionarArtigo(string $titulo, string $conteudo): void{
        $sql = 'INSERT INTO artigo (titulo, conteudo) VALUES (?,?)';
        $requisicao = $this->mysql->prepare($sql);
        $requisicao->bind_param('ss', $titulo, $conteudo);
        $requisicao->execute();
    }
}

Bem o projeto completo está no GitHub: https://github.com/heitorzunta/alura-webapp.git

Desde já agradeço pela ajuda.

4 respostas

Fala Heitor, beleza?

Existem algumas faixas de respostas HTTP, as que iniciam com 500 significam algum erro interno na sua aplicação/servidor.

Na sua página index da parte administrativa mantenha o mesmo padrão de link para acessar a página de edição: href="admin/adicionar-artigo.php">

Eu vi que você comentou que está dando erro no require do Artigo, vá onde está sua classe de Artigo, dentro da src, e remova o require_once 'connection.php'; de dentro dela.

E por fim, no seu método de adicionarArtigo tem um sql que está incorreto, você escreveu "INSERT INTO artigo", mas sua tabela se chama artigos, conserte para "INSERT INTO artigos" ou isso irá gerar outros erros.

Fala Diego tudo bem cara! E com vc? Velho mais ma vez, você salvando o dia, então era sim o require 'conection.php'; na classe Artigo que estava gerando o erro mesmo. Mas como na aula o professor não comentou nada em remover e por que remover. Eu não sabia mesmo o que fazer. Bem, normal é uma das coisas que vivo reclamando nos finais dos cursos aqui, como o video é editado eles testam algo antes, acaba sempre perdendo algo como este caso do require.

Bem você que é mais antenado, porque preciso tirar o require da classe Artigo.php para funcionar. Aprendi que uso require para importar uma outra classe que usarei na atual. Está correto?

Deste já valeu pela ajuda

solução!

Então Heitor,

Eu acredito que tenha sido por quê você estava importando duas vezes o mesmo arquivo de conexão, sendo que no Artigo você estava usando o require_once que informa ao PHP que esse arquivo deva ser importando uma única vez. Mas é bem comum acontecer esses erros quando se faz o uso do require para importar classes por que a pessoa se acaba perdendo em vários aspectos, por exemplo, realizar importações dentro de importações, entre outros problemas que essa abordagem oferece.

Mas fique tranquilo em relação a essa questão do require por que não se utiliza mais essa forma para trabalhar há muitos anos. Como é uma aplicação pequena e para quem está iniciando então o professor deve ter seguido essa abordagem. No dia-a-dia utilizamos um padrão chamado psr-4 que elimina a bagunça do require e provavelmente você aprenderá em algum dos cursos de orientação a objetos com php, do instrutor Vinicius aqui na Alura. Se tiver curiosidade antecipada digite por "PSR-4 PHP" no google, brevemente estará usando ela e também a classe PDO para gerenciar conexões, ao invés da mysqli.

Não esqueça de por o tópico como solucionado =)

Saquei, eu ja vi a aula do Vinicius sobre autoload, até pensei em implementa-lo neste projeto do curso, mas estou tentando ser mais fiel ao que o instrutor esta fazendo para ao termino eu modifica-lo. Mas cara valeu muito obrigado pelas ajudas! =)