1
resposta

[Dúvida] Arquivo sempre sobrescrito

Notei que cada vez que rodava o código de exemplo através do botão no html ele apresentava a página que o php gerava vazio, e também que sempre reescrevia totalmente o arquivo, como não sei se existe um parâmetro de append para o file_put_contents, tentei através do código abaixo fazer esse apend na mão, mas queria saber como fazer ele da maneira correta. Também adicionei uma mensagem de retorno.

<?php

#variavel que recebe os dados de uma mensagem http pelo método post
$filme_post = [
    'nome' => $_POST['nome'],
    'anoLancamento' => $_POST['ano'],
    'nota' => $_POST['nota'],
    'genero' => $_POST['genero'],
];

$caminhoArquivo = __DIR__ . '/filme.json';

$conteudoArquivoFilme = file_get_contents ($caminhoArquivo);

$filme = json_decode($conteudoArquivoFilme, true);

array_push($filme,$filme_post);

file_put_contents($caminhoArquivo,json_encode($filme));

echo 'enviado com sucesso';
1 resposta

Bom dia, Mauricio! Tudo bem?

No PHP, você pode usar a função file_put_contents com a flag FILE_APPEND para adicionar conteúdo a um arquivo existente sem o sobrescrever. Aqui está como você pode ajustar seu código para fazer isso:

<?php

// Variável que recebe os dados de uma mensagem HTTP pelo método POST
$filme_post = [
    'nome' => $_POST['nome'],
    'anoLancamento' => $_POST['ano'],
    'nota' => $_POST['nota'],
    'genero' => $_POST['genero'],
];

$caminhoArquivo = __DIR__ . '/filme.json';

// Verifica se o arquivo já existe e lê seu conteúdo
if (file_exists($caminhoArquivo)) {
    $conteudoArquivoFilme = file_get_contents($caminhoArquivo);
    $filmes = json_decode($conteudoArquivoFilme, true);
} else {
    $filmes = [];
}

// Adiciona o novo filme ao array existente
$filmes[] = $filme_post;

// Salva o array atualizado de volta no arquivo JSON
file_put_contents($caminhoArquivo, json_encode($filmes, JSON_PRETTY_PRINT));

echo 'Enviado com sucesso';

Destaque direto para o que foi alterado no código:

  1. Verificação da existência do arquivo: antes de tentar ler o conteúdo do arquivo, verificamos se ele já existe com file_exists($caminhoArquivo). Se não existir, inicializamos $filmes como um array vazio.

  2. Adição ao array: em vez de usar array_push, simplesmente adicionamos o novo filme ao array $filmes usando [].

  3. Salvamento com file_put_contents: salvamos o array atualizado de volta no arquivo JSON. Usei a flag JSON_PRETTY_PRINT para tornar o JSON mais legível, mas isso é opcional.

Dessa forma, cada vez que você enviar o formulário, o novo filme será adicionado ao final do arquivo JSON, sem sobrescrever os dados existentes.

Espero ter ajudado e bons estudos!

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