15/12/04
Autenticazione in area privata con Php e MySQL
In questo articolo parliamo dell'autenticazione degli utenti per aree private, fornendo un esempio di area amministrativa per la gestione dei contenuti di un sito.
Prima di cominciare a spiegare il codice, vi invito a leggere un po' di documentazione su php.net riguardante i cookie e le sessioni.
Gli script completi sono scaricabili qui (vi consiglio di farlo subito poichè spiegherò solo parte del codice).
Dopo queste piccole premesse, passiamo subito a vedere la struttura dell'applicazione:
Autenticazione
|
|-------- Directory: includes
| |
| |-------- File: auth.lib.php
|
|-------- File: common.php
|
|-------- File: config.php
|
|-------- File: index.php
|
|-------- File: logout.php
|
|-------- File: pagina.php
Nell'archivio scaricabile c'è anche un file di nome "table_data.sql" che contiene le istruzioni sql per la creazione delle tabelle nel db.
Entriamo nel dettaglio e cominciamo a vedere le tabelle del db che conterranno le informazioni per l'accesso:
File che contiene queste istruzioni: table_data.sql
CREATE TABLE `users` (
`user_id` mediumint(8) unsigned NOT NULL auto_increment,
`user_name` varchar(20) NOT NULL default '',
`user_username` varchar(20) NOT NULL default '',
`user_passwd` char(32) NOT NULL default '',
PRIMARY KEY (`user_id`),
UNIQUE KEY `user_username` (`user_username`)
);
La tabella users contiene 4 campi
- user_id: L'ID univoco per l'indentificazione degli utenti
- user_name: Un nome per l'utente
- user_username: La username dell'utente che sarà utilizzata per verificare l'accesso all'area privata (è stato creato anche un indice di chiave univoca per questo campo)
- user_passwd: La password che l'utente utilizzerà per efftuare il login (un char(32) poichè conterrà la password criptata con la funzione MD5)
Naturalmente potete aggiungere altri campi a questa tabella con le informazioni dell'utente, ad esempio il cognome, l'e-mail, etc.
Mettiamo subito qualche utente nella tabella appena creata e creiamo la tabella per le sessioni:
INSERT INTO users (user_name, user_username, user_passwd) VALUES ('Mario', 'moon', MD5('test'));
INSERT INTO users (user_name, user_username, user_passwd) VALUES ('Fabio', 'upwd', MD5('test2'));
INSERT INTO users (user_name, user_username, user_passwd) VALUES ('Giuseppe', 'alliance', MD5('test3'));
CREATE TABLE `sessions` (
`session_id` char(32) NOT NULL default '',
`session_user_id` mediumint(8) NOT NULL default '0',
`session_start` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`session_id`),
KEY `session_user_id` (`session_user_id`)
);
3 campi per la tabella sessions, nel dettaglio abbiamo:
- session_id: ID univoco per identificare la sessione
- session_user_id: l'ID dell'utente preso dalla tabella users
- session_start: La data e l'orario di creazione della sessione
Ora passiamo a spiegare i file dell'applicazione, cominciamo dal file config.php
<?php
define('HOST', 'host');
define('USERNAME', 'username');
define('PASSWD', 'password');
define('DB_NAME', 'test');
define('COOKIE_NAME', 'user_data');
define('REDIRECT_PAGE', 'pagina.php');
define('LOGIN_PAGE', 'index.php');
?>
Come vedete in questo file sono definite alcune costanti, le prime 4 sono i parametri per la connessione e selezione del db, le restanti 3 sono configurazioni per la nostra applicazione, il nome del cookie, la pagina di redirect (nel caso di accesso consentito dopo il login) e infine la pagina con la form di login.
Vediamo il file common.php:
<?php
include('config.php');
include('includes/auth.inc.php');
$link = @mysql_connect(HOST, USERNAME, PASSWD)
or die('Connessione al database fallita.');
@mysql_select_db(DB_NAME)
or die('Selezione del database fallita.');
?>
Questo file include il config.php (che abbiamo appena visto) e il file auth.lib.php che è la libreria con le funzioni di autenticazione.
Brevemente vi spiego gli altri file per poi passare alle funzioni più importanti contenute nel file auth.lib.php.
- index.php: Contiene la form di login e richiami a funzioni della libreria di autenticazione
- logout.php: richiama la funzione per la distruzione del cookie di sessione
- pagina.php: una semplice pagina protetta che viene visualizzata dopo un corretto login
Siamo arrivati all'ultimo file "auth.lib.php", che contiene 5 funzioni:
<?php
function auth_check_user_login($username, $passwd)
{
/* .... */
}
?>
Questa funzione viene richiamata dopo il submit della form di login, infatti vediamo che richede i parametri username e passwd per effetuare una query di verifica sul database. Se la query va a buon fine e l'utente si è autenticato correttamente questa funzione ritorna true e viene richiamata la funzione successiva.
<?php
function auth_session_begin($user_id)
{
/* .... */
}
?>
Viene utilizzata per iniziare la sessione spedendo un cookie e inserendo nella tabella sessions la nuova sessione
<?php
function auth_generate_sid()
{
/* .... */
}
?>
Viene utilizzata da auth_session_begin() per la creazione dell'ID univoco di sessione
<?php
function auth_check_user()
{
/* .... */
}
?>
Utilizzata in tutte le pagine che vogliamo proteggere, se l'utente è loggato recupera i dati dalla tabella users (ad esempio il suo nome), se invece non è loggato viene rediretto sulla pagina di autenticazione (nel nostro caso index.php) per effetuare l'autenticazione.
<?php
function auth_session_destroy()
{
/* .... */
}
?>
Usata solo nel file logout.php, come ci suggerisce il suo nome serve ad eliminare la sessione.
Conclusioni
Si può lavorare ancora su questa applicazione per renderla più completa. In questo esempio ho cercato di renderla di facile personalizzazione e comprensione in modo da faciltarne l'utilizzo anche agli utenti meno esperti.
Posted by Lorenzo Torello at 12:09 p. in Php | Permalink | Commenti (18) | TrackBack
05/11/04
Come creare dei Box Dinamici sul nostro sito
Supponiamo di avere un sito web statico con un layout a tre colonne. Immaginiamo di voler creare dei Box laterali in maniera dinamica: di cosa abbiamo bisogno?
Prima di cominciare vediamo i file che useremo per l'applicazione:
table.sql
- Contiene istruzioni SQL per la creazione della tabella nel db
form_add_boxes.php
- Il modulo da compilare per creare il Box
add_boxes.php
- Lo script php che si occupa di inserire i dati nel db
index.php
- La pagina index del nostro sito che prendera i box dal db per poi visualizzarli
Cominciamo creando la tabella nel db
CREATE TABLE boxes (
idboxes mediumint(8) NOT NULL auto_increment,
title varchar(50) NOT NULL default '',
content text NOT NULL,
position enum('L','R') NOT NULL default 'L',
PRIMARY KEY (idboxes)
) TYPE=MyISAM;
Notiamo il campo position (gli altri sono abbastanza chiari) che è di tipo enum, con 2 opzioni ("L" ed "R"). Questo campo ci serivirà per capire dove visualizzare il box, se nella colonna Left o nella colonna Right
Passiamo quindi alla creazione del modulo per l'inserimento dei dati:
<form action="add_box.php" method="post">
<fieldset>
<legend>Inserimento nuovo Box</legend>
<br />
Titolo:<br />
<input name="title" type="text" size="50" maxlength="50" />
<br />
Testo:<br />
<textarea name="content" cols="50" rows="6"></textarea>
<br />
Posizone: Sinistra
<input name="position" type="radio" value="L" checked="checked" />
Destra
<input name="position" type="radio" value="R" />
<br />
<br />
<input type="submit" name="Submit" value="Invia" />
</fieldset>
</form>
L'action della form è impostata su add_box.php, che si occuperà dell'inserimento nel db. Per il campo position ho usato 2 imput di tipo radio, ma poteva andar bene anche una select.
Nel file form_add_boxes.php trovate la pagina completa in XHTML della form.
Ora vediamo parte del codice del file add_box.php:
//
// ... Connessione al db e selezionione del databse
//
if (trim($_POST['title'])!='' && trim($_POST['content']!=''))
{
$sql = "INSERT INTO boxes (title, content, position) "
."VALUES('". $_POST['title'] ."', '". $_POST['content'] ."', "
."'". $_POST['position'] ."')";
$res = mysql_query($sql);
if ($res)
{
echo 'Inserimento riuscito';
}
else
{
echo 'Inserimento fallito';
}
}
Siamo arrivati al file più importante di questo articolo: index.php.
Anche qui riporterò solo una parte del codice (se scaricate i file troverete il sorgente completo).
<?php
function write_boxes($side)
{
$sql = "SELECT title, content FROM boxes WHERE position = '". $side ."' ";
$result = mysql_query($sql);
while (list($title, $content) = mysql_fetch_row($result))
{
echo '<div class="box"><b>'. $title .'</b><br />'
. $content
.'</div><br />';
}
}
?>
Visto che dobbiamo scrivere i box nella colonna di sinistra e anche in quella di destra, ho preferito creare una funzione da richiamare in entrambi i casi. La funzione richiede il valore $side, che sarà L o R, e quindi effettua la query sul database per poi visualizzare i box.
<div id="container">
<div id="sidebar-l">
<?php
write_boxes('L');
?>
</div>
<div id="sidebar-r">
<?php
write_boxes('R');
?>
</div>
<div id="content"><h2>Dynamic Boxes</h2></div>
</div>
Vi consiglio di scaricare i file e di studiare attentamente il file index.php, perchè (oltre ad avere la funzione php) è stato volutamente strutturato in XHTML con i div per la creazione delle colonne. Nel file ci sono anche le classi CSS per il posizionamento dei div.
Posted by Lorenzo Torello at 10:06 m. in Php | Permalink | Commenti (0) | TrackBack
22/10/04
Un RSS Reader in php facile e veloce
Requisiti: Per poter usare questo script il php deve avere il supporto XML installato. Con questo script possiamo facilmente pubblicare sul nostro sito i contentuti che altri condividono in Rete attraverso un canale RSS.Scegliamo quindi un sito da cui prendere il nostro RSS. I siti che offrono la syndication dei contenuti possono facilmente essere individuati tramite le icone [RSS], [XML], [RDF]. Noi prenderemo come esempio i post del weblog di Paolo Valdemarin.
Di seguito c'è tutto il codice dell'applicazione che possiamo facilmente copiare ed incollare per creare il nostro RSS Reader.
<?php
$insideitem = false;
$tag = '';
$title = '';
$description = '';
$link = '';
function startElement($parser, $name, $attrs) {
global $insideitem, $tag, $title, $description, $link;
if ($insideitem) {
$tag = $name;
} elseif ($name == 'ITEM') {
$insideitem = true;
}
}
function endElement($parser, $name) {
global $insideitem, $tag, $title, $description, $link;
if ($name == 'ITEM') {
printf('<p><b><a href=\'%s\'>%s</a></b><br>',
trim($link),trim($title));
printf('%s</p>'."\n",trim($description));
$title = '';
$description = '';
$link = '';
$insideitem = false;
}
}
function characterData($parser, $data) {
global $insideitem, $tag, $title, $description, $link;
if ($insideitem) {
switch ($tag) {
case 'TITLE':
$title .= $data;
break;
case 'DESCRIPTION':
$description .= $data;
break;
case 'LINK':
$link .= $data;
break;
}
}
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, 'startElement', 'endElement');
xml_set_character_data_handler($xml_parser, "characterData");
$fp = fopen('http://paolo.evectors.it/italian/rss.xml','r')
or die('Error reading RSS data.');
while ($data = fread($fp, 4096)) {
xml_parse($xml_parser, $data, feof($fp))
or die(sprintf('XML error: %s at line %d',
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
fclose($fp);
xml_parser_free($xml_parser);
?>
Come potete notare la funzione fopen() apre il link al file xml che abbiamo scelto. Per quanto riguarda le funzioni XML del php, se volete approfondire e/o capire il loro funzionamento vi rimando a questo link: Funzioni relative al parser XML.
Questa piccola applicazione è abbastanza completa. Il suo scopo è quello di darvi la possibilità di creare un RSS Reader nel minor tempo possibile. Per personalizzare la visualizzazione potete modificare i tag HTML nella funzione endElement().
Posted by Lorenzo Torello at 10:21 m. in Php | Permalink | Commenti (3) | TrackBack
11/10/04
Come creare una Newsletter in XHTML con supporto di PHP e MySQL
Anche senza avere molta esperienza di programmazione è possibile creare un'applicazione per newsletter. Vediamo come fare.Perchè una newsletter?
Tutti i programmatori web prima o poi si ritrovano a dover sviluppare una applicazione per newsletter per il sito di un cliente (o per il proprio). Il modello che mostriamo è pensato per coloro che sono alle prime armi e vogliono cominciare a sviluppare qualcosa di utile.
Divideremo il nostro lavoro in 3 parti:
1. Creazione della tabella nel database;
2. Stesura di codice per le pagine di inserimento degli indirizzi nel database;
3. Stesura di codice per l'invio dell'e-mail di news agli indirizzi presenti nel database;
Cominciamo quindi creando la struttura
della tabella che conterrà le e-mail
dei destinatari.
Chiameremo la tabella 'address_book'
CREATE TABLE address_book (
idaddress_book int(11) NOT NULL auto_increment,
email_address varchar(50) NOT NULL default '',
PRIMARY KEY (idaddress_book)
);
Come possiamo notare, abbiamo creato due campi nella tabella: il primo "idaddress_book" conterrà un id univoco relativo all'indirizzo; il secondo è "email_address" che conterra l'indirizzo vero e proprio.
Ora abbiamo la tabella per memorizzare
gli indirizzi di posta elettronica dei destinatari.
Il nostro db è pronto.
Passiamo quindi a scrivere il codice necessario
per l'inserimento delle email.
Prima di tutto ci serve una form xhtml dove
poter scrivere l'indirizzo per poi inserirlo
nel database.
Creiamo un nuovo file e chiamiamolo: 'form_add_addess.php'.
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>News Letters</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h3>Modulo per l'inserimento di indirizzi
e-mail </h3>
<form action="add_address.php" method="post">
<div>Indirizzo e-mail:
<input type="text" name="email_address" />
<input type="submit" value="submit" />
</div>
</form>
</body>
</html>
Passiamo alla scrittura del codice per
inserire l'indirizzo nel db.
Creiamo un nuovo file e chimiamolo 'add_address.php'
<?php
// Effetuiamo la connessione al nostro db
$link = mysql_connect('localhost', 'username', 'password')
or die('Connessione al db fallita.'); // In caso di fallimento visualizza l'errore ed esce
// Selezione del database
mysql_select_db('database_name')
or die('Selezione del database fallita.'); // In caso di fallimento visualizza l'errore ed esce
// Ok abbiamo la connessione facciamo qualche verifica ed eseguiamo la query sql
// Verifichiamo di avere l'indirizzo email
if (isset($_POST['email_address'])) {
if (trim($_POST['email_address'])!='') {
// il campo non è vuoto, proseguo con l'inserimento nel db
$sql = "INSERT INTO address_book (email_address) VALUES('". $_POST['email_address'] ."')";
$res = mysql_query($sql);
if ($res) {
// Inserimento riuscito
} else {
// Si è verificato un errore, controllare la sintassi della query
}
} else {
// Il campo c'è ma è vuoto
}
} else {
// Il contenuto della form non è arrivato, questo può succedere
// se si accede a questa pagina direttamente senza fare il submit da form.php
}
?>
Se siamo arrivati fin qui senza problemi
possiamo cominciare ad inserire tranquillamente
indirizzi e-mail nel database.
Naturalmente può essere implementata
la gestione degli errori nel file add_address.php
per la verifica degli indirizzi e-mail,
ma è una cosa che vedremo in seguito.
Passiamo quindi all'invio della newsletter.
Cominciamo creando la form con i campi
Oggetto, e Testo.
Creiamo un nuovo file e chiamiamolo form_send_news.php
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>News Letters</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h3>Modulo per l'invio di news</h3>
<form action="send_news.php" method="post">
<table>
<tr>
<td>Oggetto</td>
<td><input name="subject" type="text" size="20" /></td>
</tr>
<tr>
<td>Testo:</td>
<td><textarea name="text" cols="20" rows="10"></textarea></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" value="submit" /></td>
</tr>
</table>
</form>
</body>
</html>
Passiamo al file più importante: 'send_news.php'
<?php
$link = mysql_connect('localhost', 'username', 'password')
or die('Connessione al db fallita.');
mysql_select_db('database_name')
or die('Selezione del database fallita.');
// Verifichiamo di avere l'oggetto e il testo dalla form
if (isset($_POST['subject']) && isset($_POST['text'])) {
if (trim($_POST['subject'])!='' && trim($_POST['text'])!='') {
/* Abbiamo tutto quello che ci serve, ora con una query prendiamo
tutti gli indirizzi dal db */
$sql = "SELECT email_address FROM address_book";
$res = mysql_query($sql);
// Impostiamo le intestazione dell'e-mail che stiamo per mandare
$headers = "From: Esempio <esempio@esempio.com>\r\n";
/* Puliamo il testo e l'oggetto dagli slashs messi in automatico
dopo il post dei dati */
$subject = stripslashes($_POST['subject']);
$text = stripslashes($_POST['text']);
/* Cicliamo il risultato della query e assegnamo
l'indirizzo e-mail alla variabile $to */
while (list($to) = mysql_fetch_row($res)) {
/* e ora inviamo la news */
mail($to, $subject, $text, $headers);
}
} else {
// Uno o più campi sono vuoti
}
} else {
/*
Il contenuto della form non è arrivato, questo può succedere
se si accede a questa pagina direttamente senza fare il
submit da form_send_news.php
*/
}
?>
L'applicazione è finita, il codice
php che vi ho presentato è stato
testato e le form xhtml sono state validate
dal w3c.
Certo, ci sarebbe da lavorare ancora un
po' per avere un'applicazione completa:
ad esempio bisognerebbe avere la possibilità
di eliminare e modificare gli indirizzi,
e poi magari creare uno script di autenticazione
per tutta l'applicazione ed un controllo
durante l'inserimento che verifichi se l'indirizzo
email non sià già presente
nel db. Ma ne parleremo nelle prossime settimane.
Posted by Lorenzo Torello at 04:23 m. in Php | Permalink | Commenti (6) | TrackBack



