3
respostas

Elemento vazio adicionado no banco de dados

Sempre que executo o arquivo "inserir-aluno.php" (código abaixo), é adicionado um item a mais no banco de dados que gera um erro no "lista-alunos.php"

inserir-aluno.php :

<?php

use Alura\Pdo\Domain\Model\Student;

require_once 'vendor/autoload.php';

$databasePath = __DIR__ . '/dataBase.sqlite';
$pdo = new PDO('sqlite:' . $databasePath);

$student = new Student(
    null,
    'Paulo Coradini',
    new \DateTimeImmutable('1991-05-09')
);

$sqlInsert = "INSERT INTO students (name, birthDate) VALUES (:name, :birthDate);";
$statement = $pdo->prepare($sqlInsert);
$statement->bindValue(':name', $student->name());
$statement->bindValue(':birthDate', $student->birthDate()->format('Y-m-d'));

if ($statement->execute()){
    echo "Aluno incluído" . PHP_EOL;
}
echo $sqlInsert . PHP_EOL;
var_dump($pdo->exec($sqlInsert));

Quando eu dou um var_dump no $studentDataLista em "lista-alunos.php" ele me retorna isso:

array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(14) "Paulo Coradini"
    ["birthDate"]=>
    string(10) "1991-05-09"
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(1) "2"
    ["name"]=>
    NULL
    ["birthDate"]=>
    NULL
  }
}

E sempre que executo novamente o "adicionar-aluno.php", é adicionado 2 itens a mais:

Quando o "adicionar-aluno.php" é executado 2 vezes, o var_dump no "lista-alunos.php" retorna isso:

array(4) {
  [0]=>
  array(3) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(14) "Paulo Coradini"
    ["birthDate"]=>
    string(10) "1991-05-09"
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(1) "2"
    ["name"]=>
    NULL
    ["birthDate"]=>
    NULL
  }
  [2]=>
  array(3) {
    ["id"]=>
    string(1) "3"
    ["name"]=>
    string(14) "Paulo Coradini"
    ["birthDate"]=>
    string(10) "1991-05-09"
  }
  [3]=>
  array(3) {
    ["id"]=>
    string(1) "4"
    ["name"]=>
    NULL
    ["birthDate"]=>
    NULL
  }
}

Alguém saberia me dizer o porque está acontecendo isso?

3 respostas

Quald o conteúdo de "lista-alunos.php" ?

Pouco depois que postei resolvi fazer um debug manual e descobri que o problema era o "var_dump($pdo->exec($sqlInsert));" no final do "inserir-aluno.php", que adicionava o array com 'name' e 'birthDate' como null.

Mas ta aí o código do "lista-alunos.php"

<?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'])
    );
}

var_dump($studentList);

Havia encontrado uma solução usando "$statement = $pdo->query('SELECT * FROM students WHERE name<>"" ;'); " mas não fiquei contente aí fui fazer o tal debug que mencionei.

Aahh, não tinha visto aquele $pdo->exec. Erro meu. Sim, você estava rodando o INSERT 2x daquela forma.