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...

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 ...
Una cache per il numero di iscritti a Facebook e Twitter

Una cache per il numero di iscritti a Facebook e Twitter

Visualizzare il numero di followers su twitter e di fan su facebook è molto oneroso in termini di tempo per il nostro blog. I server sempre sovraccarichi di questi social network minano i tempi di caricamento in modo notevole. Chiunque abbia provato a recuperare in formato testuale questi valori, in particolare quelli relativi a ...
Twitter: c'erano una volta le API

Twitter: c’erano una volta le API

Eccoci alla seconda puntata della miniserie di Camu. Se la prima puntata era dedicata agli Hook di WordPress, oggi si parlerà delle API di Twitter e nella prossima metteremo tutto insieme. Oggi, quando nel gergo informatico si parla di API, non ci si riferisce a quei simpatici insetti che producono il miele e ci ...
Risorse per creare un'applicazione Facebook in PHP

Risorse per creare un’applicazione Facebook in PHP

Facebook è ormai un fenomeno di massa, perchè non approfittarne? Da bravi programmatori PHP quali siamo, ci sarà pur venuta la curiosità di creare una nostra applicazione Facebook, giusto per sperimentare qualcosa di nuovo o magari per promuovere il nostro sito o blog. E' giunto allora il momento di buttarci ed iniziare a studiare ...
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 ...

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