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

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software