Visualizzazione risultati 1 fino 18 di 18

Discussione: [PHP] Ricreare file con contenuto vuoto

  1. #1
    Guest

    Predefinito [PHP] Ricreare file con contenuto vuoto

    Ciao a tutti, ho un piccolo "script" per delle note dove ogni volta che si modifica tramite fopen viene usata l'opzione wt. Adesso quando invece si cancella tutto (quindi la variabile $_POST["testo"] è vuota, empty!) quest'ultimo non si modifica e il contenuto rimane. Perchè? Grazie mille. Ciao, Davide! ^^
    Codice PHP:
    $text = htmlspecialchars($_POST["notes"]);
    $text = str_replace("\r\n","\n",$text);

    $fo = fopen("altro/notes.txt","wt");
    $fw = fwrite($fo,$text);
    fclose($fo);

    if(
    $fo && $fw) { header("Location: index.php"); }
    else { echo
    "<p>Errore!</p>\n"; }

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Confusione nell'aria: 't' ( e 'b' ) hanno senso solo sotto Windows - quindi magari in locale, ma non su AV. Inoltre lo scopo di 't' è quello di trasformare \r\n in \n senza che lo debba fare tu... eppure lo fai subito sopra.

    L'if per controllare se il file è stato aperto viene fatto in un punto a caso - se non riesci ad aprire il file, non catturi l'errore -

    Codice PHP:
    if ($fo = fopen( ... ) ) {
    $fw = fwrite($fo, $text);
    fclose($fo);
    }
    Inoltre fwrite ti restituirà il numero di byte scritti nel file. Se non scrivi nulla, ti restituisce zero, che fa fallire il controllo if (... $fw) anche se l'operazione è andata a buon fine.

    Alla fine di tutto, aprire il file e chiuderlo anche senza scriverci dentro dovrebbe svuotarlo - questo effettivamente non succede, o vedi solo il tuo messaggio di errore?

  3. #3
    Guest

    Predefinito

    Allora... io sto usando lo script in locale e per quanto riguarda quello di \r\n non lo sapevo xD
    Comunque se io cancello tutto il contenuto dal textarea e clicco su salva questo salvataggio si effettua (poiché non mostra "Errore"), ma il contenuto rimane sempre lo stesso! °>°
    E' questo il problema! =(
    ...poi volevo dire che con quell'if non controllo se il file si apre ma bensì se si è aperto e si è scritto qualcosa ^^

  4. #4
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    ...poi volevo dire che con quell'if non controllo se il file si apre ma bensì se si è aperto e si è scritto qualcosa ^^
    Non so se hai letto quello che ha scritto dreadnaut:

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    Inoltre fwrite ti restituirà il numero di byte scritti nel file. Se non scrivi nulla, ti restituisce zero, che fa fallire il controllo if (... $fw) anche se l'operazione è andata a buon fine.
    Tu vuoi svuotare il file, in questo modo non inserirai nessun dato nel file e quindi fwrite resituisce 0. In php 0 corrisponde a false che andrà a fallire la condizione.

  5. #5
    Guest

    Predefinito

    Sisi avevo letto ma non cambia niente come pensavo! =(
    Cioè è come se ci sia un redirect è strano... mmm ho provato anche con file_put_contents ma il risultato è lo stesso! °>°
    Ecco il codice... Grazie mille!! ^^
    Codice PHP:
    if($_POST["notes"]) {

    $text = htmlspecialchars($_POST["notes"]);
    $text = str_replace("\r\n","\n",$text);

    /*
    $c = file_put_contents("altro/notes.txt",$text);

    if($c) { header("Location: ?a=notes"); }
    else { echo "<p>Errore!</p>\n"; }
    */

    if ($fo = fopen("altro/notes.txt","wt") ) {
    $fw = fwrite($fo, $text);
    fclose($fo);
    } else { echo
    "<p>Errore</p>"; }

    /*
    $fo = fopen("altro/notes.txt","wt");
    $fw = fwrite($fo,$text);
    fclose($fo);

    if($fo && $fw) { header("Location: ?a=notes"); }
    else { echo "<p>Le note non sono state aggiornate!</p>\n"; }
    */
    }

  6. #6
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Per file_put_contents vale lo stesso discorso di fwrite.
    Comunque consultare il manuale di php è sempre una buona cosa:
    Citazione Originalmente inviato da file_put_contents
    The function returns the number of bytes that were written to the file, or FALSE on failure.
    Codice PHP:
    $c = file_put_contents("altro/notest.txt", $text);

    if(
    $c === false) {
    echo
    "<p>Errore!</p>\n";
    } else {
    header("Location: ?a=notes");
    }

  7. #7
    Guest

    Predefinito

    Ok xD Ma non è quello che voglio io... non funziona! =(
    Codice PHP:
    if($c == FALSE) {
    unlink("altro/notes.txt");
    $fo = fopen("altro/notes.txt","wt");
    fclose($fo);
    }
    else {
    header("Location: ?a=notes"); }
    Ho provato anche a fare var_dump do $text ma non riesce a vedere una stringa vuota... sembra tornare indietro o lasciare il precedente $notes (nuovo: $text)... invece mettendo uno spazio spunta string(1) " "... ma non voglio che sia così >.>

  8. #8
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    La condizione:
    Codice PHP:
    if($c == FALSE)
    Corrisponde a: Se non è stato scritto nessun dato nel file notes.txt .
    Perchè come ti ho detto sopra 0 == FALSE è una condizione vera, ma 0 === FALSE restituisce false...

    Anche se in teoria la condizione corrisponde a quello che vuoi fare penso sia inutile cancellare e ricreare il file, quando con queste righe:

    Codice PHP:
    $c = file_put_contents("altro/notest.txt", $text);

    if(
    $c === false) {
    echo
    "<p>Errore!</p>\n";
    } else {
    header("Location: ?a=notes");
    }
    Lo script prova a scrivere nel file. Se la funzione file_put_contents non fallisce ti reindirizza verso ?a=notes indipendentemente dal numero di bytes che scriverà.
    Ultima modifica di javascripter : 19-07-2010 alle ore 11.56.07

  9. #9
    Guest

    Predefinito

    Si ok, ma io voglio che quando il $text sia vuoto venga aggiornato lo stesso il file anche se è vuoto xD
    Non voglio creare una condizione se è stato scritto o meno! ;)
    Non so' se hai capito cosa voglio fare! .-. Grazie mille....

    Edit: ecco uno "schema"...

    $text -> note

    $text == vuoto -> aggiorno lo stesso (cancello tutto il contenuto e non scrivo niente... file vuoto)

    azione: aggiorno il file notes.txt
    sennò: errore nell'aggiornamento
    Ultima modifica di sIM : 19-07-2010 alle ore 12.13.14

  10. #10
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Esattamente quello che fanno queste righe di codice:
    Codice PHP:
    $c = file_put_contents("altro/notes.txt", $text);

    if(
    $c === false) {
    echo
    "<p>Errore!</p>\n";
    } else {
    header("Location: ?a=notes");
    }
    Spero di non dover ripetere ancora lo stesso codice.
    Se $text è vuoto, notes.txt verra svuotato.
    Ultima modifica di javascripter : 19-07-2010 alle ore 15.08.10

  11. #11
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Le righe sono quelle. Se non vengono eseguite correttamente, vuol dire che non ci arrivi, o che ci arrivi con i parametri sbagliati. Metti echo ovunque e verifica che il codice venga effettivamente eseguito.

  12. #12
    Guest

    Predefinito

    Niente da fare... non funziona! =(
    Effettua il redirect ma $text rimane sempre lo stesso... ecco il codice intero:
    Codice PHP:
    <?

    $notes
    = file_get_contents("altro/notes.txt");

    if(
    $_POST["notes"]) {

    $text = $_POST["notes"];

    $c = file_put_contents("altro/notes.txt", $text);

    if(
    $c === false) { echo "<p>Errore!</p>\n"; }
    else {
    header("Location: ?a=notes"); }

    } else {
    ?>
    <form method="post">
    <p>Inserisci qui tutto quello che vuoi... <span class="floatright"><input type="submit" value=" Salva le note " /></span></p>
    <p class="center"><textarea rows="25" cols="120" name="notes"><?=$notes?></textarea></p>
    </form>
    <? } ?>
    Grazie mille! .-.

  13. #13
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Io ti dico solo una cosa: controlla bene questa condizione:
    Codice PHP:
    if($_POST["notes"]) {
    Un altro aiuto: '' == 0, è una condizione vera ( '' => stringa vuota ).
    Ultima modifica di javascripter : 19-07-2010 alle ore 20.13.10

  14. #14
    Guest

    Predefinito

    quindi... if(isset($_POST["notes"])) ? Grazie mille...

  15. #15
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Citazione Originalmente inviato da sIM Visualizza messaggio
    quindi... if(isset($_POST["notes"])) ? Grazie mille...
    Certo.

  16. #16
    Guest

    Predefinito

    Ok grazie mille... adesso sto usando Heredoc in un echo ma questo non funziona! =(
    Codice PHP:
    echo <<<EOT
    <form method="post">
    <p><b>Titolo</b><br /><input type="text" size="122" name="titolo" value="
    {$list[1]}" /></p>
    <p><b>Data</b><br /><input type="text" size="30" name="data" value="
    {$data}" /> <input type="text" size="30" name="ora" value="{$ora}" /> <span class="floatright"><input type="submit" value=" Salva il post " /></span></p>
    <p><textarea id="testo" name="testo" rows="20" cols="120">
    {$list[2]}</textarea></p>
    </form>
    EOT;
    Grazie mille... il codice è corretto perchè mettendo ' ' funziona... solo che vorrei provare con Heredoc! =D
    Ultima modifica di sIM : 20-07-2010 alle ore 14.48.07

  17. #17
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Dalla pagina che hai linkato:
    It is very important to note that the line with the closing identifier must contain no other characters, except possibly a semicolon (;). That means especially that the identifier may not be indented

  18. #18
    Guest

    Predefinito

    Ok... non ha molto senso però lo accetto! =D
    Ultima modifica di sIM : 20-07-2010 alle ore 20.12.42

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •