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

Após executar o INSERT, o id está NULL

Bom dia,

Após executar o insert:

<?php

use Alura\Pdo\Domain\Model\Student;

require_once 'vendor/autoload.php';

$dataBasePath = __DIR__ . 'banco.sql';

$pdo = new PDO("sqlite:".$dataBasePath);

$student = new Student(null,'Edson Garcia', new \DateTimeImmutable('1988-07-15'));

$sqlInsert = "INSERT INTO students (name, birth_date)
            VALUES ('{$student->name()}','{$student->birthDate()->format('Y-m-d')}');";

// apenas para exibir a query para verificar se a mesma está correta
// echo $sqlInsert;

$pdo->exec($sqlInsert);

O id está como null:

<?php

require_once 'vendor/autoload.php';

$dataBasePath = __DIR__ . 'banco.sql';

$pdo = new PDO("sqlite:".$dataBasePath);

$statement = $pdo->query('SELECT * FROM students;');

echo "<pre>";
var_dump($statement->fetchAll());
echo "</pre>";

Resultado:

array(1) {
  [0]=>
  array(6) {
    ["id"]=>
    NULL
    [0]=>
    NULL
    ["name"]=>
    string(12) "Edson Garcia"
    [1]=>
    string(12) "Edson Garcia"
    ["birth_date"]=>
    string(10) "1988-07-15"
    [2]=>
    string(10) "1988-07-15"
  }
}
5 respostas

Olá, Edson. Tudo bem?

Tente recriar o banco de dados com a extensão .sqlite e adicione uma / antes do nome do banco, para ele ser salvo no diretório correto. Veja o exemplo abaixo:

$databasePath = __DIR__ . '/banco.sqlite';

Dessa forma, execute o arquivo para criar o banco, inserir o estudante e depois buscar este estudante.

Veja se essa solução resolve, fico no aguardo :)

Fala professor, Continua a mesma coisa.

Nome do arquivo: banco.sqlite

Conexão ao banco:

<?php

$dataBasePath = __DIR__ . '/banco.sqlite';
try {
  $pdo = new PDO("sqlite:".$dataBasePath);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Conectado com sucesso";
    $pdo->exec('CREATE TABLE students (id PRIMARY KEY, name TEXT, birth_date TEXT)');
    // $pdo->exec('DROP TABLE students');

} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}

Realizando Insert:

<?php

use Alura\Pdo\Domain\Model\Student;

require_once 'vendor/autoload.php';

$dataBasePath = __DIR__ . '/banco.sqlite';

$pdo = new PDO("sqlite:".$dataBasePath);

$student = new Student(null,'Edson Garcia', new \DateTimeImmutable('1988-07-15'));

$sqlInsert = "INSERT INTO students (name, birth_date)
            VALUES ('{$student->name()}','{$student->birthDate()->format('Y-m-d')}');";

// apenas para exibir a query para verificar se a mesma está correta
// echo $sqlInsert;

$pdo->exec($sqlInsert);

Exibindo lista de alunos

<?php

use Alura\Pdo\Domain\Model\Student;

require_once 'vendor/autoload.php';

$dataBasePath = __DIR__ . '/banco.sqlite';

$pdo = new PDO("sqlite:".$dataBasePath);

$statement = $pdo->query('SELECT * FROM students;');
$studentDataList = $statement->fetchAll(PDO::FETCH_ASSOC);
$studentList = [];

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

echo "<pre>";
var_dump($studentList);
echo "</pre>";

Resultado Obtido:

array(1) {
  [0]=>
  object(Alura\Pdo\Domain\Model\Student)#4 (3) {
    ["id":"Alura\Pdo\Domain\Model\Student":private]=>
    NULL
    ["name":"Alura\Pdo\Domain\Model\Student":private]=>
    string(12) "Edson Garcia"
    ["birthDate":"Alura\Pdo\Domain\Model\Student":private]=>
    object(DateTimeImmutable)#5 (3) {
      ["date"]=>
      string(26) "1988-07-15 00:00:00.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(3) "UTC"
    }
  }
}
solução!

No arquivo de conexao, quando for criar a tabela de students, adicione o id como integer, da seguinte maneira:

$pdo->exec('CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT, birth_date TEXT);');

Troquei a instrução e agora funcionou, não me atentei sobre o tipo de dado do ID que tinha que ser INTEGER, acabei não informando e por esse motivo o sqlite não estava associando.

Obrigado mais uma vez professor Vinicius.

Forte abraço!

Que bom que deu certo, Edson! haha! Acontece esses erros, fazem parte do desenvolvimento!

Continue os estudos! tmj