Problem with system loading using "fopen"

Asked

Viewed 22 times

0

 if($tarefa<> NULL && $data <> NULL){
     salvarTarefa($tarefa,$descricao,$data);
 }
 if($conclusao<>NULL){
     salvarConclusao($conclusao);
 }
 gerarColunasLinhas();

I am using these commands to generate a table, according to the tasks being saved, my problem is that I can save the Task, but when I click to save, the columns are generated without updating, having to refresh the page again to show the data. I don’t know if the problem is with the "delay", until I save the record. I’m using POST.

/*A função gerarID() está fazendo com que a página tenha que ser atualizada novamente, caso remova funcionara normalmente. O gerarID era uma função a parte que gerava um ID para a tarefa, porém decidi colocar tudo em salvarTarefa, na tentativa de conseguir gerar o ID fazendo com que a página carregasse normalmente.*/
    function salvarTarefa($tarefa,$descricao,$data){
        $filesize = filesize("teste.txt");
        if($filesize>0){
            $linhas = coletarLinhas();
            $ID = count($linhas) - 1;
        }else{
            $ID = 0;
        }       
        $row = "$tarefa , $descricao , $data , 0 -$ID \n ";         
        $handle = fopen("teste.txt","a");
        fwrite($handle,$row);
        fclose($handle);
    }
/*Distribuirá cada array de tarefa em um TR e cada dado desse array em um TD.*/
    function gerarColunasLinhas(){
        $tarefas = listarTarefas();
        if($tarefas<>NULL){
            foreach($tarefas as $indice => $tarefa){
                $estado = $tarefa['estado'];
                echo "<tr>\n";
                echo "<td class='numero'>".$indice."</td>\n";
                echo "<td>".$tarefa['nome']."</td>\n";
                echo "<td>".$tarefa['descricao']."</td>\n";
                echo "<td>".$tarefa['data']."</td>\n";
                echo gerarCheckBox($estado)."\n";
                echo "</tr>";
            }
        }
    }
    /*Distribuirá os arquivos em um Array com um Array para cada Tarefa*/
function listarTarefas(){       
    $opcoes = coletarLinhas();
    $tarefas = [];

    if($opcoes<>NULL){
        foreach($opcoes as $linha){
            $linha = explode("\n",$linha);
            $tarefas[] = gerarTarefa($linha);
        }
        return $tarefas;
    }
}
/*Pegará todas os dados do arquivo.*/
function coletarLinhas(){
    $handleRead = fopen("teste.txt","r"); 
    $x = (int)filesize("teste.txt");
    if($x <> NULL){
        $resultados = fread($handleRead,$x);
        $explode = explode("\n",$resultados);
        return $explode;
    }
}
  • I see that you read up to the filesize of the file. This can be cached. Try giving a clearstatcache() before reading.

  • Wow, that didn’t even cross my mind, thank you very much! How can I give some kind of "Upvote" to you?

  • I will post the solution as an answer, so it is recorded for others who have the same problem ;)

  • Okay! Thank you, really!

1 answer

1


The problem is in the function that does the reading. It will read the file until the size returned by filesize("teste.txt"). That function filesize is one of PHP’s cache to try to be faster, and so you are getting the old file size. You need to give a clearstatcache() before the filesize:

function coletarLinhas(){
    clearstatcache();
    $handleRead = fopen("teste.txt","r"); 
    $x = (int)filesize("teste.txt");
    if($x <> NULL){
        $resultados = fread($handleRead,$x);
        $explode = explode("\n",$resultados);
        return $explode;
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.