BigThink

Creare un database di testo in PHP

  • Scritto da Motherboard
  • 6 Commenti

Spesso potremmo aver necessità di utilizzare un database. Tuttavia, se si tratta di un piccolo script che non useremo spesso, invece di andare a creare tabelle su MySQL, possiamo utilizzare un semplice file di testo e andare a scrivere e leggere delle stringhe.

E’ chiaro che le limitazioni sono molte:

  • deve trattarsi di una mole di dati molto piccola
  • è più macchinoso scrivere e leggere
  • non si possono fare query

Può comunque tornare utile ed è un buon punto di partenza per imparare a manipolare i file di testo con PHP.

Vediamo allora passo dopo passo come fare.

Aprire un file di testo: fopen()
La funzione fopen() apre un collegamento tra una risorsa, indicata dal parametro filename, ed un flusso:

<?php
$handle = fopen("/home/rasmus/file.txt","r");
$handle = fopen("/home/rasmus/file.gif","wb");
$handle = fopen("http://www.example.com/","r");
$handle = fopen("ftp://user:password@example.com/somefile.txt","w");
?>

Utilizzeremo fopen() per aprire il nostro database di testo.

Scrivere un file di testo: fwrite()
Sintassi: int fwrite ( resource $handle , string $string [, int $length ] )
Questa funzione scrive il contenuto di string nel flusso del file puntato da handle. Se l’argomento length è specificato, la scrittura si arresterà dopo aver scritto length byte o alla fine di string se si verificasse prima:

<?php
$filename = 'test.txt';
$somecontent = "Aggiunge questa riga al file\n";

// Verifica che il file esista e sia riscrivibile
if (is_writable($filename)) {

    // In questo esempio apriamo $filename in append mode.
    // Il puntatore del file è posizionato in fondo al file
    // è qui che verrà posizionato $somecontent quando eseguiremo fwrite().
    if (!$handle = fopen($filename, 'a')) {
        echo "Non si riesce ad aprire il file ($filename)";
        exit;
    }

    // Scrive $somecontent nel file aperto.
    if (!fwrite($handle, $somecontent) === FALSE) {
        echo "Non si riesce a scrivere nel file ($filename)";
        exit;
    }

    echo "Riuscito, scritto ($somecontent) nel file ($filename)";
    fclose($handle);

} else {
    echo "Il file $filename non è accessibile";
}
?>

Ecco, con queste poche righe di codice abbiamo già creato uno script che aggiunge una frase al file test.txt.

Dobbiamo notare però, che i file si possono aprire con fopen() in diversi modi (nello script proposto si apre in sola letture alla fine del file).

Leggere un file di testo: fread()
La funzione fread() estrae un numero di byte dal file di testo (.txt).
Esempio:

<?
$file = fopen("test.txt","r");
$buffer = fread($file, 20);
?>

In questo caso abbiamo aperto un file di testo (test.txt) solo per leggerlo (r) ed abbiamo estratto 20 byte.

Per leggere tutto il file dobbiamo scrivere in questo modo:

<?
$file = fopen("test.txt","r");
$buffer = fread($file, filesize("test.txt"));
?>

Dove la funzione filesize() restituisce la grandezza totale del file.

Andare a capo: nl2br()
La funzione aggiunge un <br /> quando trova un ritorno a capo nel file di testo.
Esempio:

<?
$file = fopen("test.txt", "r");
$leggi = fread($file, filesize("test.txt"));
$content = nl2br($leggi);
fclose($file);
echo $content;
?>

Creiamo il nostro database testuale
Vediamo ora come applicare il tutto in un semplice database di testo.
Nel file test.txt inseriamo i dati nel seguente formato:
Nome:Cognome:email

Vediamo allora come leggere ed interpretare il file di testo:

<?
$percorso = file("test.txt");
while(list(,$value) = each($percorso)){
    list($nome, $cognome, $email) = split("[:]", $value);

    #Usiamo trim() per eliminare eventuali spazi vuoti
    $params["nome"] = trim($nome);
    $params["cognome"] = trim($cognome);
    $params["email"] = trim($email);

    #Stampiamo i risultati a video
    echo $params["nome"]." - ".$params["cognome"]." - ".$params["email"]. "<br />";
}
?>

Ma se non siamo soddisfatti e vogliamo fare il tutto in automatico, possiamo creare un form simile:

codice form insert.php

