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

Inserindo com exec e retorna bool(false)

Olá galera,

Estou executando o inserir-aluno.php e ele está apresentando a mensagem: bool(false) ao invés da confirmação que funcionou (como explica no video).

Não consegui encontrar onde estou errando. Se puderem me ajudar por favor.

Segue meu código

<?php

use Alura\Pdo\Domain\Model\Student;

require_once 'vendor/autoload.php';

$databasePath = DIR . '/banco.sqlite'; $pdo = new PDO(dsn:'sqlite:' . $databasePath);

$student = new Student(id:null, name:'Marcos dos Santos', new \DateTimeImmutable(time:'1987-06-03'));

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

var_dump($pdo->exec($sqlInsert));

5 respostas

Marcos, você parece ter colocado alguns caracteres inválidos no seu código. Ex.:

$pdo = new PDO(dsn:'sqlite:' . $databasePath);

Esse dns: não faz parte do código (a menos que você esteja usando a versão 8 do PHP).

Outra coisa: Sua constante __DIR__ parece ter sido informada incorretamente. Ou foi apenas formatação aqui da plataforma? Sempre coloque os códigos aqui entre 3 crases para que ele seja formatado como código.

Estranho o erro ser apenas o retorno como false.

Quando corrigir o código, faça um echo $sqlInsert e verifique se a query está formada corretamente...

Ah, a tabela students existe nesse banco? Você a criou com sucesso?

Olá,

Primeiro desculpe, esqueci de colocar formatado o código. Coloquei agora abaixo.

Executei o echo $sqlInsert`e ele retornou INSERT INTO students (name, birth_date) VALUES ('Marcos dos Santos', '1987-06-03');

Já quanto a criação da tabela, eu executei conforme o vídeo, mas posso ter feito algo errado. Como posso conferir se a tabela foi criada ?

<?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, 'Marcos dos Santos', new \DateTimeImmutable('1987-6-3'));

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

var_dump($pdo->exec($sqlInsert));
solução!

Sem problemas, Marcos.

Você pode abrir esse arquivo de banco de dados usando algum cliente como o próprio sqlite3, DBeaver ou pelo PHPStorm, que é como eu faço. Basta ir em Databases e adicionar uma nova data source do tipo SQLite. Aí escolhe esse arquivo como caminho. Assim você vai poder verificar a estrutura do banco.

O arquivo de conexão que criou a tabela usou o mesmo caminho que esse arquivo que está se conectando agora pra fazer o INSERT? Não estão usando bancos diferentes?

Logo depois de criar a conexão com PDO, adiciona essa linha:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Mais pra frente no treinamento você vai entender melhor essa linha. ;-)

Opa,

Fiz o que recomentou e realmente não havia criado a tabela. Fui verificar o código de criação da tabela, e estava errado mesmo rsrsr.

Agora funcionou. Só acabei inserindo duas vezes o "estudante" rsrsr.

Obrigado professor.

Show de bola, Marcos. Mais pra frente no curso você vai aprender a analisar os erros. :-)