1
resposta

Problema de "WARNING Trying to access array offset ... " - Nova visão

Saudações! Duas questões, a primeira, é que estou tendo um problema parecido com o do colega anterior, mas a resposta que vi na questão dele não me atendeu. No meu caso, copiei o arquivo exatamente como o professor. Acessando pelo botão "editar", não há erro nenhum, o id com o vídeo selecionado carrega normalmente para edição. Porém eu me perguntei: "quando aquele "if" no HTML (código abaixo) seria usado, se ao clicar no botão "editar", o id sempre virá correto?" - essa seria a segunda questão.

 <form class="container__formulario"
                action="<?= $id !== false ? "/editar-video.php?id=" . $id : "/novo-video.php"; ?>"
                method="post">

Então resolvi acessar pelo navegador, na url colocando um "id" que ainda não existisse, para forçar a trocar de "action" ao usar a página de editar para mandar um novo vídeo:

http://localhost:8000/formulario.php?id=7

Mas então é nesse momento que não aparece o valor "default" preenchido no começo do arquivo "formulário.php":

$video = [
    'url' => '',
    'title' => '',
];

...sendo que, ao invés de ficar vazio, ele traz essa mensagem: "Warning: Trying to access array offset on value of type bool in... " Na resposta anterior ao colega, foi dito que o erro poderia ser da consulta no PDO, porém, no meu caso, isso não se aplicar, pois esses valores no input não foram preenchidos pelo banco. Então, aí fica a minha questão: por que os valores default não estão sendo preenchidos? Obrigado.

1 resposta

Olá Giuli, tudo bem?

Sobre a sua dúvida:

Por que os valores default não estão sendo preenchidos

Esse é um detalhe sobre o retorno do método fetch, olhe o trecho abaixo:

if ($id !== false) {
    $statement = $pdo->prepare('SELECT * FROM videos WHERE id = ?;');
    $statement->bindValue(1, $id, PDO::PARAM_INT);
    $statement->execute();

     $video = $statement->fetch(\PDO::FETCH_ASSOC);
    
}

O método fetch se ele não encontrar nenhum resultado ele retorna false.

Por isso que quando você força a ele buscar um id que não existe no banco de dados, ele te retorna falso para a variável $video e o PHP te retorna o seguinte erro:

Warning: Trying to access array offset on value of type bool in... "

Para você contornar essa situação, você pode fazer uma verificação desse valor retornado do método fetch, ou seja, se o valor retornado for diferente de false, você irá atribuir o valor a variável $video. Vou te mandar a forma que eu implementei.

<?php

$dbPath = __DIR__ . '/banco.sqlite';
$pdo = new PDO("sqlite:$dbPath");

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

$video = [
    'url' => '',
    'title' => '',
];

if ($id !== false) {
    $statement = $pdo->prepare('SELECT * FROM videos WHERE id = ?;');
    $statement->bindValue(1, $id, PDO::PARAM_INT);
    $statement->execute();

     $result = $statement->fetch(\PDO::FETCH_ASSOC);
    //criei uma outra variável para receber o valor, e faço a verificação em cima dela.
    if($result !== false){
        $video = $result;
    }
    
}

?>

Acredito que realizando essa adaptação, o seu código irá funcionar :)

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓

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