<html>
    <body>
        <form method="post" action="insert2.php">
            <fieldset>
                <legend>Inserimento dati</legend>
                Nome: <input type="text" name="nome" />
                Cognome: <input type="text" name="cognome" />
                E-mail: <input type="text" name="email" />
            </fieldset>
            <input type="submit" value="Calcola">
        </form>
    </body>
</html>

… per poi richiamarli da questa pagina e scriverli sul “database”:

script php insert2.php

<?

$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
$email = $_POST['email'];
$somecontent = $nome."-".$cognome."-".$email."<br>";
$somecontent .= "\r\n";

$myFile = "test.txt";
$fh = fopen($myFile, 'at');
fwrite($fh, $somecontent);

?>

Ovviamente questo script è altamente sconsigliato nel caso si abbia una grande mole di dati o per fare query particolarmente complesse. Si presta invece ottimamente per salvare piccole quantità di dati strutturati, in modo da renderli persistenti anche senza un database.

Leggi anche...

Dividere su due colonne le categorie di WordPress

Dividere su due colonne le categorie di WordPress

Con questo post inizia una nuova serie di guide per la creazione o personalizzazione dei template di WordPress, ambito in cui mi sono specializzato recentemente. Oggi vedremo come dividere l'elenco delle categorie del nostro blog, su due colonne di egual lunghezza. Può tornarci utile nel caso avessimo veramente tante categorie e, per una maggiore ...
PHP tip: ordinare un array di date

PHP tip: ordinare un array di date

Come spesso accade, mi trovo ad affrontare alcuni problemi durante i miei lavori in php e ne approfitto per condividere con voi le soluzioni. Oggi vediamo come ordinare un array di date in php. Solitamente, per ordinare un array numerico o di stringhe, si usa la funzione sort, piuttosto che asort per gli array associativi. ...
Test Driven Development: prima i test, poi il codice

Test Driven Development: prima i test, poi il codice

Un metodo non tradizionale e agile per lo sviluppo e il design del software è il Test Driven Development (TDD): sviluppo guidato dai test. E' un'alternativa al solito metodo a cascata (waterfall), secondo il quale, dopo un'adeguata analisi e progettazione, si inizia a scrivere il codice e solo alla fine si passa al ...
PHP: validare un form con le eccezioni

PHP: validare un form con le eccezioni

E' da tempo che programmo in PHP e ho avuto modo di apprezzare la programmazione OO, rispetto all'approccio procedurale, in particolare grazie al maggior supporto agli oggetti di PHP5. Vedremo in questo articolo come validare i campi di un form, utilizzando la gestione delle eccezioni, disponibili solo dalla versione 5, appunto. Darò per scontato che ...
PHP trick: inviare header dopo aver scritto nella pagina

PHP trick: inviare header dopo aver scritto nella pagina

Mi è capitato spesso nella mia carriera di programmatore PHP di trovarmi di fronte a questo errore: Warning: Cannot modify header information - headers already sent by... E' un problema che incorre quando tentiamo di inviare informazioni header, dopo aver già mandato del contenuto ad una pagina: ad esempio se abbiamo scritto qualcosa e proviamo ...

6 Commenti

  1. AntonioG

    $myFile = “test.txt”;
    $fh = fopen($myFile, ‘at’);
    fwrite($fh, $somecontent); (da insert2.php)

    Perchè hai aggiunto “t” ad “a”?

    19 ottobre 2010, 21:32
    • Motherboard

      Questioni di compatibilità Unix/Windows…. non è necessario comunque :)

      20 ottobre 2010, 14:50
  2. andrea

    Un consiglio .. così come è strutturato il database è accessibile a tutti , chiunque può entrare e rubare le informazioni contenute in esso.
    Ho costruito un tatabase simile come accorgimento durante la ase di scrittura sul file di testo ho inserito i dati all’interno di tag php e il file l’ho chiamato .php in questo modo ad un eventuale intruso con intenzione di accedere senza permesso al database, non verrebbe mostrato nulla dato che sarebbe processato come script e non come un file di testo normale. ^^ Saluti Bell’articolo

    16 ottobre 2010, 23:10
    • Motherboard

      Ottima idea , grazie ;)

      20 ottobre 2010, 14:52
  3. antonio

    c’è un piccolo errore nel file di lettura del database:
    riga 4
    … split([":"], $value);

    va sostituito con:
    … split(["-"], $value);

    2 agosto 2010, 15:17
  4. stefano

    stavo cercando uno script per la registrazione utenti php senza database che si appoggia solo su file di testo lei sa come si fanno questi script? grazie cordiali saluti buon natale in anticipo.

    3 dicembre 2009, 00:15