• User

    Approfitto ancora una volta della vostra competenza per un ultimo suggerimento.
    Sempre considerando il file di testo oggetto della discussione, vorrei sapere se sarebbe possibile creare un form tramite il quale un utente possa cancellare direttamente la riga corrispondente ai suoi dati. Qualcosa di simile per intenderci:

    [HTML]<form class="form-contact" action="action.php" method="post" enctype="multipart/form-data">

    <p><label>Nome:<br></label><input type="text" name="name"/></p>

    <p><label>Password:<br></label><input type="text" name="password"/></p>

    <input class="button" type="submit" value="Delete">

    </form>[/HTML]

    Considerando che nel file di testo data.txt e nella riga di esempio:

    Laura;xxxxxxxxxxxxxxxxxxx;2019-03-30

    lo spazio occupato dalle crocette equivale alla password criptata.
    In pratica, vorrei sapere cosa mettere nel file action.php per ottenere questo risultato.

    Di nuovo, immensamente grazie


  • Moderatore

    Ciao Cosina. L'esempio che avevo scritto in precedenza, lo puoi piegare in base alle tue esigenze aggiungendo o rimuovendo parti che possano tornarti utili.
    Il procedimento è il medesimo della data: Si effettua un riconoscimento tramite una condizione e in caso di esito positivo, non riscriviamo la riga nel file. Questo è il sunto, così apprendi meglio la logica. Questo è il codice d'esempio:

    [PHP]
    // recuperi i parametri in POST
    // Quindi prima di tutto effettui un controllo se POST è valorizzato, in caso contrario, non fai nulla
    if( $_POST != null ) {

    // a questo punto recuperiamo i dati
    $name = $_POST['name'];
    $pass = $_POST['password'];
    
    // ora eseguiamo lo stesso identico processo realizzato in precdenza
    // modificando i parametri di confronto
    
    $txt_file    = file_get_contents('path/to/file.txt');
    $rows        = explode("\n", $txt_file);
    
    unlink('path/to/file.txt');
    $new_file = fopen('path/to/file.txt', 'a+');
    foreach($rows as $row)
    {
        $data = explode(';', $row);
        //esempio, se il tuo valore data è la terza occorrenza
        if( $data[0] == $name && $data[1] == $pass ) {
            // non faccio nulla
        } else {
            fwrite( $new_file, $row . "\n" );
        }
    
    }
    fclose( $new_file );  
    

    }
    [/PHP]
    Detto questo però, dovresti dover aggiungere diversi controlli sui campi, così da non creare confusioni o tentativi malevoli di esecuzione del tuo script.
    Mi raccomando: prima di qualsiasi test, effettua sempre un backup dei dati, perchè il sistema, prima cancella e poi riscrive il file.
    Ciao e fammi sapere.


  • User

    Grazie, tu non sai quanto mi piaccia imparare cose nuove! Tranquillo, quanto alla sicurezza ho tutto sotto controllo nei form attivi; piuttosto esagero, ma non sottovaluto mai in questo campo. Grazie mille di nuovo, sei super :smile5:


  • User

    @Ultima said:

    [PHP]
    // recuperi i parametri in POST
    // Quindi prima di tutto effettui un controllo se POST è valorizzato, in caso contrario, non fai nulla
    if( $_POST != null ) {

    // a questo punto recuperiamo i dati
    $name = $_POST['name'];
    $pass = $_POST['password'];
    
    // ora eseguiamo lo stesso identico processo realizzato in precdenza
    // modificando i parametri di confronto
    
    $txt_file    = file_get_contents('path/to/file.txt');
    $rows        = explode("\n", $txt_file);
    
    unlink('path/to/file.txt');
    $new_file = fopen('path/to/file.txt', 'a+');
    foreach($rows as $row)
    {
        $data = explode(';', $row);
        //esempio, se il tuo valore data è la terza occorrenza
        if( $data[0] == $name && $data[1] == $pass ) {
            // non faccio nulla
        } else {
            fwrite( $new_file, $row . "\n" );
        }
    
    }
    fclose( $new_file );  
    

    }
    [/PHP]

    Ciao, sono ancora qui per una pignoleria. Il codice in oggetto funziona benissimo e mille grazie di nuovo a Ultima. Quando si cancella la riga, pero, rimane al suo posto lo spazio vuoto, cioe una riga vuota. Questo e inevitabile, o si puo eliminare lasciando, comunque, le righe incolonnate com'erano? Non e` una cosa grave, ma tanto per saperlo. Grazie ancora


  • Moderatore

    Ciao cosina. Fai bene ad essere pignola in questo lavoro.
    Io purtroppo quella porzione di codice l'ho scritta al volo diciamo da "spunto" più che da vera e propria soluzione. Per sistemarla completamente, dovrei fare dei test e fare il debug con il tuo file reale e cercare di capire dove scrive la riga vuota e soprattutto perchè.
    La sola cosa che mi viene da dirti è di aggiungere un controllo prima della funzione fwrite per verificare che $row non contenga un vuoto. Una cosa tipo questa:
    [PHP]
    if( $row != '' or ! empty($row) or $row != ' ' ) {
    fwite( $new_file, $row . "\n" );
    }
    [/PHP]
    Però ripeto, dovrei fare qualche debug sul file reale.
    Te, hai trovato rimedio?


  • User

    Ciao, non ho ancora trovato il rimedio. Sto cercando. Proprio adesso leggevo questa discussione: //stackoverflow.com/questions/17137286/remove-blank-lines-from-a-text-file , ma non ci capisco molto..
    Comunque la riga vuota, nel nuovo file txt, appare esattamente dove, nel file originario, c'era quella che viene cancellata


  • User

    Aspetta, pero. che faccio qualche altro test, perche non lo fa sempre, devo capire.


  • User

    Ok, credo di aver capito e risolto. Per fare i test utilizzavo l'ultima riga e, quando veniva scritta la riga successiva, saltava uno spazio. Se lo faccio sulle righe intermedie, invece, le scala correttamente. Dato che quelle da cancellare saranno sempre le righe piu` in alto, il problema non si pone. Grazie mille, sei stato gentilissimo. Ciao


  • Moderatore

    Bene, hai risolto!!!!
    Son contentissimo. 🙂


  • User

    Merito tuo per tutto, sei un grande!