Molti spesso sentono dire di "database su files di testo".. mah di database conosco solo mysql (o postgresql ecc..). Cosa vorrà dire questa espressione. Di solito i files di testo vengono utilizzati come "cestini" dove mettere cosette così come
testo.txt
ciao sono php_34
echo.php
<?php echo implode("", file("testo.txt")); ?>
o cosette simili, questo visualizzerebbe semplicemente il contenuto di testo.txt. Esistono alcuni problemi del tipo: ho un sito e voglio metterci un guestbook ma non ho un db (o il classico problema di altervista: non ho sufficienti altercents e non voglio mostrare agli utenti quel brutto messaggio
), il problema è: come faccio? Un modo è: chiedere un hosting con db, o nel caso di altervista (
) aumentare gli altercents con la pubblicità. Forse questo vi porterà via un po' di giorni e soldi, quindi qualcuno potrebbe pensare ad un altro metodo. Cosa utilizzare? Beh a questo punto, pensiamo ai file. Qualcuno ora si chiederà: e come faccio il database con i file?!? Ora entra in campo un po' di ingegno con le funzioni specifiche di php.
Supponiamo di voler fare un piccolo login con cookie e database "MyTXT"
procediamo così:
index.php
Codice PHP:
<?php
function check_user($user, $md5pwd) {
$result = FALSE;
$users_db = file("users.php");
foreach($users_db as $line) {
$user_line = explode("[--]", $line);
if($user == $user_line[0] && $md5pwd == $user_line[1]) {
$result = TRUE; break;
} } return $result; }
if(isset($_COOKIE['utente']) && isset($_COOKIE['md5pwd'] && [B]check_user[/B]($_COOKIE['utente'], $_COOKIE['md5pwd'])) {
//l'utente è loggato, mostriamo la pagina (spiego dopo)
}else{ require("login.php"); }
?>
in users.php:
<?php die("Non puoi visualizzare il file !!!");
utente 1[--]password md5 dell'utente 1
utente 2[--]password md5 dell'utente 2
utente 3[--]password md5 dell'utente 3
Bene forse leggendo questo avrete capito ☺5b☺162☺g☻P
, quindi cerchiamo di capire meglio esaminando quanto scritto..
Codice PHP:
function check_user($user, $md5pwd) {
dichiariamo una funzione che ci restituisce un valore booleano che controlla se l'utente specificato con la sua password md5 abbinata sono registrati e che la combinazione coincida.
Codice PHP:
$users_db = file("users.php");
usiamo la funzione file() per creare un array con in ogni elemento dell'array una linea di users.php. Nella prima troviamo una riga di sicurezza, che permette ad ogni utente che cerca di intrufolarsi nel database utenti di visualizzare un messaggio d'errore, nelle altre linee troveremo gli utenti iscritti.
Codice PHP:
foreach($users_db as $line) {
con un bel ciclo foreach eseguiamo il controllo per ogni riga che la combinazione utente/password sia corretta
Codice PHP:
$user_line = explode("[--]", $line);
bene qui entra in gioco l'explode, funzione importantissima per quanto mi riguarda, visto che io uso sempre db MyTXT.. Questa funzione usa il separatore specificato (nel nostro caso [--]), come separatore di colonne del db. In questo modo abbiamo la possibilità di ottenere un ulteriore array, in cui sono contenute le informazioni della linea. Grazie ancora al "as" del foreach abbiamo la possibilità di richiamare la linea corrente con la semplice variabile $line, che inseriamo nell'explode, la linea che stiamo esaminando. Passiamo avanti:
Codice PHP:
if($user == $user_line[0] && $md5pwd == $user_line[1]) {
E' la cosa che principalmente ci interessa. Controlliamo grazie ad nu if e a tutto quello che ho già spiegato se l'username o la password coincidono con quelle di linea.
Codice PHP:
$result = FALSE;
se non coincidono l'if non verrà eseguito e di conseguenza il risultato sarà sempre quello predichiarato all'inizio della funzione, false. Dopo più volte che il foreach viene eseguito, verranno effettuati controlli su tutte le linee, e quindi essere sicuri che l'username e la password coincidano. Cosa c'è nell'if?
Codice PHP:
$result = TRUE; break;
impostiamo il risultato come true, cioè vero: l'utente e registrato. E break? se avessimo messo un else dopo l'if e metto $result = FALSE nel contenuto dell'if, break sarebbe stato indispensabile. In questo caso serve solo a diminuire il tempo d'esecuzione dello script, però servirebbe con l'else a dire STOP all'esecuzione del foreach e di non fare più controlli, altrimenti il risultato sarebbe tornato ad essere FALSE e l'utente rimarrebbe così =>
!!!
Quindi passiamo dopo il foreach, che è la fase più importante, ad un'altra cosa altrettanto importante, quella che restituirebbe il valore booleano:
Codice PHP:
return $result;
questo fa sì che la funzione restituisca il valore giusto. Vi è chiara la funzione? Bene passiamo oltre:
Codice PHP:
if(isset($_COOKIE['utente']) && isset($_COOKIE['md5pwd'] && check_user($_COOKIE['utente'], $_COOKIE['md5pwd'])) {
//l'utente è loggato, mostriamo la pagina (spiego dopo)
}else{ require("login.php"); }
bene a cosa servirebbe? Spiego subito:
Codice PHP:
if(isset($_COOKIE['utente']) && isset($_COOKIE['md5pwd'] && check_user($_COOKIE['utente'], $_COOKIE['md5pwd'])) {
questo controlla che sia stato impostato il cookie utente e md5pwd, quindi vede con la nostra funzione check_user che l'username e la password siano giusti. I cookie devono essere: il cookie 'utente' con il come utente e il cookie 'password' con la password formato md5. Come si impostano questi cookie? Semplice: nella pagina di login (chiamiamola login.php) facciamo il form del login e mettiamo un form con azione => index.php (quella dove c'è la funzione e i controlli) con metodo POST e due campi: user e pass. Dopo che il form è stato inviato mettete anche un campo hidden con nome 'action' e valore..che ne sò..dologin.. Dopo nel file login.php si potrebbe mettere qualcosa del genere:
Codice PHP:
<?php
if($_POST['action'] == "dologin") {
$md5password = md5($_POST['password']);
if(check_user($_POST['user'], $md5password)) {
echo "login effettuato correttamente. Vai di nuovo a index.php";
}else{ echo "username e/o password errati"; } }
else{
//echo paginadilogin
} ?>
questo semplicissimo codiciuzzolo serve a creare un piccolo sistema login che utilizza i cookie, se volete usare anche le sessioni mettete session_start(); all'inizio di index.php.
Adesso se vogliamo fare un piccolo guestbook? Beh semplice, basta un po' di cervello!! Possiamo comporre il nostro guestbook con 2 soli files: index.php e messages.txt:
index.php
Codice PHP:
<?php
if($_POST['action'] == "attach_msg") {
htmlentities($_POST['msg'], ENT_QUOTES);
str_replace("\\\", "\\\\\\\", $_POST['msg']);
$fp = fopen("messages.txt", "a");
fwrite($fp, "$_POST['name']|[--]|$_POST['msg']\n");
fclose($fp); header("Location: index.php"); }else{
$msg_db = file("messages.txt");
if(count($msg_db) == 0 && $msg_db[0] == "") {
echo "non ci sono messaggi"; }else{
foreach($msg_db as $line) {
if($line != "") {
$msg = explode("|[--]|", $line);
echo "Messaggio inviato da: $msg[0]
$msg[1]"; } } }
echo "Lascia un messaggio!
<form action='index.php' method='post'>
Nome:<input type='text' name='name'>
Messaggio:<textarea name='msg'></textarea>
<input type='submit' value='Invia messaggio >'></form>";
?>
Bene io ho scritto al volo, non so se ci sono errori di sintassi, che ne pensate? abbiamo creato con pochissime righe di codice un guestbook senza db mysql!! Potete sbizzarrirvi e creare anche tra le più accattivanti combinazioni di file db e lettori dei file in php, con dei foreach, explode e altre funzioni che senza delle quali con altervista non mi sarebbe piaciuta proprio
.