• User

    Filtrare dati da DB testuali

    Buongiorno a tutta la comunity, come da titolo e possibile creare una cosa del genere senza ricorrere a MySql. Ovviamente lo scopo per me è puramente didattico quindi, i problemi di sicurezza al momento, li tengo in secondo piano. Entro nel dettaglio:

    1 Raccolgo i commenti da un form

    <html><head>
    <link rel="stylesheet" href="style.css" type="text/css" /> 
    </head>
    <body>
    <h2><a href="lettura.php">Torna alla lista degli articoli</a></h2>
    <form action="action.php" method="post">
    <label for="nome">Nome</label>
        <input type="text" id="nome" name="nome" />
    <label for="mail">La tua mail</label>
        <input type="text" id="mail" name="mail" />
    <label for="commento">Inserisci il tuo comento</label>
        <input type="text" id="commento" name="commento" />
    
    
        <input type="submit" name="scrivi" value="scrivi" />
    </form>
    </body>
    </html>
    

    2 invio ad action.php che mi salva i dati in un file *.txt

    <?phpinclude("../testu_mio/setting.php");
    
    
    /*************************
    SCRITTURA
    **************************/
    if(isset($_POST['scrivi']))
        {
        if(!is_writable($my_database_txt)){
            exit("il file non ha i permessi di scrittura!");
            }
        // riceviamo i dati e li filtriamo
        $bad_char = array("|", "\r\n", "\r", "\n");
        $nome = str_replace($bad_char, "", $_POST['nome']);
        $mail = str_replace($bad_char, "", $_POST['mail']);
        $commento = str_replace($bad_char, "", $_POST['commento']);
        $ip = $_SERVER['REMOTE_ADDR'];
        // apriamo il file
        $open = fopen($my_database_txt, "a+");
        // scriviamo i dati separati dal carattere separatore
        fwrite($open, $nome."|".$ip."|".$mail."|".$commento."\r\n"); 
        // chiudiamo il file  
    
    
        fclose($open);
        
        // ritorniamo nella pagina di visualizzazione
        header("location: lettura.php");
        exit;
        }
    
    
    
    
    /*************************
    ELIMINARE UN RIGO
    **************************/
    else if(isset($_GET['delete']))
        {
        // creiamo l'array con tutti i righi
        $array_righi = file($my_database_txt);
        // eliminiamo dall'array il rigo
        unset($array_righi[$_GET['delete']]);
        // apriamo il file resettando il contenuto
        $open = fopen($my_database_txt, "w");
        foreach($array_righi as $key => $value){
            // ri-scriviamo tutti i righi (rimanenti)
            fwrite($open, $value);
            }
        fclose($open);
        // ritorniamo nella pagina di visualizzazione
        header("location: letturamod.php");
        exit;
        }
    
    
    
    
    /************************
    MODIFICARE UN RIGO
    *************************/
    else if(isset($_POST['modifica']) AND isset($_POST['row_update']))
        {
        // creiamo l'array con tutti i righi
        $array_righi = file($my_database_txt);
        // riceviamo i dati e li filtriamo
        $bad_char = array("|", "\r\n", "\r", "\n");
        $nome = str_replace($bad_char, "", $_POST['nome']);
        $ip = str_replace($bad_char, "", $_POST['ip']);
        $mail = str_replace($bad_char, "", $_POST['mail']);
        $commento = str_replace($bad_char, "", $_POST['commento']);
        // ri-scriviamo il rigo (che sostituirà il precedente)
        $array_righi[$_POST['row_update']] = $nome."|".$ip."|".$mail."|".$commento."\r\n";
        // apriamo il file resettando il contenuto
        $open = fopen($my_database_txt, "w");
        foreach($array_righi as $key => $value){
            // ri-scriviamo tutti i righi
            fwrite($open, $value);
            }
        fclose($open);
        // ritorniamo nella pagina di visualizzazione
        header("location: letturamod.php");
        exit;
        }
    ?>
    

    3 vado a leggere il contenuto del file *.txt

    <html><head>
    <link rel="stylesheet" href="../testu_mio/style.css" type="text/css" /> 
    </head>
    <body>
    <h1>GuestBook</h1>
    <h2><a href="../testu_mio/form_insert.php">Inserisci una nuova recensione</a></h2>
    <?php
    include('../testu_mio/setting.php');
    $array_righi = file($my_database_txt);
    foreach($array_righi as $key => $commenti){
        list($nome, $ip, $mail, $commento) = explode("|", $commenti);
        
        echo '
            <p>
            Nome: ' .$nome. '<br />
            Ip : ' .$ip. '<br />
            Mail: ' .$mail. '<br />
            Il Suo Commento: ' .$commento. '<br />
            
            </p>
            <hr />';
        }
    ?>
    </body>
    </html>
    

    4 tramite un form di update volevo abilitare la lettura dei dati inseriti inserendo una spunta

    <?phpinclude("setting.php");
    if(!isset($_GET['row'])){
        header("location: lettura.php");
        exit;
        }
    $array_righi = file($my_database_txt);
    if(!isset($array_righi[$_GET['row']])){
        exit('errore nella chiave dell\'array');
        }
    list($nome, $ip, $mail, $commento) = explode("|", $array_righi[$_GET['row']]);
    ?>
    <html>
    <head>
    <link rel="stylesheet" href="style.css" type="text/css" />
    </head>
    <body>
    <h2><a href="lettura.php">Torna alla lista degli articoli</a></h2>
    <form action="action.php" method="post">
    <label for="nome">Nome</label>
        <input type="text" id="nome" name="nome" value="<?php echo htmlentities($nome, ENT_QUOTES); ?>" />
    <label for="ip">Ip</label>
    <input type="text" id="ip" name="ip" value="<?php echo htmlentities($ip, ENT_QUOTES); ?>" />
    <label for="mail">Mail</label>
        <input type="text" id="mail" name="mail" value="<?php echo htmlentities($mail, ENT_QUOTES); ?>" />
    <label for="commento">Il suo Commento</label>
        <input type="text" id="commento" name="commento" value="<?php echo htmlentities($commento, ENT_QUOTES); ?>" />
    <label for="abilita">Abilta commento</label>
    <input type="checkbox"  name="online">
     
     
     
    <input type="hidden" name="row_update" value="<?php echo $_GET['row']; ?>" />
        <input type="submit" name="modifica" value="modifica" />
    </form>
    </body>
    </html>
    

    In conclusione vorrei che al passo 3 ( la lettura del file) vengano fuori solo i dati abilitati dal form update.
    E' possibile, al momento l'unica via di uscita per me e MySql.

    Ringrazio in anticipo per la pazienza

    happyman


  • User Newbie

    Ciao happyman,

    le modifiche che dovresti fare sono abbastanza semplici:

    1. quando inserisci un commento, come valore di default, aggiungi 0 nella riga
      simone|127.0.0.1|email|commento|0

    2. aggiorna il form di update:
      nella funzione list aggiungi una variabile $online.
      $online sarà di tipo string quindi dovrai eliminare gli eventuali spazi e controllare il suo valore boolean (boolval) assegnandola ad una variabile ($is_online).

    $is_online = $online ? "checked" : null;
    se $online == 1, $is_online gli assegno come valore "checked", altrimenti null

    aggiungi value="1" e stampa $is_online alla checkbox
    quando invii il form avrai una variabile $_POST['online'] con valore 1 se selezionata, altrimenti NULL.

    1. action.php
      crea una variabile $abilita e se $_POST['online'] non è null assegni il valore 1 altrimenti 0.
      aggiungi la variabile $abilita a $array_righi

    $array_righi[$_POST['row_update']] = $nome."|".$ip."|".$mail."|".$commento."|".$abilita."\r\n";

    1. lettura.php
      nel foreach aggiungi una variabile $online nella funzione list. anche qui, elimini gli spazi e controlli il valore dopodichè
      se $online == false continue;

    spero di essere stato chiaro