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

PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1 no such table: students in

Olá, alguém poderia me dar um help ?

Estou com problema na parte da tabela do BD, mas quando eu tento criar uma tabela o mesmo erro aparece, já tentei modificar o código e comparar até com o do Professor. O código aparentemente está certo, mas não estou conseguindo entender o pq meu BD não está achando a tabela students sendo que fiz todos os passos anteriores sem erro com a mesma tabela. Codigo abaixo do arquivo PdoStudentRepository.php

PS: Estou fazendo isso para criar a turma, mas como não estou conseguindo nem mostrar os alunos que estavam inseridos, acho que deve ser um erro por aqui, pois foi nesses dois ultimos arquivos alterados.

<?php

namespace Alura\Pdo\Infrastructure\Repository;

use Alura\Pdo\Domain\Model\Student;
use Alura\Pdo\Domain\Repository\StudentRepository;
use PDO;

class PdoStudentRepository implements StudentRepository
{

    private PDO $connection;

    public function __construct(PDO $connection)
    {
        $this->connection = $connection;
    }

    public function save(Student $student): bool
    {
        if ($student->id() === null) {
            return $this->insert($student);
        }

        return $this->update($student);
    }

    private function insert(Student $student): bool
    {
        $insertQuery = 'INSERT INTO students (name, birth_date) VALUES (:name, :birth_date);';
        $stmt = $this->connection->prepare($insertQuery);

        $success = $stmt->execute([
            ':name' => $student->name(),
            'birth_date' => $student->birthDate()->format('Y-m-d'),
        ]);

        if ($success) {
            $student->defineId($this->connection->lastInsertId());
        }

        return $success;
    }

    public function allStudents(): array
    {
        $sqlQuery = 'SELECT * FROM students;';
        $stmt = $this->connection->query($sqlQuery);

        return $this->hydrateStudentList($stmt);
    }

    public function studentsBirthAt(\DateTimeInterface $birthDate): array
    {
        $sqlQuery = 'SELECT * FROM students WHERE birth_date = ?;';
        $stmt = $this->connection->prepare($sqlQuery);
        $stmt->bindValue(1, $birthDate->format('Y-m-d'));
        $stmt->execute();

        return $this->hydrateStudentList($stmt);
    }

    private function hydrateStudentList(\PDOStatement $stmt): array
    {
        $studentDataList = $stmt->fetchAll(PDO::FETCH_ASSOC);
        $studenList= [];

        foreach ($studentDataList as $studentData) {
           $studenList[] = new Student(
            $studentData['id'],
            $studentData['name'],
            new \DateTimeImmutable($studentData['birth_date'])
           );
        }

        return $studenList;
    }

    private function update(Student $student): bool
    {
        $updateQuery = 'UPDATE students SET name = :name, birth_date = :birth_date WHERE id = :id;';
        $stmt = $this->connection->prepare($updateQuery);
        $stmt->bindValue(':name', $student->name());
        $stmt->bindValue(':birth_date', $student->birthDate()->format('Y-m-d'));
        $stmt->bindValue(':id', $student->id(), PDO::PARAM_INT);

        return $stmt->execute();
    }

    public function remove(Student $student): bool
    {
        $stmt = $this->connection->prepare('DELETE FROM students WHERE id = ?;');
        $stmt->bindValue(1, $student->id(), PDO::PARAM_INT);

        return $stmt->execute();
    }
}

Agora o meu arquivo de connection:

<?php

namespace Alura\Pdo\Infrastructure\Persistence;

use PDO;

class ConnectionCreator
{
    public static function createConnection(): PDO
    {
        $databasePath = __DIR__ . '/../../../banco.sqlite';
        return new PDO('sqlite:' . $databasePath);
    }   
}
2 respostas
solução!

Nicolas, o erro é bem claro. A tabela students não existe. Provavelmente você a criou em algum outro arquivo de banco, não o mesmo que está se conectando agora.

Não sei se foi isso, mas eu fiz o código na parte de 'test.php' quando você tinha mostrado o exemplo do sqlite::memory e meu VSC salva automaticamente e provalvemente eu sobrescrevi a conexão onde estava o banco.sqlite. Não sei se pode ter sido isso, pois eu não rodei o codigo no terminal.

Apaguei o código até a parte da criação da Class com o save(), remove(), etc.. e deu certo.