1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Escrever num file em PHP

Discussão em 'Web Development' iniciada por joaopj, 26 de Agosto de 2007. (Respostas: 14; Visualizações: 968)

  1. joaopj

    joaopj Power Member

    Boas,
    Eu gostaria de saber como posso escrever no fim de um file *.php.
    Eu sei como escrever num file normal, no fim:
    PHP:
    $fileaberto fopen('file.php''a'); // Abrir um file no modo append, onde o cursor está posicionado no fim do file.
    fwrite($fileaberto$conteudo); // Escrever o $conteudo no fim do file
    Mas a questão é que o file.php, será basicamente assim:
    PHP:
    <?php ?>
    E eu preciso que o "?>" continue no fim do file...

    Resumindo, eu preciso de escrever no file, antes do "?>"
    Como é que eu faço ?

    Obrigado
     
  2. napalm

    napalm Power Member

    Código:
    fseek($fp, -2, [B]SEEK_CUR)[/B]
    não testei, mas em teoria deve funcionar.
     
  3. joaopj

    joaopj Power Member

    Não funcionou... mas obrigado pela função, vou investigá-la....
     
  4. karva

    karva Power Member

    Hey, podes fazer:

    $file_aberto = file_get_contents("http://");

    $conteudo = str_replace("?>","", $file_aberto);

    $conteudo .= "?>";
    file_put_contents($conteudo);


    PS: isto só funciona se o ficheiro só tiver 1 ?>
     
  5. joaopj

    joaopj Power Member

    Secalhar eu não estou a usar o fseek correctamente....

    PHP:
    <?php
    $filename 
    '../includes/posts.php';
    include 
    $filename;
    $newpost count($posts)+1;

    $content '$posts['.$newpost.'] = array("'.$_POST["title"].'","'.$_POST["body"].'","'.$_POST["date"].'");';


    if (
    is_writable($filename)) {
        if (!
    $handle fopen($filename'a')) {
             echo 
    "Não foi possivel abrir o file ($filename)";
             exit;
        }

    fseek($handle, -2SEEK_CUR);

        if (
    fwrite($handle$content) === FALSE) {
            echo 
    "Não foi possivel escrever no file ($filename)";
            exit;
        }

        echo 
    "Sucesso, o blog foi actualizado";
        
    fclose($handle);

    } else {
        echo 
    "Não é possivel escrever em $filename";
    }
    ?>
    Isto tudo funciona correctamente, mas é escrito sempre depois do "?>"...

    Vou exprimentar a alternativa do karva...
     
  6. joaopj

    joaopj Power Member

    Consegui um avanço...

    Se eu usar
    PHP:
    $handle fopen($filename'r+'); 
    (reparem que mudei o modo de append para "'r+' Open for reading and writing; place the file pointer at the beginning of the file.")

    E depois
    PHP:
    fseek($handle, -2SEEK_CUR);
    (SEEK_END - Set position to end-of-file plus offset. (To move to a position before the end-of-file, you need to pass a negative value in offset.) )

    E acontece que o "?>" é substituido pelo conteúdo que eu pretendo adicionar.... Por isso adicionei ?> no fim do conteúdo que pretendo adicionar, e está a funcionar...

    Acham que isto é uma solução certa ?
    Há melhor a fazer ?
    Obrigado
     
  7. CoolMaster

    CoolMaster Power Member

    Eu acho que nem sequer necessitavas de escrever um .php ! Pelo que percebo queres gravar info de registos num .php para depois o incluir e aceder aos arrays.
    Tenho uma sugestão melhor!

    Que tal fazeres serialize array (não obrigatório mas esta é uma das razões dele existir) e gravas esse array serialized para o ficheiro (pode ser .txt) ? Vais fazendo append dele, cada linha tem um array serialized. Nem precisas de saber index (caso não necessites mesmo) nem nada.
    Para puxares o conteudo é simples, lês linha a linha do ficheiro, para cada linha fazes o unserialize e fazes append daí para um array, depois disto já tens um array construido e podes trabalhar nele.

    Outra forma eficiente é usares ficheiros binários para gravar o conteúdo do array e depois é so leres "bináriamente" o ficheiro para a memoria e esta feito.


    Qualquer uma destas duas soluções parece-me melhor do que criar .php para esta situação, claro que a decisão é tua.
     
  8. joaopj

    joaopj Power Member

    Muito obrigado :)
    Eu fui por aquela solução porque era a única que estava a ver em mente... Nunca programei em PHP antes hehehe... (e em outras linguagens, só alguns meses de Pascal e umas brincadeiras em Python)... sou mesmo um newbie, e obrigado pelas duas alternativas, vou tentar fazer a primeira.

    Mais tarde, pretendo arranjar maneira de guardar tudo em databases de SQLite, mas não entendo mesmo mesmo nada de bases de dados... Vou dar esta matéria na escola, mas é só no 12º ano e eu ainda estou no 11º... Mas vou estudar isto por uns tutorials quaisquer por aí como sempe fiz antes...

    E aproveitando, se algum de vocês conhecer um bom tutorial que dê uma introdução às bases de dados, por favor passem-me o link hehehe... Obrigado
     
    Última edição: 27 de Agosto de 2007
  9. CoolMaster

    CoolMaster Power Member

  10. joaopj

    joaopj Power Member

    Obrigado :)
    E mais uma dúvida:
    Agora que eu tenho um file posts.txt onde lá dentro tem um array "$posts", eu consigo ler os conteúdos do file, mas como é que eu vou poder contar quantos elementos tem o "$posts" para saber qual é o próximo espaço que posso preencher ?
     
  11. CoolMaster

    CoolMaster Power Member

    count($posts)
     
  12. joaopj

    joaopj Power Member

    Eu já tentei fazer isso, foi a primeira coisa, mas não consigo porque o file onde o array "$posts" está guardado é invocado assim: "$data = unserialize(file_get_contents('posts.txt'));" e tudo o que está lá dentro é um string....
     
  13. CoolMaster

    CoolMaster Power Member

    Agora estou confuso, tu alteraste isso para texto serialized ou mantiveste o esquema anterior? Estou a ver que mudaste, então se mudaste a variavel que tem os dados é $data . A minha ideia era um pouco diferente, não fazer serialize a todo o posts mas sim fazer elemento a elemento em cada linha, mas dessa forma tambem dá.
     
  14. mcog_blaster

    mcog_blaster Power Member

    Nao consegues fazer um "cast" para array dessa string ?
    Esse metodo de guardar é um pouco estranho.
     
  15. joaopj

    joaopj Power Member

    Olhem, eu também estou a ficar confuso, e vou vos mostrar todo o mecanismo que eu consegui pôr a funcionar:
    1º o file onde estão armazenados todos os posts:
    PHP:
    <?php
    // Formato do array:   $posts[numerodopost] = array('título','corpo','data');
    $posts[1] = array('title1','post text1','data1');
    $posts[2] = array('title2,'post text2','data2');
    $posts[3] = array('
    title3','post text3','data3');
    $posts[4] = array('
    title4','post text4','data4');
    ?>
    2º, o file que lê os posts do file acima, e exibe-os em HTML:
    PHP:
    <?php
         
    include 'posts.php';
         
    $nposts count($posts);

         if (
    $nposts<1) { echo '<h2>Ainda não há posts no blog</h2>'; exit; } else {
             if (empty(
    $_GET['post'])) {
             if(
    $nposts<5) {$fim $nposts;}    else {$fim $nposts-4;}
                   for (
    $id=$nposts;$id>=$fim;$id--) {
                 print 
    '<div class="item"><h4><a href="?p=blog&amp;post='.$id.'">'$posts[$id][0] .'</a></h4><p>'$posts[$id][1] .'</p><p style="font-size:80%">'.$posts[$id][2].'</p></div><br class="c1" />';
                 }
                 }

                 else {
                 
    $n $_GET['post'];
                 print 
    '<div class="item"><h4><a href="?p=blog&amp;post='.$n.'">'$posts[$n][0] .'</a></h4><p>'$posts[$n][1] .'</p><p style="font-size:80%">'.$posts[$n][2].'</p></div><br class="c1" />';
                 }

                 print
    '<h3>Outros posts:</h3>';
                 for (
    $id=1;$id<$nposts+1;$id++) {
                print 
    '<a href="?p=blog&amp;post='.$id.'">'$id .'</a> ';
                }
        }
    ?>
    3º e finalmente, o file que escreve os posts no file onde eles são armazenados (1º file) para posteriormente serem lidos (no segundo file):
    PHP:
    <?php
    $filename 
    '../includes/posts.php';
    if (
    is_writable($filename)) {
    if (!
    $handle fopen($filename'r+')) {
    echo 
    "Não foi possivel abrir o file ($filename)";
    exit;
    }


    include 
    $filename;
    $newpost count($posts)+1;

    $title $_POST["title"];
    $body $_POST["body"];
    $date $_POST["date"];

    $content "\n".'$posts['.$newpost.'] = array("'.$title.'","'.$body.'","'.$date.'"); ?>';

    fseek($handle, -2SEEK_END);

    if (
    fwrite($handle$content) === FALSE) {
    echo 
    "Não foi possivel escrever no file ($filename)";
    exit;
    }

    echo 
    "Sucesso, o blog foi actualizado";
    fclose($handle);

    } else {
    echo 
    "Não é possivel escrever em $filename";
    }
    ?>
    Isto foi a única coisa que eu consegui meter a funcionar até agora. Peço desculpas, suponho que devia ter mostrado tudo no início para ser mais facil...
    Estou consciente do quanto rudimentar o meu método é, mas é o único que eu consegui pensar. Sou muito muito novo no mundo da programação e do PHP.
    E agora ? O que me propõe ?
    Obrigado
     

Partilhar esta Página