Autenticazione in PHP Banniamo gli utenti fastidiosi
Caricamento di foto sul server con PHP e MySQL - Upload Formattare il testo di una textarea
Gestione modulare di un sito web Gli Operatori
I Form in una sola pagina Marcature, Commenti e visualizzazione nel Browser
Le Sessioni Stringhe e Ricerche
Cercare una stringa Gestione degli apici (anche questo per MySql)
Upload File Controlli Form
Convalida Form I Menu
Invio Email Operazioni sui File
Scrivere i file con i form Variabili del Server Web
Realizzare un Guestbook Recuperare piu' Records da una Form
Installazione LAMP su Win32 Una completa gestione delle date
Upload di immagini con PHP

Validare i campi di una Form

Gestire le directories con php Creare un Login con PHP e MySQL
Creare un'area riservata utilizzando il ciclo if-else di Php Autenticare gli utenti con PHP
Form per il contatto con il web master. Files dentro a MySQL
La funzione mail() Un motore di ricerca in PHP e MySQL
Come faccio a copiare un file remoto? Come faccio ad eseguire un programma esterno al php?
Esistono servizi GRATUITI di web hosting con supporto PHP/SQL? E' possibile stampare da uno script PHP?
Da "2000-12-15" a "15 Dec 2000" Come creo un piccolo contatore senza appoggiarmi a nessun DB?
Frasi random ad ogni accesso di pagina Creare un circuito banners in PHP
Creare un sito web con PHP Un semplice sistema di protezione in PHP
Modulo "Segnala sito ad un amico" in PHP Inviare e-mail con il PHP
Restituzione di una porzione di un campo Frasi Random ad ogni accesso di pagina
Usare un file di testo come database!  
   
   

 

 

 

 

 

 

 

 

Autenticazione in PHP
Introduzione
Uno degli argomenti piu' importante riguardo la programmazione web e' l' aspetto legato alla sicurezza dei dati e alla gestione degli utenti sul nostro sito. Tempo fa, mi sono ritrovato a dover realizzare una sezione protetta per un sito, e leggendo molte guide che si possono trovare in rete, riscontravo codici troppo lunghi, spesso incomprensibili e complicati, appunto per realizzare uno script che sia in grado di gestire l' utente sul nostro sito.
In questa guida voglio illustrare il codice base che uso personalmente per realizzare aree protette all' interno di un sito web.
File di verifica
Il file che andremo a realizzare dovra' essere incluso su tutte le pagine protette, in questa guida mi limitero' a postare il codice sorgente completo, senza perdere troppo tempo sui commenti relativi alla tabella del database su cui si basa lo script (questo perche' lo script potrebbe essere modificato e migliorato secondo le vostre esigenze).
File: verifica.PHP
<?php
//Avvio o continuo la sessione
session_start();
//Controllo che la sessione sia attiva
if(!IsSet($_SESSION['logged']))
{
     //Controllo se l' utente vuole loggarsi
     //Recupero i valori da una Form
     $username = @$_POST['txt_username'];
     $password = @$_POST['txt_password'];
    //Controllo se l' username e la password non sono vuoti
     if((!strlen($username) == 0) and (!strlen($password) == 0))
     {
          //Effettuo il controllo dei dati
          $strSQL = "SELECT campo_1, campo_2, ... ,campo_n FROM Tabella WHERE campo_user = '".$username."' AND campo_pass = MD5('".$password."')";
          $result = mysql_query($strSQL);
          $row = mysql_fetch_row($result);
          //Controllo se l' utente e' stato trovato
          if(!strlen($row[0]) == 0)
          {
               //Effettuo il login
               $_SESSION['logged'] = $row[0];
          }
          //Libero la memoria
          mysql_free_result($result);
     }
}
if(@$_GET['logout'] == 1) //Effettuo il Logout
{
     $_SESSION = array(); //Desetto tutte le variabili di sessione
     session_destroy(); //Distruggo le sessioni
}
?>
Questo e' tutto il codice sorgente completo del file verifica.php, di seguito visualizzo un esempio pratico per il suo funzionamento:
File: index.PHP
<?php require_once('connessione_db.php');?>
<?php require_once('verifica.php');?>
<?php
//Controllo che l' utente sia loggato
if(IsSet($_SESSION['logged']))
{
     //L' utente e' loggato
     echo "Sei loggato";
     echo "<br><a href='index.php?logout=1'>Logout</a>";  
}else{
     //L' utente non e' loggato
     echo "Non sei loggato";
}
?>
Nota Bene:
<?php require_once('connessione_db.php');?>, non e' presente in questa guida, ma rappresenta il file di connessione al Database; Per effettuare il logout, e' necessario inviare il parametro del tipo "?logout=1" nella barra degli indirizzi (es. http://www.miosito.com/pagina_protetta.php?logout=1) il tutto tramite un comune link <a href="http://www.miosito.com/pagina_protetta.php?logout=1">Logout</a>; Ovviamente il file: "verifica.php" dovra' essere incluso in tutte le pagine del nostro sito, tocchera' a noi controllare che l' utente sia loggato o meno attraverso una semplice condizione IF.
Conclusioni
La guida termina qui, ovviamente questo script e' molto semplice ma senz' altro subito pronto per essere utilizzato. Abbiamo visto che fa uso delle Sessioni per mantenere il login nel tempo, ma potremmo modificarlo, adattandolo anche ai Cookies, ma questo tocca a voi

Banniamo gli utenti fastidiosi
Introduzione
Questo articolo credo che possa essere utile solamente a gente che conosca gli indirizzi IP dei visitatori. Infatti lo script agisce appunto sul IP (Internet Protocol) del utente che si connette al sito internet. Nel caso l'indirizzo IP sia nella lista, impedisce l'accesso al sito.
Lo script in funzione
Vediamo innanzi tutto come configurare lo script:
var $ip = array();
var $message = "Sei stato bannato da questo sito!";
Quà sarebbe meglio non modificare nulla se non la scritta che avverta di essere bannati dal sito.
Quella stringa può contenere qualsiasi tipo di caratteri ma non variabili !!
Passiamo ora ad analizzare le due funzioni che fanno funzionare lo script.
La prima funzione, che è quella che vedremo ora, permette di aggiungere un IP alla lista.
Ecco il codice:
function ban_ip($sel_ip)
{
return $this->ip[] = $sel_ip;
}
Questa funzione sarebbe meglio non modificarla... oddio non saprei proprio come si potrebbe modificare, ma preferisco dirlo, cosìcchè non si facciano modifiche inopportune!
Passiamo ora ad analizzare la funzione principale dello script, quella che fa il controllo sul IP e stabilisce e l'utente può visitare o meno il sito internet.
function check()
{
for ($i = 0; $i <= count($this->ip) - 1; $i++)
{
if ($_SERVER['REMOTE_ADDR'] == $this->ip[$i])
{
echo $this->message;
exit();
}
}
}
Questo codice fa questa operazione: selezione l'IP del visitatore e, se corrisponde ad uno degli IP bannati impedisce l'accesso al sito! Per controllare gli IP utilizziamo il ciclo for().
Vediamo infine come bannare gli IP e poi come controllare l'IP del visitatore:
$ban = new Ban;
$ban->ban_ip("127.0.0.1");
$ban->ban_ip("26.7.19.88");
$ban->check();
I due IP inseriti sono casuali.
Ecco il codice completo:
<?php
class Ban
{
var $ip = array();
var $message = "Sei stato bannato da questo sito!";
function ban_ip($sel_ip)
{
return $this->ip[] = $sel_ip;
}
function check()
{
for ($i = 0; $i <= count($this->ip) - 1; $i++)
{
if ($_SERVER['REMOTE_ADDR'] == $this->ip[$i])
{
echo $this->message;
exit();
}
}
}
}
$ban = new Ban;
$ban->ban_ip("127.0.0.1");
$ban->ban_ip("26.7.19.88");
$ban->check();
// Il resto del sito...
?>

Caricamento di foto sul server con PHP e MySQL - Upload
Introduzione
L'obiettivo di questo tutorial è descrivere come effettuare il caricamento delle foto sul server in modo da poter essere visualizzate in un album fotografico. L'immagine, con una breve descrizione, verrà inserita nel database attraverso una schermata di input tipo la seguente:
Descrizione 
Foto 
Attraverso il bottone sfoglia, sarà quindi possibile scegliere la foto sul computer locale da inserire sul server WEB.
Preparazione del modulo (form)
Nel creare il modulo il campo di testo che contiene la descrizione si chiamerà descrizione mentre il campo file per il caricamento della foto si chiama userfile
<form action="" method="post" enctype="multipart/form-data" name="form1">
<table align="center">
<tr valign="baseline">
<td nowrap align="right">Descrizione:</td>
<td><input type="text" name="descrizione" value="" size="32"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right">Foto</td>
<td> <input name="userfile" type="file" id="foto"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right">&nbsp;</td>
<td><input type="submit" value="Inserisci Foto"></td>
</tr>
</table>
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
</form>
Il campo nascosto MAX_FILE_SIZE impostato a 30000 Bytes serve a impedire che vengano caricate immagini con dimensioni eccessive.
Come avviene il caricamento della foto (upload)
Quando viene fatto click su Inserisci Foto il file contenente l'immagine viene inviato al server che lo memorizza in un'area temporanea. Attraverso la variabile
$_FILES['userfile']['tmp_name']
è possibile accedere all'immagine. Faremo riferimento a tale file utilizzando il seguente assegnamento:
$file_temp=($_FILES['userfile']['tmp_name']);
L'immagine quindi dovrà essere spostata in una cartella sul server in modo da poterla utilizzare.
Un accorgimento importante è il nome da dare all'immagine. Una buona soluzione è quella di utilizzare il numero del campo indice ottenuto con l'inserimento del record.
Ipotizziamo che la tabella delle foto abbia la seguente struttura:
CREATE TABLE `foto` (
`id_foto` int(10) unsigned NOT NULL auto_increment,
`descrizione` varchar(20) NOT NULL default '',
PRIMARY KEY (`id_foto`)
) TYPE=MyISAM AUTO_INCREMENT=7 ;
è possibile sapere il valore di id_foto dopo l'inserimento di un record con l'istruzione
$ultimo_id = mysql_insert_id();
Il nome del file della foto sarà quindi dato da
* Cartella che contiene le foto ES: “foto/”. Si può utilizzare una variabile per memorizzare questo percorso: $percorso="foto/";
* Valore di id_foto contenuto in $ultimo_id
Tipo di file: normalmente “.jpg” 
Si otterrà quindi un note tipo “foto/15.jpg”. L'istruzione che crea il nuovo nome è: $nuovo_nome=$percorso.$ultimo_id.".jpg";
Prima di inserire la foto è possibile verificare se il file è stato inviato. Utilizzando la funzione file_exists() è possibile sapere se l'immagine è stata caricata sul server.
$inviato=file_exists($file_temp);
La variabile $inviato conterrà “true” se il file è stato caricato.
Lo spostamento della foto nella cartella avviene con la funzione
move_uploaded_file(<file temporaneo>,<nuovo file>);
Dopo l'inserimento è possibile passare ad un'altra pagina attraverso l'istruzione header().
Il codice
$insertSQL = "INSERT INTO foto (descrizione) VALUES ('".$_POST['descrizione']."')";
//preparo la stringa per l'inserimento
mysql_select_db($database_eventi, $eventi);
//effettuo l'inserimento sul database
$Result1 = mysql_query($insertSQL, $eventi) or die(mysql_error());
//effettuo l'inserimento sul database
$ultimo_id=mysql_insert_id();
//valore di foto_id dopo l'inserimento
$file_temp=($_FILES['userfile']['tmp_name']);
//file temporaneo che contiene l'immagine caricata
$percorso="foto/";
//cartella sul server dove verrà spostata la foto
$nuovo_nome=$percorso.$ultimo_id.".jpg";
//nuovo nome dell'immagine
$inviato=file_exists($file_temp);
//verifica se il file è stato caricato sul server
if ($inviato) {
move_uploaded_file($file_temp,$nuovo_nome);
header("Location:VisualizzaFoto.php");
// sposto l'immagine nella cartella e vado
// alla pagina di visualizzazione
} else {
header("Location:Errore.php");
// vado alla pagina di errore
}
Abilitare i permessi
Per fare in modo che le foto vengano caricate sul server occorre che la cartella foto abbia i permessi abilitati di scrittura e di esecuzione. Se i permessi non sono corretti si avrà tipicamente una segnalazione di errore del tipo
Warning: move_uploaded_file(1.JPG):
failed to open stream:
Permission denied in /users/sito/adim/caricafoto.php on line xx
Per impostare correttamente i permessi a 777 si può usare il comando CHMOD (per farlo con dreamweaver vedi il tutorial).
Alcuni provider attraverso il Cpanel consentono di impostare facilmente questo valore.

Formattare il testo di una textarea
Vediamo come permettere all'utente di formattare il testo di una textarea nella maniera a lui più congeniale...
Innanzitutto distinguiamo le due pagine: la prima conterrà il form in cui l'utente potrà scrivere, la seconda sarà quella che interpreterà il codice.
Nella prima pagina dobbiamo fare in modo che l'utente, cliccando su una "G" scriva del testo in grassetto e su una "I" in corsivo...
Realizzate le due immagini gif, chiamatele g.gif e i.gif e collocatele nella cartella images e inseritele nella vostra pagina con questo codice...
<img src="images/g.gif" OnClick="document.nomeform.nometextarea.value+=''">
<img src="images/i.gif" OnClick="document.nomeform.nometextarea.value+=''">
Nella seconda pagina dovrete incollare queste righe:
<?
$nomevariabile = str_replace("[ B ]","<strong>",$nomevariabile);
$nomevariabile = str_replace("[ /B ]","</strong>",$nomevariabile);
$nomevariabile = str_replace("[ I ]","<em>",$nomevariabile);
$nomevariabile = str_replace("[ /I ]","</em>",$nomevariabile);
print ($nomevariabile);
?>
Tramite uno str_replace i caratteri [ B ], [ /B ], [ I ], [ /I ] vengono convertiti rispettivamente nei tag <strong>, </strong>, <em>, </em>... semplicissimo.
La sintassi da seguire è la seguente...
$nomevariabile = str_replace("testodatrovare","testoconcuisostituirlo",$nomevariabile);
Se volete un esempio guardate pure il mio guestbook.
Questa funzione php potrebbe essere utilizzata per eliminare parole di cattivo gusto, sostituendole con asterischi... provateci voi!

Gestione modulare di un sito web
Utilizzare i Moduli
Tempo fa, ho pubblicato una guida analoga a questa per la sezione ASP Tips di MasterDrive.it, oggi vorrei affrontare lo stesso argomento riguardante la programmazione PHP.
Prima di tutto, cosa si intende per gestione modulare di un sito web ?
Solitamente per gestione modulare, si intende un sito web, basato su di una certa struttura (template), che a seconda delle varie richieste, inviate tramite URL o FORM, il sito stesso carichera' una nuova sezione (o pagina) esclusivamente in una parte specifica della struttura.
Per fare un esempio pratico, lo stesso MasterDrive.it e' basato su dei moduli. Ma, perche' utilizzare i Moduli ? La risposta e' ovvia, facilita' di gestione del sito e unica struttura per tutte le sezioni.
Un esempio pratico
Su questo argomento, sicuramente ci sarebbe tanto da scrivere, comunque, limitiamoci a realizzare un esempio pratico per rendere meglio l' idea. Iniziamo col realizzare la struttura (template) del nostro sito web:
File: index.php (1° Parte - la struttura)
<html>
<head>
<title>Moduli</title>
</head>
<body>
<h1>La mia Homepage</h1>
<hr>
<!--Qui andranno caricate le sezione del sito-->
<hr>
</body>
</html>
Per questo esempio, ho scelto una struttura molto semplice, senza ricorrere all' uso di tabelle o ai Fogli di stile. Tutto questo poi, tocchera' a voi. Comunque, la struttura principale, in questo esempio, e' composta da un Header (parte superiore) e Footer (parte inferiore) rispettivamente:
Header:
<h1>La mia Homepage</h1>
<hr>
e Footer:
<hr>
E sara' all' interno di queste che noi andremo a posizionare il nostro codice PHP che selezionera' e carichera' i contenuti da visualizzare, ecco come:
File: index.php (2° Parte - la struttura e PHP)
<html>
<head>
<title>Moduli</title>
</head>
<body>
<h1>La mia Homepage</h1>
<hr>
<?php
//Prelevo il modulo da caricare
$modulo = @$_GET['modulo'];
//Effettuo lo switch
switch($modulo)
{
/**********************/
case 'prima':
require_once('pagina_uno.php');
break;
/**********************/

/**********************/
case 'seconda':
require_once('pagina_due.php');
break;
/**********************/
/**********************/
default:
require_once('home.php');
break;
/**********************/
}
?>
<hr>
</body>
</html>
In questo esempio, il nostro sito web sara' costituito da tre pagine, una di home: home.php, e altre due: pagina_uno.php e pagina_due.php.
Come funziona ? Il funzionamento di questo sistema e' molto semplice, a seconda del parametro passato tramite URL alla variabile modulo, lo script carichera' la pagina (o sezione) desiderata.
Perche' utilizzare lo switch e non una condizione IF ? L' utilizzo dello switch e' piu' consigliato rispetto alla condizione IF, in virtu' del fatto che potrebbe prevenire errori di questo tipo:
Utilizzando la condizione IF, con un URL del genere: index.php?modulo=terza, lo script carichera' una pagina bianca, al contrario dello switch, che carichera' la pagina di default, in questo caso "home.php".
Infine, non mi resta che postare il codice delle tre pagine:
File: pagina_uno.php
Benvenuto nella pagina uno
<br><a href="index.php">Home page</a>
File: pagina_due.php
Benvenuto nella pagina due
<br><a href="index.php">Home page</a>
File: home.php
<li><a href="index.php?modulo=prima">Pagina Uno</a>
<li><a href="index.php?modulo=seconda">Pagina Due</a>
Form a più pagine con passaggi di informazioni nei campi nascosti
Avete mai compilato dei form dove c'erano più pagine?Questi tipi di form si possono fare con i campi nascosti. Per esempio:
IL primo form chiede nome e indirizzo, il secondo chiede altre info e nasconde nome e indirizzo e il terzo le visualizza:
Primo form chiamate questa pagina uno.html
<HTML>
<BODY>
<FORM METHOD=GET ACTION="due.php">
<HR>
<B>Qual è il tuo nome completo?</B><BR><INPUT TYPE="text" NAME="nome" SIZE=20>
<BR><BR>
<B>Qual è il tuo indirizzo email?</B><BR><INPUT TYPE="text" NAME="email" SIZE=20>
<BR><BR>
<B>Qual è il tuo numero di telefono?</B><BR><INPUT TYPE="text" NAME="telefono" SIZE=20>
<BR><BR>
<B>Come desideri effettuare il pagamento?</B><BR>
<SELECT NAME="pagamento" >
<OPTION SELECTED>Carta di Credito
<OPTION>Assegno
<OPTION>Bonifico Bancario
<OPTION>Contanti
</SELECT>
<HR>
<INPUT TYPE="submit" VALUE="Pagina seguente">
<INPUT TYPE="reset" VALUE="Cancella!">
</FORM>
</BODY>
</HTML>
Ecco il secondo form chiamatelo due.php. Come potete notare sotto le variabili php sono prima codificate e poi passate nei campi nascosti.
<HTML>
<BODY>
<CENTER><H2>Per favore, seleziona le opzioni di consegna</H2></CENTER>
<FORM METHOD=GET ACTION="tre.php">
<B>Tipo di servizio:</B><BR>
<SELECT NAME="tipo_consegna" >
<OPTION SELECTED>Gold Star
<OPTION>Silver Star
<OPTION>Bronze Star
<OPTION>Piccione viaggiatore
</SELECT>
<BR><BR>
<B>Giorno di ritiro del plico:</B><BR>
<SELECT NAME="giorno">
<OPTION SELECTED>Lunedì
<OPTION>Martedì
<OPTION>Mercoledì
<OPTION>Giovedì
</SELECT>
<BR><BR>
<B>Peso del plico:</B> Se sbagli, pagherai di più<BR>
<SELECT NAME="peso">
<OPTION SELECTED>meno di 5 kg
<OPTION>da 5 kg a 8 kg
<OPTION>da 8 kg a 10 kg
<OPTION>da 10 kg a 12 kg
<OPTION>da 12 kg a 15 kg
<OPTION>oltre i 15 kg
</SELECT>
<BR>
<?php
# innanzitutto codifica i tre valori nascosti
$nome=(urlencode($nome));
$email=(urlencode($email));
$telefono=(urlencode($telefono));
# ecco i campi nascosti all'interno del form
echo "<INPUT TYPE=\"HIDDEN\" NAME=\"nome\" value=$nome>";
echo "<INPUT TYPE=\"HIDDEN\" NAME=\"email\" value=$email>";
echo "<INPUT TYPE=\"HIDDEN\" NAME=\"telefono\" value=$telefono>";
echo "<INPUT TYPE=\"HIDDEN\" NAME=\"pagamento\" value=$pagamento>";
?>
<HR>
<INPUT TYPE="submit" VALUE="Pagina seguente">
<INPUT TYPE="reset" VALUE="Cancella!">
</FORM>
</BODY>
</HTML>
Ora il form tre chiamatelo tre.php
<HTML>
<BODY>
<H2>Consegne Spa ti ringrazia</B>
<TABLE BORDER=6 WIDTH=60% COLS=1>
<TR><TH>Ecco le informazioni da te indicate</TH></TR>
<TR><TD>
<?php
$nome=(urldecode($nome));
$email=(urldecode($email));
$telefono=(urldecode($telefono));
echo "Il tuo nome è: <B>$nome</B><BR>";
echo "Il tuo indirizzo email è: <B>$email</B><BR>";
echo "Il tuo numero di telefono è: <B>$telefono</B><BR>";
echo "Il metodo di pagamento è: <B>$pagamento</B><BR>";
echo "Il tipo di servizio selezionato è: <B>$tipo_consegna</B><BR>";
echo "Ritireremo il plico di: <B>$giorno</B><BR>";
echo "Il peso del plico è: <B>$peso</B><BR>";
?>
</TD></TR>
</TABLE>
</BODY>
</HTML>
Quando mostriamo le variabili passate tramite i campi nascosti dobbiamo decodificarli.

Gli Operatori
Gli operatori sono dei simboli che rappresentano le seguenti operazioni : addizione, sottrazione, divisione, moltiplicazione, modulo.
Operatore Significato
+ addizione
- sottrazione
* moltiplicazione
/ divisione
% modulo
$risposta =(10+12); echo "$risposta"; oppure:
$costo= "10";
$costo+="15";
echo " $costo";
Operatori Combinati
+= $variabile += 5 aggiunge il valore e assegna il risultato
-= $variabile -= 5 sottrae il valore e assegna il risultato
/= $variabile /= 5 divide per il valore e assegna il risultato
Gli operatori di incremento e decremento
Gli operatori di incremento e decremento sono molto usati. Ecco un esempio
$variabile=0;
$variabile++;
echo $variabile;
Esempio Cosa Fa Come fa
++$variabilie Pre-incrementa aggiunge 1 e restituisce il valore
$variabile++ Post-incrementa restituisce il valore originario e aggiunge 1
--$variabile Pre-diminuisce sottrae 1 e restituisce il valore
$variabile-- Post- diminuisce restutuisce il valore originario e diminuisce di uno
Gli operatori di confronto
Esempio Cosa fa
($a = = = $b) $a è uguale a $b e sono dello stesso tipo, ad esempio interi
($a = = $b) $a è uguale a $b
($a < $b) $a è minore di $b
($a > $b) $a è maggiore di $b
($a < = $b) $a è minore o uguale a $b
($a > = $b) $a èmaggiore o uguale a $b
($a ! = $b) $a è diverso da $b
($a <> $b) $a è diverso(uguale a sopra) a $b
Impostiamo due variabili $a=10; e $b=5; allora:( quando usate un editor di testo non ci devono essere spazi tra = =)
($a = = = $b) darà risultato falso
($a < $b) falso
($a > $b) vero
Se invece i valori di $a e di $b erano tutti e due 10
($a = = = $b) vero
($a < $b) falso
($a > $b) falso
Operatori Logici
Questi tipo di operatori si usa molto nelle convalide di password e form
Operatori Esempio Significato
&&,and ($a = = 10 && $b = = 5) sia $a uguale 10 sia che $b uguale a 5
| |,or ($a = = 10 | | $b = = 5) O $a uguale a 10 o $ b uguale 5
xor ($a ! = 10 xor $b ! = 5) o $a è diverso da 10 o $b è diverso da 5 ma no tutte le combinazioni
! ($a = = 10 ! $b = = 5) $a è uguale a 10 e $b è diverso da 5
Se in una variabile abbiamo la seguente operazione 10 - 3 * 5 php fa prima 3 * 5 e poi la sottrazione. Se si desidera fare prima 10-3 si devono mettere tra parentesi(10-3)*5

I Form in una sola pagina
I form in una solo pagina sono dei form particolari. Infatti invece che puntare ad un'altra pagina puntano a se stessi es.
<HTML>
<BODY>
<CENTER>
<?php
echo "<FORM METHOD=POST ACTION=\"$PHP_SELF\">";
?>
<INPUT TYPE="SUBMIT" VALUE="Invia le informazioni!">
<INPUT TYPE="RESET" VALUE="Cancella!">
</FORM>
</BODY>
</HTML>
Ricordandoci di chiamarlo con l'estesione .php . come si vede nel'action c'e $PHP_SELF quella che contiene il nome dello script corrente. Ma come possiamo usare al meglio questa opzione. Possiamo creare una pagina con un if. Cioè se il contenuto di una variabile è vuoto allora mi mistri il form altrimenti mi mostri un'altra cosa.
<HTML>
<BODY>
<?php
if ( (empty($nome)) || (empty($cognome))) {
# esegue questa parte perché il form non è stato ancora inviato
echo "<FORM METHOD=POST ACTION=\"$PHP_SELF\">";
echo "Qual è il tuo nome? <BR> <INPUT TYPE=\"TEXT\" NAME=\"nome\">";
echo "<BR>Qual è il tuo cognome? <BR><INPUT TYPE=\"TEXT\" NAME=\"cognome\">";
echo "<BR><BR>";
echo "<INPUT TYPE=\"SUBMIT\" NAME=\"submit\" VALUE=\"Invia le informazioni!\">";
echo "<INPUT TYPE=\"RESET\" VALUE=\"Cancella!\">";
echo "</FORM>";
} else {
# il form è stato inviato
echo "elaborazione...<BR>";
echo "Le informazioni sono... nome: $nome , cognome: $cognome";
}
?>
</BODY>
</HTML>
Cioè se la variabile nome o cognome sono vuote mi mostra il form
Per verificare che un forma è stato inviato possiamo anche usare un campo nascosto. Ma non solo possiamo verificare i campi inseriti dall'utente. Vi spiegherò passo passo il fomr con i commenti (#) altrimenti alla fine sarebbe scomodo
<HTML>
<BODY>
<?php
# metto tuto il mio form in una variabile
$form="<FORM METHOD=\"GET\" ACTION=\"$PHP_SELF\">
<CENTER><B><H3> Nuovo utente </H3></B></CENTER>
Nome utente<BR> <INPUT TYPE=\"TEXT\" NAME=\"nome\" VALUE=\"$nome\">
<BR>Indirizzo dell'utente<BR><INPUT TYPE=\"TEXT\" NAME=\"indirizzo\" VALUE=\"$indirizzo\">
<BR><BR>
# ecco il campo nascosto
<INPUT TYPE=\"HIDDEN\" NAME=\"stato\" VALUE=\"inviato\">
<INPUT TYPE=\"SUBMIT\" NAME=\"submit\" VALUE=\"Invia le informazioni!\">
<INPUT TYPE=\"RESET\" VALUE=\"Cancella!\">
</FORM>";
# inizio a controllare
$errore_nome=0;
$errore_indirizzo=0;
# il form è stato inviato?
# se il campo nascosto non c'e mostra il form
if ( $stato != "inviato" ) {
echo "$form";
#ma se c'e mi controlli l'input
} else {
if (empty($nome)) {
echo "<B>Errore:</B> Manca il nome dell'utente<BR>";
# se manca mi imposti la variabile a 1
$errore_nome=1;
}
if (empty($indirizzo)) {
echo "<B>Errore:</B> Manca l'indirizzo dell'utente<BR>";
# se manca mi imposti la variabile a 1
$errore_indirizzo=1;
}
#se c'e l'errore mi mostri il form
if (($errore_nome) || ($errore_indirizzo)) {
echo "$form";
} else {
#altrimenti esegui
echo "elaborazione...<BR>";
echo "<B>$nome</B> con indirizzo <B>$indirizzo</B> è stato aggiunto";
# invia un email o scrive su di un file
}
}
?>
</BODY>
</HTML>
Un form così si poteva gestire anche con l'uso delle funzioni però quando noi dichiaravamo la funzione dovevamo dichiarare le nostre variabili all'interno della funzione con global
function form(){
global $variabile
global $variabile1
Poi php
}
Dovevamo mettere tutte le variabili che usavamo anche $PHP_SELF.

Marcature, Commenti e visualizzazione nel Browser
Le marcature d' inizio e fine php sono le seguenti <?php di inizio e ?> di fine.
Per utilizzare i commenti abbiamo i seguenti simboli
# Una sola riga di commento
// Una solo riga di commento
/* Da inizio a più righe di commento
*/ Finisce le riche di commento
Per visualizzare qualcosa nel Browser si usa la seguente marcatura : echo "cosa volete"; Il browser fa vedere il contenuto della funzione echo( si devono mettere le virgolette) poi si deve mettere ; .Php supporta anche codice Html , infatti creiamo ora un file così
<?php
echo "Ciao<br>";
echo "<hr>";
echo "WOW !!!";
?>

Le Sessioni
Le sezioni sono un pò come i cookie soltanto che tutto il lavoro lo fa php. Per dare inizio ad una sessione si usa session_start(). Quando diamo inizio ad una sessione php crea un cookie al posto nostro contenente delle informazioni. Php crea automaticamente anche delle variabili. session_start() va chamata prima di aver rilasciato codice php. Essa scade alla chiusura del browser. Se invece vogliamo chiudere noi la sezione usiamo session_destroy(). Quando apriamo una sessione all'utente viene assegnato un ID . Questo ID può essere richiamato tramite la seguente variabile $PHPSESSID. Con le sessioni possiamo registrare variabili all'interno si esse tramite session_register()
<?php
session_start();
session_register("cognome");
session_register("ruolo");
#basta che ora diamo dei valori a queste variabili
$nome="Miccoli";
$ruolo="Fuoriclasse";
#quando ho scritto le sessioni Miccoli ha tirato
# l'ultimo rigore semifinale coppa italia contro l'inter 12/02/2004
echo "Valori inseriti. Il tuo ID temporaneo è $PHPSESSID";
?>
Con le sessioni si posso fare dei form davvero belli. Facciamo tre form. Il primo (ss1.php) crea una sessione e registra il nome e il dipartimento,il secondo(ss2.php) registra indirizzo e numero di telefono e il terzo (ss3.php) mostra le informazioni e le manda per emal
ss1.php
<?php
# ss1.php
session_start();
$num_impiegato =session_id();
session_register("nome","dipartimento"); ?>
<HTML>
<BODY>
<?php
$form="<CENTER><H2>Consegne Spa - Nuovo Impiegato</H2></CENTER>
<FORM ACTION=\"http://bumper/ss2.php\" METHOD=\"POST\">
<B>Nome impiegato:</B><BR>
<INPUT TYPE=\"text\" NAME=\"nome\" SIZE=20>
<BR><B>Dipartimento</B><BR>
<SELECT NAME=\"dipartimento\" >
<OPTION SELECTED>Autista consegne
<OPTION>Magazzino
<OPTION>Vendite
<OPTION>Amministrazione
</SELECT>
<BR>
<INPUT TYPE=\"submit\" VALUE=\"Pagina seguente\">
<INPUT TYPE=\"reset\" VALUE=\"Cancella!\">
</FORM>";
?>
</BODY></HTML>
<?php
echo $form;
?>
ss2.php
<?php
session_start();
session_register("indirizzo","telefono");
?>
<HTML>
<BODY>
<?php
$form="<CENTER><H2>Consegne Spa - Nuovo Impiegato</H2></CENTER>
<FORM ACTION=\"http://bumper/ss3.php\" METHOD=\"POST\">
<B>Indirizzo impiegato:</B><BR>
<INPUT TYPE=\"text\" NAME=\"indirizzo\" SIZE=30>
<BR><BR><B>Numero telefono impiegato:</B><BR>
<INPUT TYPE=\"text\" NAME=\"telefono\" SIZE=30>
<BR>
<HR>
<INPUT TYPE=\"submit\" VALUE=\"Pagina seguente\">
<INPUT TYPE=\"reset\" VALUE=\"Cancella!\">
</FORM>";
?>
</BODY></HTML>
<?php
echo "$form";
?>
ss3.php
<?php
session_start();
?>
<HTML>
<BODY>
<CENTER><B><H3> Ecco le informazioni sul nuovo impiegato</H3></B></CENTER>
<?php
$visualizza="<PRE>
Nome impiegato: $nome<BR>
Dipartimento: $dipartimento<BR>
Livello retributivo: $stipendio<BR>
Sede: $sede<BR>
Indirizzo casa: $indirizzo<BR>
Telefono: $telefono<BR>
ID impiegato: $num_impiegato<BR></PRE>";
?>
</body>
</html>
<?
echo "$visualizza";
$destinatario="vostraemail@nonso.it";
$header="Inserimento nuovo impiegato";
$info="Ecco le informazioni...
NOME: $nome
DIPARTIMENTO: $dipartimento
LIVELLO RETRIBUTIVO: $stipendio
INDIRIZZO CASA: $indirizzo
NUM TELEFONO: $telefono
ID IMPIEGATO: $num_impiegato";
mail($destinatario,$header,$info);
session_destroy();
?>

Stringhe e Ricerche
Ora impareremo a manipolare le stringhe. Possiamo fare tantissime cose con le stringhe : estrarre una porzione, ottenere la lunghezza, eliminare gli spazi, manipolare i caratteri, ricercare parole, confrontarle, codificare e decodificare gli URL, gestire i caratteri speciali html. Vediamoli uno per uno.
Estrarre una porzione di stringa per estrarre basta indicare a php dove iniziare e dove finire con l'estrazione usando la funzione substr
<?php
$stringa = "Bruce Willis";
$nome = substr($stringa,0,5);
$cognome = substr($stringa,6);
echo "il nome è $nome , il cognome è $cognome";
?>
Esempio
Potete notare come nel cognome abbiamo indicato a php solo da dove iniziare e lui estrarrà da lì fino alla fine.
Ottenere la lunghezza di una stringa
Questa funzione è facilissima basta indicare la stringa nella funzione strlen
<?php
$nome="giorgio";
$lunghezza=strlen($nome);
echo "nella stringa ci sono $lunghezza caratteri";
?>
risultato : nella stringa ci sono 7 caratteri
Eliminazione degli spazi
Si fa utilizzando la funzione trim sempre indicando la stringa
<?php
$nome=" giorgio ";
$stringaripulita=trim($nome);
echo "ecco la stringa ripulita $stringaripulita";
?>
Esempio
Rendere maiuscola l'iniziale di una stringa
Per rendere l'iniziale di una stringa maiuscola si usa la funzione ucfirst. Se nella stringa ci sono più parole ucwords.
<?php
$nome="pinco pallino";
$stringa=ucfirst($nome);
echo "Nome :$stringa";
?>
Risultato Pinco pallino
<?php
$nome="pinco pallino";
$stringa=ucwords($nome);
echo "Nome :$stringa";
?>
Risultato Pinco Pallino

Cercare una stringa
Per cercare una stringa abbiamo due funzioni strpos e strrpos. La prima troverà la prima occorrenza la seconda l'ultima occorrenza.
<?php
$msg="Abbiamo una situazione d'emergenza, gente, ripeto: una situazione d'emergenza";
$prima_occorrenza=strpos($msg,"emergenza");
$ultima_occorrenza=strrpos($msg,"emergenza");
echo "La prima occorrenza è al carattere $prima_occorrenza, l'ultima al carattere $ultima_occorrenza";
?>
Esempio
Ricerca e sostituzione
Sintassi : str_peplace(cerca,inserisci,stringa);
<?php
$msg="La Juventus è seconda in classifica";
$classificanuova= str_replace("seconda","prima",$msg);
echo $classificanuova ;
?>
Risultato : La Juventus è prima in classifica
Convertire un numero in un carattere ASCII
echo (chr(38)); risultato : &
Confronto di due stringhe
Nella convalida dei campi è importante assicurarsi che due stringhe siano uguali. Usiamo la funzione strcmp con il nome delle due stringhe.
<?php
$password_1="master";
$password_2="masterd";
echo strcmp($password_1,$password_2);
?>
Il risultato darebbe -1 perchè non corrispondono altrimenti darebbe 0
Suddividere una stringa in un array
Si usa la funzione explode e tra le " " indichiamo il separatore
<?php
$linea_passwd="giorgio,nicola,peppe";
$campi=explode("," ,$linea_passwd);
while (list(, $valore) = each ($campi)) {
echo "Valore: $valore<BR>";
}
?>
Esempio
Codifica degli a capo di html <br> (vi servirà per MySql)
$testo=n12br($testo);
echo "$testo";
Codifica e Decodifica di una stringa URL
per codifica si usa urlencode e per decodificare urldecode
$input = urlencode("nome_segreto=Giorgio Tave hobby=calcio");
risultato nome_segreto%3DGiorgio!Tave!hobby%3Dcalcio
$input = urldecode("nome_segreto%3DGiorgio!Tave!hobby%3Dcalcio");
risultato nome_segreto=Giorgio Tave hobby=calcio
Questo vi servirà più tardi quando analizzeremo i form

Gestione degli apici (anche questo per MySql)
Abbiamo due funzioni una mette le controbarre davanti agli apici e una li toglie. addslashes e stripslashes.
$stringa = addslashes($stringa);
echo "$stringa";
$stringa = stripslashes($stringa);
echo "$stringa";
Gestione di caratteri speciali HTML
Ci sono dei caratteri html che vanno protetti altrimenti alcuni testi potrebbero essero troncati. Ecco la funzione htlmspecialchars
$stringa = htmlspecialchars($stringa);
echo "$stringa";
Ricerche in generale, all'inizio di una stringa e alla fine
In generale
<?php
$str="quando arrivi fammi un Segnale ";
$pattern="Segnale";
if (!ereg($pattern,$str)) {
echo "Nessuna corrispondenza trovata utilizzando la parola $pattern";
} else {
echo "Ho trovato una corrispondenza utilizzando la parola $pattern... continua la normale elaborazione...";
}
?>
Esempio
Ricerche all'inizio di una stringa
per cercare una parola all'inizio di una stringa basta mettere ^ prima di essa
<?php
$str="Emergenza, Emergenza Sto Affondando Per Un Segnale 15";
if (ereg("^Emergenza",$str)) {
echo "La parola 'Emergenza' è all'inizio di $str";
} else {
echo "La parola 'Emergenza' non è all'inizio di $str";
}
?>
Esempio
per cercare invece alla fine di una stringa basta mettere $ alla fine della parola
<?php
$str="Emergenza, Emergenza Sto Affondando Per Un Segnale 15";
if (ereg("15$",$str)) {
echo "Il numero 15 è alla fine di $str";
} else {
echo "Il numero 15 non è alla fine di $str";
}
?>
Possiamo inserire una stringa anche con ereg_replace che accetta anche i caratteri speciali di espressioni regolari come ^ o $.
<?php
$grassetto="<B>";
$str="Emergenza, Emergenza Sto Affondando Per Un Segnale 15";
$nuova_str=(ereg_replace("^","$grassetto",$str));
echo "$nuova_str";
?>
Lo stesso vale per la marcatura <br>
Esempio
Abbiamo un'altra funzione importante ed è split. Essa prende una stringa e la inserisce in un array mentre noi dobbiamo specificare il sepatore dei campi. Lo spazio è una scelta comune
<?php
$str="Emergenza, Emergenza Sto Affondando Per Un Segnale 15";
$pattern=" ";
$risultato=split($pattern,$str);
foreach ($risultato as $valore)
echo "$valore<BR>";
?>
Esempio
Immaginiamo di avere un negozio con degli articoli
<?php
$str="articolo=Magliette articolo=Pantaloni articolo=Cappotti articolo=Giacche";
$pattern="articolo=";
$risultato=split($pattern,$str);
foreach ($risultato as $articolo)
echo "$articolo<BR>";
?>

Upload File
L'upload di file è un strumento molto importante per chi gestisce siti web . E' importante perché possiamo dare la possibilità agli utenti di inviare dei file. Comunque anche in questo caso dobbiamo avere dei permessi per poter fare l'upload di file. Quindi in questa sezione non ci saranno esempi. Non so se funzionerà ma vi insegnerò come fare. L' upload di file si fa con un semplice form con una dicitura in più che permette a php di capire che si tratta di un invio e con post.
<form method=post action="uploadit.php" ENCTYPE="multipart/form-data">
Il method deve essere post e dobbiamo metter ENCTYPE="multipart/form-data"
L'input che ci permette di sfogliare tra il nostro computer
input type= file name="uploadfile"
Quando noi inviamo il file (uploadfile) php crea delle variabili con il nome del file e l'aggiunta di parole
$uploadfile_name (nome e percorso)
$uploadfile_size (dimensioni)
$uploadfile_tupe (tipo)
$uploadfile (nome del file creato dopo l'invio)
Noi possiamo accedere a queste variabili. Ora vediamo il form d'invio:
<HTML>
<BODY>
<HR>
<FORM METHOD=POST ACTION="uploadit.php "ENCTYPE="multipart/form-data">
<TABLE WIDTH="70%" BORDER="8" CELLSPACING="0">
<TR><TD>
<B>Inserisci il nome del file da inviare </B><INPUT TYPE=FILE NAME="uploadfile"><BR><BR>
<INPUT TYPE="SUBMIT" VALUE="Invia le informazioni!">
<INPUT TYPE="RESET" VALUE="Cancella!">
</TR></TD>
</TABLE>
</FORM>
</BODY>
</HTML>
Una volta inviato ecco come accedere alle variabili e vi spiego con #
<HTML>
<BODY>
<?php
echo "<PRE>";
echo "nome del file locale creato dopo l'invio: $uploadfile\n";
echo "nome originale del file remoto: $uploadfile_name\n";
echo "dimensioni del file in byte: $uploadfile_size\n";
echo "tipo di file: $uploadfile_type\n";
echo "</PRE>";
echo "<HR>";
# abbiamo veramente un file?
if ( $uploadfile == "none" ) {
echo "Non è stato inviato alcun file<BR>";
echo "Ritorna al form per inviare il <A HREF=\"upload.html\">file</A>";
exit;
}
# controlla innanzitutto le dimensioni del file
# se è meno di 3 KB
if ($uploadfile_size < 3072 ) {
# lo copia in una nuova posizione
if (copy($uploadfile,"/home/httpd/docs/$uploadfile_name"))
{
echo "Invio del file riuscito";
# cancella il file temporaneo
unlink($uploadfile);
} else {
echo "Invio del file fallito";
}
} else {
echo "Spiacente, il file da inviare non deve superare le dimensioni di 3 KB<BR>";
}
?>
Ritorna al form per inviare i <A HREF="upload.html">file</A>
</BODY>
</HTML>
=================================================================================
UPLOAD DI FILES
Iniziamo con il form di cortesia
<form method="post" action="upload.php" enctype="multipart/form-data">
<input type="file" name="miofile"><br>
<input type="submit" value="Upload">
</form>
Ed ora il file php:
<html>
<head>
<title>Upload</title>
</head>
<body>
<?PHP
if (miofile == "")
{
print "Scegliere un file da caricare";
}
else
{
$cartella = 'upload'; // cartella per l'upload
$percorso = $_FILES['miofile']['tmp_name'];
$nome = $_FILES['miofile']['name'];
if (move_uploaded_file($percorso, $cartella . "/" . $nome))
{
print "Upload eseguito con successo";
}
else
{
print "problemi durante l'Upload";
}
}
?>
<br><a href="upload.html">Torna indietro</a>
</body>
</html>
==========================================================
Upload File
L'upload di file è un strumento molto importante per chi gestisce siti web . E' importante perché possiamo dare la possibilità agli utenti di inviare dei file. Comunque anche in questo caso dobbiamo avere dei permessi per poter fare l'upload di file. Quindi in questa sezione non ci saranno esempi. Non so se funzionerà ma vi insegnerò come fare. L' upload di file si fa con un semplice form con una dicitura in più che permette a php di capire che si tratta di un invio e con post.
<form method=post action="uploadit.php" ENCTYPE="multipart/form-data">
IL method deve essere post e dobbiamo metter ENCTYPE="multipart/form-data"
L'input che ci permette di sfogliare tra il nostro computer
input type= file name="uploadfile"
Quando noi inviamo il file (uploadfile) php crea delle variabili con il nome del file e l'aggiunta di parole
$uploadfile_name (nome e percorso)
$uploadfile_size (dimensioni)
$uploadfile_tupe (tipo)
$uploadfile (nome del file creato dopo l'invio)
Noi possiamo accedere a queste variabili. Ora vediamo il form d'invio:
<HTML>
<BODY>
<HR>
<FORM METHOD=POST ACTION="uploadit.php "ENCTYPE="multipart/form-data">
<TABLE WIDTH="70%" BORDER="8" CELLSPACING="0">
<TR><TD>
<B>Inserisci il nome del file da inviare </B><INPUT TYPE=FILE NAME="uploadfile"><BR><BR>
<INPUT TYPE="SUBMIT" VALUE="Invia le informazioni!">
<INPUT TYPE="RESET" VALUE="Cancella!">
</TR></TD>
</TABLE>
</FORM>
</BODY>
</HTML>
Una volta inviato ecco come accedere alle variabili e vi spiego con #
<HTML>
<BODY>
<?php
echo "<PRE>";
echo "nome del file locale creato dopo l'invio: $uploadfile\n";
echo "nome originale del file remoto: $uploadfile_name\n";
echo "dimensioni del file in byte: $uploadfile_size\n";
echo "tipo di file: $uploadfile_type\n";
echo "</PRE>";
echo "<HR>";
# abbiamo veramente un file?
if ( $uploadfile == "none" ) {
echo "Non è stato inviato alcun file<BR>";
echo "Ritorna al form per inviare il <A HREF=\"upload.html\">file</A>";
exit;
}
# controlla innanzitutto le dimensioni del file
# se è meno di 3 KB
if ($uploadfile_size < 3072 ) {
# lo copia in una nuova posizione
if (copy($uploadfile,"/home/httpd/docs/$uploadfile_name"))
{
echo "Invio del file riuscito";
# cancella il file temporaneo
unlink($uploadfile);
} else {
echo "Invio del file fallito";
}
} else {
echo "Spiacente, il file da inviare non deve superare le dimensioni di 3 KB<BR>";
}
?>
Ritorna al form per inviare i <A HREF="upload.html">file</A>
</BODY>
</HTML>
=========================================
Upload con Php
Premessa
Come è noto a chiunque abbia un minimo di familiarità con il PHP, è estremamente semplice gestire gli Uploads da un computer-client verso un computer-server. Lo scopo di questo articolo è proprio dimostrarlo e realizzare, alla fine, un semplice script che ci consenta di gestire agevolmente il "caricamento" dei file in rete.
Piccola, ma doverosa, premessa: cosa significa Upload ?
Letteralmente questa parola inglese significa "caricare" e si contrappone, logicamente, a Download (termine probabilmente più familiare del primo), ossia "scaricare".
In breve indica l'operazione di trasferimento di uno o più files da un client verso un server, operazione che di norma viene svolta avvalendosi del protocollo FTP (File Transfer Protocol) e di appositi programmi (detti appunto client FTP). Ma il trasferimento può anche essere attuato, con PHP, tramite un form con metodo POST; ed è proprio questo il caso che stiamo prendendo in considerazione.
PHP, si diceva, può ricevere files "uploadati" da qualunque browser che sia compatibile con le direttive fissate nella RFC (Request For Comments) 1867 che, nel lontano Novembre 1995 (preistoria per gli standard di Internet...), introduceva un nuovo tipo di opzione per i campi di un modulo di tipo input: l'opzione FILE. Inoltre veniva definito un nuovo MIME (Multipurpose Internet Mail Extensions) media type, denominato multipart/form-data (per maggiori informazioni in merito, si può leggere l'intera RFC a questo indirizzo http://www.ietf.org/rfc/rfc1867.txt).
Costruzione del modulo html
Fatta questa premessa introduttiva, possiamo adesso cominciare a costruire il nostro script per gli Uploads. Il primo passo non può che essere la realizzazione del modulo HTML che ci servirà per inviare i nostri files al server; ridotto al suo schema essenziale, il form può essere così concepito:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="upfile">
<input type="hidden" name="MAX_FILE_SIZE" value="10000">
<input type="submit" value="Invia il file">
</form>
Salviamo queste righe in un file chiamato form.html (non è necessaria l'estensione .php, dato che contiene solo istruzioni html).
Un prima considerazione si impone: oltre al campo di tipo FILE, abbiamo aggiunto un campo nascosto (hidden) chiamato MAX_FILE_SIZE con value 10000. Esso indica la 'grandezza' massima (espressa in bytes) del file da caricare e a questo proposito va detto che, come avverte chiaramente anche il manuale ufficiale di PHP, non si deve fare troppo affidamento su questo parametro per "garantirsi" contro gli upload di files di dimensioni maggiori di quella desiderata, perchè il limite è facilmente aggirabile.
Molto più sicuro, a questo fine, è il parametro upload_max_filesize nel file php.ini (il file di configurazione di PHP) che di default è settato a 2 MegaBytes.
Seconda considerazione: adesso che abbiamo il nostro modulo per l'upload, una cosa che balza subito all'occhio è il tasto "sfoglia" (browse) alla destra del campo di tipo FILE; questo bottone serve proprio per selezionare il file dall'hard disk del client che verrà visualizzato (il file, non l'Hard Disk...), all'interno del campo, con il suo percorso assoluto.
Le variabili da usare per l'upload
Prima di addentrarci nella realizzazione della pagina PHP che "raccoglierà" i dati provenienti dal modulo, è necessario spiegare cosa accade quando lo script riceve un Upload.
In questa situazione vengono automaticamente definite alcune variabili particolari, caratterizzate anzitutto dal fatto che il loro nome consta di due parti: la prima coincide con il nome del campo di tipo FILE (nel nostro caso quindi upfile); la seconda invece indica un "attributo" del file.
Da notare altresì che queste variabili saranno disponibili all'interno dell'array globale $HTTP_POST_FILES ($_FILES a partire da PHP 4.1.0), sempre che il parametro track_vars, nel file php.ini, sia settato ad ON (il problema, peraltro, si pone per le versioni di PHP precedenti alla 4.03, a partire dalla quale track_vars è automaticamente abilitato).
Queste variabili sono:
$nomefile (il nome temporaneo del file che viene attribuito al file sul server)
$nomefile_name (il nome originario o il percorso del file sul client)
$nomefile_size (la grandezza, espressa in bytes, del file)
$nomefile_type (il MIME type del file, ad esempio application/x-zip-compressed)
Come detto $nomefile si riferisce al nome del campo FILE del form, quindi $upfile nel nostro esempio.
A questo punto però, è doveroso accennare alla grande modifica introdotta dallo staff di PHP a partire dalla versione 4.2.0 (al momento in cui scrivo siamo arrivati alla 4.2.3), ossia il settaggio ad Off di default del parametro register_globals nel file php.ini.
Senza approfondire troppo l'argomento, in quanto esulerebbe dagli scopi di questo scritto, possiamo limitarci a dire che, a seguito di questa novità per riferirsi alle variabili globali, occorre fare riferimento all'array cui esse appartengono (a meno che non si modifichi php.ini, ovviamente). Nel nostro caso, quindi, all'array $HTTP_POST_FILES sostituiamo l'array $_FILES (in seguito vedremo come rendere comunque compatibili anche le versioni di PHP precedenti alla 4.1.0).
Quindi le variabili si "traducono" in:
$_FILES["nomefile"]["tmp_name"] (il nome temporaneo del file che viene attribuito al file sul server)
$_FILES["nomefile"]["name"] (il nome originario o il percorso del file sul client)
$_FILES["nomefile"]["size"] (la grandezza, espressa in bytes, del file)
$_FILES["nomefile"]["type"] (il MIME type del file, ad esempio image/gif).
Costruiamo la pagina Php per l'upload
Cominciamo quindi a costruire la pagina .php che si occuperà di verificare l'upload e di gestire il file come vogliamo. Per comodità, preferisco scrivere prima tutto il codice e poi spiegarlo passo passo, con l'avvertenza che anche qui, come nel form, lo script sarà semplice, senza troppe opzioni.
<?php
// QUESTE RIGHE RENDONO LO SCRIPT COMPATIBILE CON LE VERSIONI
// DI PHP PRECEDENTI ALLA 4.1.0
if(!isset($_FILES)) $_FILES = $HTTP_POST_FILES;
if(!isset($_SERVER)) $_SERVER = $HTTP_SERVER_VARS;
/********************* VARIABILI DA SETTARE ********************/
// Directory dove salvare i files Uploadati ( chmod 777, percorso assoluto)
$upload_dir = $_SERVER["DOCUMENT_ROOT"] . "/upload";
// Eventuale nuovo nome da dare al file uploadato
$new_name = "";
// Se $new_name è vuota, il nome sarà lo stesso del file uploadato
$file_name = ($new_name) ? $new_name : $_FILES["upfile"]["name"];
if(trim($_FILES["upfile"]["name"]) == "") {
die("Non hai indicato il file da uploadare !");
}
if(@is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
@move_uploaded_file($_FILES["upfile"]["tmp_name"], "$upload_dir/$file_name")
or die("Impossibile spostare il file, controlla l'esistenza o i permessi della directory
dove fare l'upload.");
} else {
die("Problemi nell'upload del file " . $_FILES["upfile"]["name"]);
}
echo "L'upload del file " . $_FILES["upfile"]["name"] . " è avvenuto correttamente";
?>
Le prime righe, come chiarisce il commento, servono a rendere disponibile la sintassi dei nuovi array introdotti con PHP 4.1.0 anche alle versioni precedenti.
Le due variabili da settare sono rispettivamente:
* la directory dove spostare i files uploadati ($upload_dir, da indicare con il percorso assoluto sul server e i cui permessi vanno settati a 777)
* l'eventuale nuovo nome da dare al file che viene caricato sul server ($new_name; se non si vuole rinominare il file, questo avrà lo stesso nome che aveva sul computer client.)
A questo punto effettuiamo un controllo per verificare se è stato selezionato un file per l'Upload, e lo facciamo con riferimento alla proprietà "name" del file.
Andata a buon fine questa verifica, possiamo passare al cuore dello script, la parte cioè che "sposta" il file caricato in rete dalla directory temporanea del server (che si può settare in php.ini, nella variabile upload_tmp_dir) alla directory da noi indicata, eventualmente rinominandolo.
Le funzioni usate a questo scopo, sono is_uploaded_file() (PHP 3>= 3.0.17, PHP 4 >= 4.0.3) e move_uploaded_file() (PHP 4 >= 4.0.3, eventualmente si può usare copy() in sostituzione). La prima funzione prende come parametro la variabile che contiene il nome temporaneo del file uploadato sul server ($_FILES["upfile"]["tmp_name"]) e verifica, appunto, se sia stato caricato; la seconda funzione prende due parametri: il primo è il nome temporaneo ed il secondo è il percorso finale (comprensivo del nome, nuovo o meno, del file) dove spostarlo.
A questo proposito vi segnalo che è possibile, nell'ipotesi in cui si disponga di una versione di PHP in cui non sia presente la funzione is_uploaded_file(), "costruirne" una che svolga lo stesso compito, come evidenziato dal manuale ufficiale a questo link: http://www.php.net/manual/it/features.file-upload.php
Se anche queste operazioni si svolgono senza problemi (nel caso di difficoltà, lo script restituirà solo messaggi d'errore personalizzati), verrà stampata a video la frase che ci conferma che l'upload è avvenuto correttamente.
Conclusioni
Tutto molto semplice come si vede. Ovviamente è possibile implementare ulteriori controlli all'interno dello script; ad esempio, sfruttando la proprietà "type", si può agevolmente limitare l'upload solo a determinati tipi di files aggiungendo poche righe subito dopo il controllo sull'esistenza del file uploadato:
$allowed_types = array("image/gif","image/x-png","image/pjpeg","image/jpeg");
if(!in_array($_FILES["upfile"]["type"],$allowed_types)) {
die("Il file non è di un tipo consentito, sono ammessi solo i seguenti: " . implode(",", $allowed_types) . ".");
}
Sulla base di questo esempio, sarebbe consentito solo l'upload di immagini .gif, .png e .jpg (o .jpeg).

Controlli Form
Ci sono altri controlli che ci potrebbero servire nei form vediamone alcuni
Una cosa importante è la convalida di una e-mail
$pattern="^[^@ ]+@[^@ ]+\.[^@ \.]+$";
if (!ereg($pattern,$email)) {
echo "Questa <b>\"$email\"</b> non e un email valida";
}else{
echo "Questa e la tua email <b>$email</b><br>";
}
Nella variabile pattern mettiamo cosa deve contenere la nostra variabile email.Allora con ^ gli diciamo inizio della stringa poi [^@] gli diciamo che può contenere tutti i caratteri tranne @ poi deve avere una @ (+@) poi ancora ^[@](tutti i caratteri meno che @) poi ci deve essere il punto \. poi tutti i caratteri meno che @ e il punto [^@\.] e poi la stringa deve finire.
Con ereg confrontiamo le due stringhe e siccome prima di ereg mettiamo ! vuol dire se sono diverse
Controllo della lunghezza di un campo
<?php
$lungh_nome=strlen($nome);
if ($lungh_nome <= 3) {
echo "Spiacente, il nome deve contenere almeno 3 caratteri";
echo "<BR><A HREF=\ "name.html\ ">Ritorna</A> al form";
} else {
echo "$nome va bene";
}
?>
Come si vede usiamo la funzione strlen per ricavare la lunghezza e poi gli diciamo se è minore di 3 non va bene.
Controllo di numeri
<?php
if(is_numeric($eta)) {
echo "è un numero";
}else{
echo "non è un numero";
}
?>
Stavolta usiamo is_numeric che controlla che sia un numero.

Convalida Form
Una volta che noi premiamo invia ed arriviamo alla nostra pagina di destinazione possiamo controllare ogni elemento che vogliamo. Basta accederci come vi ho insegnato prima
Usando il modulo che c'era in esempio prima creiamo una pagina di convalida per i campi.
Ecco il modulo nelle parti che ci servono. Innanzi tutto vediamo come abbiamo cambiato la pagina di destinazione ne creiamo un'altra. Nella pagina verifica1.php vengo passate le variabili $nome $cognome $email (una o tutte $sport $cinema $donne $forum) (solo una fra $56k $isdn $adsl $fastweb) $commenti.
<form method=get action="verifica1.php">
<center>
Inserisci il tuo nome:<input type="text" name="nome" size="30"><br>
Inserisci il tuo cognome:<input type="text" name ="cognome" size="30"><br>
Inserisci la tua e-mail:<input type="text" name ="email" size="30"><br><br><br><br>
Scegli quale sezione vorresti che ci fosse nel sito:<br>
<input type="checkbox" name="sport" value="sport">sport
<input type="checkbox" name="cinema" value="cinema">cinema
<input type="checkbox" name="donne" value="donne">donne
<input type="checkbox" name="forum" value="forum" checked>forum<br>
<br>Scegli la connessione che usi<br>
<input type="radio" name="linea" value="56k" checked>56k
<input type="radio" name="linea" value="isdn">isdn
<input type="radio" name="linea" value="adsl">adsl
<input type="radio" name="linea" value="56k">fastweb<br>
<br>Inserisci ora i tuoi commenti<br>
<textarea name="commenti" rows="7" cols="70">
</textarea>
Ora basta accedere alle variabili. Facciamo anche una cosa carina se c'e qualcosa che non va php mi mostra il link per tornare indietro. Ogni volta che farò qualcosa vi spiegherò trami te un commento come funziona (#)
<HTML>
<BODY>
<?php
$errore=false;
#ho impostato la variabile a false in modo che quando c'e mi mostri torna indietro
if ( ($nome == "") || ($cognome == "") || ($email == "")) {
#se solo uno dei campi è vuoto
$errore=true;
echo "<BR>Spiacente, devi compilare tutti i campi<br>";
} else {
echo "Ciao $nome $cognome<br>Questa è la tua email : $email<br>";
}
if ( ($sport == "") && ($cinema == "") && ($donne == "") && ($forum == "") ) {
$errore=true;
#se tutti i campi sono vuoti
echo "<BR>Spiacente, devi inserire almeno una sezione che vorresti<br>";
} else {
echo "Nel sito vorresti <b>$sport $cinema $donne $forum</b><br>";
}
#sela variabile lineaa è vuota
if ( $linea == "" ) {
$errore=true;
echo "<BR>Spiacente, devi indicarmi a con che linea navighi<br>";
} else {
echo "Ecco tu navighi con una linea $linea<br>";
}
#se la variabile commenti è vuota
if ( $commenti == "" ) {
$errore=true;
echo "<BR>Spiacente, non hai inserito i commenti<br>";
} else {
echo "Questi i tuoi comenti: <br> $commenti<br>";
}
#se una delle situazioni non risulta effettuate
#la variabile errore viene impostata a true
# quindi è presente e mi mostra Torna al modulo
if ( $errore) {
echo "<BR>Non hai compilato tutti i campi, devi tornare al <A HREF=\"modulo.php\">modulo</A> ";
}
?>
</BODY>
</HTML>

I Menu
Ora vi illustrerò due tipi di menu di navigazione. Il primo fatto con select e che punta ad un'altra pagina l'altro normale che punta alla stessa pagina
Con select(che punta ad un altra pagina)
<HTML>
<BODY>
<FORM METHOD=POST ACTION="redirect.php">
Dove vuoi andare?<br>
<SELECT NAME=url SIZE="3">
<OPTION SELECTED VALUE="http://www.giorgiotave.it"> Giorgiotave
<OPTION VALUE="http://www.virgilio.it"> Virgilio
<OPTION VALUE="http://www.giorgiotave/tutorila/home.htm"> Tutorial
</SELECT>
<INPUT TYPE="submit" VALUE="Andiamo!">
</FORM>
</BODY>
</HTML>
Come vedete il form ci porta ad un'altra pagina (redirect.php)
Questa funzione header ("Location : $url"); va messa prima all'inizio pagina.
<?php
header ("Location: $url");
?>
Ecco qua basta che gli passo la variabile nell' header . Esempio
Navigazione che punta alla stessa pagina
Basta inserire nel modulo action e lo stesso nome della pagina e all'inizio della pagina mettiamo
if($url){
header ("Location: $url");
exit;
}
cioè se è presente la variabile $url non fa niente se c'e va alla pagina, quindi fino a quando noi non premiamo invia la variabile non è presente quindi non fa niente
<?php
if ($url) {
header ("Location: $url");
exit;
}
$location1="http://www.giorgiotave.it";
$location2="http://www.giorgiotave.it/tutorial/home.htm";
$location3="http://www.giorgiotave.it/giochi/home.htm";
?>
<HTML>
<BODY>
<CENTER> <B><H2>Consegne Spa</H2>
Menu Principale</B>
<FORM METHOD=POST ACTION="menu.php">
<?php
echo "<INPUT NAME=\"url\" TYPE=\"HIDDEN\" VALUE=\"$location1\">";
?>
<INPUT TYPE="SUBMIT" VALUE=" Home Page ">
</FORM>
<FORM METHOD=POST ACTION="menu.php">
<?php
echo "<INPUT NAME=\"url\" TYPE=\"HIDDEN\" VALUE=\"$location2\">";
?>
<INPUT TYPE="SUBMIT" VALUE=" Tutorial ">
</FORM>
<FORM METHOD=POST ACTION="menu.php">
<?php
echo "<INPUT NAME=\"url\" TYPE=\"HIDDEN\" VALUE=\"$location3\">";
?>
<INPUT TYPE="SUBMIT" VALUE=" Giochi ">
</FORM>
</CENTER>
</BODY>
</HTML>
Come si può vedere ho creato tre form per ogni tipo di collegamento e in ognuno di essi gli passo la variabile in un campo nascosto più facile di cosi

Invio Email
Per inviare una e-mail ecco la sintassi
mail (destinatario,oggetto, messaggio);
In locale non so se vi funziona dipende come è impostata la funzione sendmail. Comunque se in locale non vi funziona fate come ho fatto io la pubblicavo sullo spazio dove ho il mio sito e via. Lo so che è una soluzione poco professionale ma funziona e quando una cosa funziona non importa come.
Con questa funzione si possono mandare più e-mail contemporaneamente basta separare da virgola gli indirizzi web
<?php
$destinatario ="giorgiotave@libero.it";
$oggetto ="prova di email";
$info="questa è una prova";
mail ($destinatario, $oggetto, $info);
?>
Cosi verrà mandata una e-mail a giorgiotave@libero.it con oggetto (prova di email) e il testo (questa è una prova) .
Se inviamo quella email nella posta ci arriva una email dal server da dove la mandiamo. Ora vi mostrerò come mandare una email da un form modificando anche il mittente in modo che ci segnala da chi la manda. Facciamo un form (come sempre) che invii i nostri dati alla pagina send.php ecco il form:
<html>
<body>
<form method="get" action="send.php">
Il tuo nome <input type="text" name="nomemittente"><br>
La tua e-mail <input type="text" name="emailmittente"><br>
Il nome del destinatario <input type="text" name="nomedestinatario"><br>
L'email del destinatario <input type="text" name="emaildestinatario"><br>
Cosa vuoi dirgli<br>
<textarea name="commenti" rows="7" cols="70"></textarea><br>
<input type="submit" value="Invia"> <input type="reset" value="cancella">
</form>
</body>
</html>
Come potete veder è un form normale dove chiede vari campi(nomemittente,emailmittente,nomedestinatario,
emaildestinatario,commenti) che saranno trasformati in variabili e noi possiamo accedere dall pagine send.php eccola:
<?php
if(!$risultato = ereg("^[^@ ]+@[^@ ]+\.[^@ \.]+$", $emaildestinatario)){
echo " Questa $emaildestinatario non è una email valida";
}else{
$messaggio="";
$messaggio .="Ciao <b>$nomedestinatario!!$nomemittente Ti ha mandato una email dal sito www.giorgiotave.it ";
$destinatario= "$emaildestinatario";
$oggetto="Modulo inviato dal sito www.giorgiotave.it";
$intestazioni="From: $nomemittente<>\n";
$messaggio.="\n Ecco cosa ti ha scritto:\n $commenti";
$intestazioni.="Reply-To: $emailmittente";
mail($destinatario,$oggetto,$messaggio,$intestazioni);
echo "ecco cosa hai mandato<br>$messaggio";
echo "<br><a href=\"http://www.giorgiotave.it\">Torna alla Home</a>";
}
?>
All'inizio controlliamo l'email(noi controlliamo solo quella del destinatario) e se non è valida non fa niente, se è valida la invia. Allora ci sono alcune cose da notare nello script. Una è che quando mettiamo il punto prima dell' uguale in una variabile gli accodiamo informazioni($messaggio .="Ciao <b>$nomedestinatario!! $nomemittente Ti ha mandato una email dal sito www.giorgiotave.it "; ) . Come potete vedere l'ho usato spesso. L'altra cosa da notare è l'aggiunta di un'altra variabile chiamate intestazioni che va a modificare le impostazioni dell'email. Infatti Reply-To: $emailmittente serve per sapere a chi deve rispondere il destinatario e From: $nomemittente chi manda la nostra email.
=========================================================
 

Mandare un'email in php
(Vale solo per coloro che utilizzano PHP4 sotto windows)
Andate a cercare il file php.ini e modificale le seguenti righe:
[mail function]
SMTP =                 ; for win32 only
sendmail_from =               ; for win32 only
In corrispondenza della voce SMTP dovrete scrive localhost (oppure il nome del server di posta in uscita). In corrispondenza della voce sendmail_from invece scrivete il vostro indirizzo di posta. Così permetterete che la funzione di PHP mail() funzioni a dovere. Ora, dopo questa semplice configurazione, iniziamo ad entrare nel vivo della guida. Seguite i passi seguenti per creare, prima un semplice modulo di feedback in HTML che ci servirà come interfaccia grafica per il nostro script, e poi lo script veo e proprio.
Il modulo di feedback:
<HTML>
<HEAD><TITLE>Modulo feedback</TITLE></HEAD>
<BODY>
<FORM method="post" action="invia_modulo.php">
<P><b>Il tuo nome:</b>
<input type="text" name="nome_mittente" size=30></P>
<p><b>Il tuo indirizzo e-mail:</b><br>
<input type="text" name="mail_mittente" size=30></p>
<p><b>Messaggio:</b></p>
<textarea nema="messaggio" cols=30 rows=50 wrap=virtual></textarea></p>
<p><input type="submit" name="invio" value="ok"></p>
</FORM>
</BODY>
</HTML>
Ora salvate il tutto in: modulo.htm
Ora passiamo allo script PHP vero e proprio, e digitiamo:
<?
$msg="e-mail inviata dal sito\n";
$msg.="Nome del mittente:\t$nome_mittente\n";
$msg.="Indirizzo e-mail del mittente:\t$mail_mittente\n";
$msg.="Messaggio:\t$messaggio\n\n";
$destinatario="tuamail@tuoprovider.it";
$oggetto="Feedback del sito";
$intestazione_mail="From: il mio sito <>\n";
$intestazione_mail.="Reply-to: $mail_mittente\n\n";
mail($destinatario, $oggetto, $intestazione_mail);
?>
Ora aggiungiamo qualche riga in HTML che ci permette di sapere se veramente l'email è stata inviata. Nello stesso file continuiamo a scrivere:
<html>
<head><title>Email inviata</title></head>
<body>
<h1> La tua e-mail è stata inviata con successo</h1>
</body>
</html>
Ora non ci resta che salvare il documento nella stessa cartella del precedente file (modulo.html) in: invia_modulo.php. Ora trasportiamo entrambi i file nella cartella del ser server php, e facciamo partire con il browser il file modulo.htm, inseriamo tutti i campi e premiamo OK. Se tutto è andato bene il modulo ci risponderà positivamente. Un update quasi necessario, potrebbe essere, quello di sostituire alla variabile $destinatario, quello di più utenti o implementare l'invio di file allegati.

Operazioni sui File
Devo prima dire che se in locale le seguenti operazioni vi funzioneranno su un sito web potrebbero non andare per tanti motivi. Infatti dipende dal server che è installato sul vostro sito web (se è su windows o linux). Poi dovete avere i permessi. Per esempio il mio sito è su windows. Io posso accedere ai miei file solo se sono nella cartella public.
Un'altra cosa da dire è che per raggiungere i file abbiamo bisogno dei percorsi. Infatti se il file che voglio aprire si trova in una cartella superiore la dobbiamo raggiungere con lo slash / e il nome della cartella. Se la cartella è in una posizione inferiore la raggiungiamo con ../
Specifico che dove ci saranno operazioni con i file non ci saranno esempi da vedere basta che copiate e incollate il codice nel bloc notes e verificatelo sul vostro computer. Se ci sono problemi postate sul nostro
forum
I file hanno diverse modalità di apertura
Modalità Descrizione
a Apre il file per il solo accodamento di informazioni
a+ Apri il file per accodare e leggere, se il file non c'e ne verrà creato uno nuovo
r Apre il file per la lettura
r+ Apre il file per la lettura e scrittura
w Apre il file per la scrittura ma si usa solo per creare nuovi file altrimenti cancellerà i contenuti
w+ Apre il file per la lettura e scrittura ma si usa solo per creare nuovi file altrimenti cancellerà i contenuti
Aprire un File
fopen("nome_file","modalità");
Ci conviene mettere l'operazione in una variabile
$file=fopen("nomi.txt","r");
Verificare l'aperuta di un file
E' importantissimo verificare se un file è stato aperto con un if
<?php
if(!$file=fopen("nomi.txt","r")){
echo "non posso aprire il file";
exit;
}
?>
Mettendo ! davanti alla nostra espressione diciamo se non è possibile aprire il file.
Se non si può aprire sul browser si vedrà un messaggio d'errore. Per disabilitare i messaggi d'errore basta mettere all'inizio della stringa il carattere @
<?php
if(@!$file=fopen("nomi.txt","r")){
echo "non posso aprire il file";
exit;
}
?>
Ora vediamo come chiudere,scrivere e leggere su un file
chiudere : fclose($file);
scrivere: fputs($file,"testo"); (il file deve essere aperto)
leggere: fgets($file,Byte da leggere); (il file deve essere aperto)
Facciamo degli esempio con questi consigli
1)quando scriviamo alla fine della stringa forziamo a capo con \n
2)per leggere una riga di file i byte sono 255
Scriviamo su file
<?php
$linea1="E questa è la fine del mio file... per il momento\n";
$linea2="E' tutto, gente";
if (!$p_file = fopen("miofile.txt","w")) {
echo "Spiacente, non posso aprire il file miofile.txt";
exit;
}
fputs($p_file,"Ecco il file che ho appena creato!\n");
fputs($p_file,$linea1);
fputs($p_file,$linea2);
fclose($p_file);
?>
Ora leggiamo il file
<?php
if (!$p_file = fopen("miofile.txt","r")) {
echo "Spiacente, non posso aprire il file miofile.txt";
exit;
}
$linea= (fgets($p_file,255));
$linea2= (fgets($p_file,255));
$linea3= (fgets($p_file,255));
echo "$linea<BR>";
echo "$linea2<BR>";
echo "$linea3<BR>";
fclose($p_file);
?>
Il risultato sarà
Ecco il file che ho appena creato!
E questa la fine del mio file...per il momento
E tutto,gente
Ora accodiamo informazioni
<?php
$inserisci_linea="\nBu! Ti ho spaventato?";
if (!$p_file = fopen("/tmp/miofile.txt","a")) {
echo "Spiacente, non posso aprire il file miofile.txt";
} else {
fputs($p_file,$inserisci_linea);
fclose($p_file);
}
?>

Scrivere i file con i form
Sempre ricordandoci di avere i permessi sul nostro file, noi possiamo scrivere su file da un form. Per esempio possiamo realizzare questo per tante cose però dobbiamo strare attenti perchè è un pò pericoloso. Ammettiamo che qualcuno scriva su un file qualche operazione php dannosa......Diciamo che si deve stare attenti a cosa lo usiamo. Ma non vi preoccupate la scrittura da form a file non la faremo per cose importanti infatti per quelle ci sono i database. Siccome c'e la scrittura nei file non posso mostrarvi l'esempio se no intaserei la mia cartella e non mi va nemmeno di crearne altre(si il mio serve mi da una cartella e li posso scrivere e leggere i miei file). Basta che copiate e incollate il codice nel bloc notes e salvate le pagine con il loro nome.
Pagina dove si possono inserire annunci nome : uno.htm (si nota come uso il marcatore &nbsp; per fare gli spazi non è professionale ma dovevo fare in fretta
<html>
<body>
<center>
<form method=get action="verifica.php">
<br>Nome
<input type="text" name="nome" size="20">
<br>Recapito
<input type="text" name="recapito" size="20">
<p>Oggetto&nbsp;&nbsp;
<br>&nbsp;&nbsp; <textarea name="oggetto" rows="3" cols="40"></textarea> </p>
<br>
<input type="submit" value="Invia">
<input type="reset" value="Cancella">
</form>
</body>
</html>
Non vi sto a spiegare il modulo perchè semplice(un semplice modulo con tre campi)
Come si nota il pulsante invia mi porta ad una pagina chiamate verifica.php
<?php
echo "<center>";
echo "Ciao ecco i risultati del tuo inserimento:";
$errore= false;
If((!$nome) || (!$recapito) || (!$oggetto)) {
#controllo che nessun campo sia vuoto
$errore=true;
echo "Non hai compilato tutti i campi <a href=\"uno.htm\">torna indietro</a>";
exit;
}
else{
echo " i campi sono ok";
}
#controllo che il file sia accessibile
if (!$apri = fopen ("file.txt","a+")) {
$errore=true;
echo "non posso aprire il file";
}else{
$apriw = fopen ("file.txt","a+");
#ora creo una variabile che contiene la linea di reparazione
$linea ="<hr color=red>";
# e sul file scrivo nome e vado a capo,il recapito e vado a capo
# l'oggetto e vado a capo e la linea ti separazione
fputs($apriw,"$nome\n");
fputs($apriw,"$recapito\n");
fputs($apriw,"$oggetto\n");
fputs($apriw,"$linea");
#chiudo il file
fclose($apriw);
}
#se c'e l'errore mi dice di inserirli di nuovo altrimenti mi fa leggere gli annunci
if($errore){
echo"<br> Riinseriscili perfavore<br>";
}
else{
echo "<br> <a href=\"annunci.php\">leggi gli annunci</a>";
}
?>
Ecco la pagina che mi legge dal file chiamata annunci.php
<?php
echo "Ecco i vostri annunci<br>";
if (!$apri = fopen("file.txt","r")){
echo "Non posso aprire il file";
}else{
#Se il file si può leggere allora con un ciclo while
# leggo tutte le righe del mio file
while(!feof($apri)){
$leggo = fgets($apri,255);
echo "$leggo<br>";
}
}
fclose($apri);
?>

Variabili del Server Web
In php abbiamo delle variabili che vengono create senza che vogliamo(quando vengono passate da un form) .Queste variabili sono predefinite secondo il protocollo CGI (Common Gateway Interface).Abbiamo già incontrato $PHP_SELF Ora vedremo quelle che ci possono servire.
Informazioni del server
SERVER_SOFTWARE il server
SERVER_NAME nome del server
SCRIPT_FILENAM percorso e nome dello script
SCRIPT_NAME nome dello script
Informazioni del Client
REMOTE_HOST nome del computer(quasi sempre il isp con cui vi collegate ad internet)
REMOTE_USER nome dell'utente(se richiediamo una autenticazione)
REQUEST_METHOD se era get o post
REMOTE_ADDR indirizzo del browser che fa la richiesta(quasi sempre il isp con cui vi collegate ad internet)
Informazioni passate dal client al server
QUERY_STRING è la parte dell'url dopo il punto interrogativo 
CONTENT_LENGTH lunghezza dei dati inviati
HTTP_USER_AGENT nome del browser e sistema operativo
Alcune variabili predefinite di php che ci possono servire
HTTP_AUTH_USER nome dell'utente(se c'e autenticazione)
HTTP_AUTH_PW password(se c'e autenticazione)
PHP_SELF nome dello script
HTTP_POST_VARS array che contiene le coppie chiave-valore(con post)
HTTP_GET_VARS array che contiene le coppie chiave-valore(con get)
HTTP_COOKIE_VAR["PHPSESSID"] Contiene il valore dell' ID di sessione
HTTP_SERVER_VAR["HTTP_COOKIE"] Contiene il valore di tutti i cookie
HTTP_SERVER_VAR["HTTP_HOST"] Contiene il nome dell'host su quale risiede il server web
HTTP_SERVER_VAR["REMOTE_ADDR"] Contiene l'indirizzo remoto del browser(Sicuramente dell'ISP)
HTTP_SERVER_VAR["SCRIPT_FILENAME"] Contiene il nome e il percorso completo dello script corrente
HTTP_SERVER_VAR["SERVER_ADMIN"] Dovrebbe contenere l'indirizzo e-mail inserito nel file di configurazione
HTTP_SERVER_VAR["SERVER_NAME"] Contiene il nome del server web
HTTP_SERVER_VAR["SERVER_SOFTWARE"] Contiene il nome del server web

Realizzare un Guestbook
Che cosa è un Guestbook ?
Un Guestbook non è altro che una raccolta di messaggi, postati dagli utenti. Questi utenti, scrivendo vari messaggi, decidono di esprimere il loro personale parere sul sito che stanno visitando. Proprio per questo motivo, la struttura del Guestbook deve essere molto semplice ma soprattutto carina e simpatica, in modo da attirare l’ utente a leggere i messaggi lasciati e quindi a scriverne dei nuovi.
Struttura
Come è stato già detto, la struttura del Guestbook è essenzialmente semplice. Seguendo questo Tutorial saremo in grado di realizzare un Guestbook completo anche di amministrazione, simile a questo:
Il Guestbook analizzato in questo Tutorial, infatti consta soltanto di cinque pagine.
# install.php
# conn.php
# default.php
# insert.php
# admin.php
# delete.php
Queste cinque pagine possono essere racchiuse in due gruppi: Lato Utente e Lato Amministratore. Le pagine default.php e insert.php sono Lato Utente, in quanto interagiscono con gli utenti che visitano il Guestbook e quindi postano messaggi. Mentre le pagine admin.php e delete.php, sono Lato Amministratore perché vengono utilizzate appunto dall’ amministratore del Guestbook nel caso in cui si debba eliminare qualche messaggio. In fine le pagina conn.php e install.php possono essere classificate come Lato Utente/Lato Amministratore in quanto vengono utilizzate da entrambi. Proprio per questo motivo, iniziamo ad analizzare queste pagine.
Pagina : install.php
Questa pagina serve per creare il Database del nostro Guestbook e la tabella che contiene i messaggi postati dagli utenti.
Creiamo il Database
mysql_connect("localhost", "root")or die ("Non riesco a connettermi !");
$strsql = "CREATE DATABASE `guestbook`";
$query = mysql_query($strsql);
Creiamo la tabella
mysql_select_db("guestbook") or die ("Non riesco a selezionare la tabella ");
$strsql2 = "CREATE TABLE `messaggi` (
`id` TINYINT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`testo` MEDIUMTEXT NOT NULL,
`data_ora` MEDIUMTEXT NOT NULL,
`autore` MEDIUMTEXT NOT NULL,
`email` MEDIUMTEXT NOT NULL,
`sito` MEDIUMTEXT NOT NULL,
`voto` SMALLINT(1) DEFAULT '1' NOT NULL
); ";
$query2 = mysql_query($strsql2);
mysql_close();
Dopo aver creato il database e la tabella, aggiungiamo un comando, in modo che la pagina install.php ci porti direttamente alla pagina del guestbook, default.php
header('Location: default.php');
Pagina: conn.php
Questa pagina è fondamentale in quanto serve per effettuare la connessione con il database del nostro Guestbook. Per collegarci con il database utilizziamo i classici comandi offerti da MySQL
mysql_connect("localhost", "root") or die ("Non riesco a selezionare la tabella ");
Quindi selezioniamo il database su cui vogliamo lavorare
mysql_select_db("guestbook") or die ("Non riesco a selezionare la tabella");
Una cosa molto importante da ricordare e che alla fine di ogni pagina che lavora con i database, bisogna sempre chiudere la connessione a MySQL.
Lato Utente
La parte Lato Utente, comprende quelle pagine, che interagiscono direttamente con l’ utente, cioè che permettono la visualizzazione dei messaggi postati sul nostro Guestbook, e l’ eventuale inserimento di nuovi messaggi. La pagina default.php è proprio quella che restituisce la lista di tutti i messaggi, mentre la pagina insert.php, è utilizzata dall’ utente per l’ inserimento del messaggio.
Pagina: default.php
La primissima operazione da effettuare è includere la pagina di connessione, in quanto tutte le pagine del nostro Guestbook lavorano con la tabella del Database:
include("conn.php");
Ora possiamo iniziare con la vera programmazione del Guestbook ;-).
Una cosa importante da fare, è quella di dare visione all’ utente sul numero di messaggi lasciati nel Guestbook. Per fare ciò basta soltanto contare il numero di record della tabella del Database e quindi restituire questo valore:
$strsql3 = "select count(*) as numero from messaggi";
$query3 = mysql_query($strsql3);
$row3 = mysql_fetch_array($query3);
$numero = $row3["numero"];
mysql_free_result($query3);
Quindi rendiamo in output questo valore nel codice Html del Guestbook:
I nostri Utenti hanno postato <?=$numero?> messaggio/i
E’ arrivato il momento di visualizzare i messaggi postati dagli Utenti. Questi messaggi non verranno visualizzati tutti in una pagina, altrimenti uscirebbe una pagina lunga chilometri, ma soltanto cinque messaggi per pagina; dobbiamo quindi impostare il numero di messaggi per pagina (quindi il numero di record da visualizzare) e per le pagine successive l’ inizio, ovvero il punto di partenza da cui selezioneremo gli altri messaggi; naturalmente nella prima pagina l’ inizio è zero:
$numero_record = 5;
if(!isset($HTTP_GET_VARS["inizio"])){
$inizio = 0;
}else{
$inizio = $HTTP_GET_VARS["inizio"];
}
Ora selezioniamo dalla tabella del Database i messaggi, o meglio non tutti i messaggi ma a gruppi di cinque:
$strsql = "select * from messaggi order by id desc limit $inizio,$numero_record";
$query = mysql_query($strsql);
Quindi troviamo il numero totale di record presenti nella tabella del Database:
$strsql2 = "select * from messaggi";
$query2 = mysql_query($strsql2);
$numero_record_totali = mysql_numrows($query2);
Rimane soltanto di ricavare il numero totale di pagine in relazione al numero di messaggi che vogliamo visualizzare:
$numero_pagine = ceil($numero_record_totali/$numero_record);
Finalmente possiamo rendere in output i messaggi del Guestbook. Per visualizzare i messaggi utilizziamo il classico ciclo While recuperando tutti i campi della tabella del Database:
while($row = mysql_fetch_array($query)){
$autore = $row["autore"];
$email = $row["email"];
$sito = $row["sito"];
$testo = $row["testo"];
$data_ora = $row["data_ora"];
$voto = $row["voto"];
echo"Autore: ".$autore." (".$email.")<br>";
echo"Sito: ".$sito."<br>";
echo"Testo: ".$testo."<br>";
echo"Data e Ora: ".$data_ora."<br>";
echo"Valutazione: ".$voto."<br><hr>";
}
Siccome con il ciclo while non vengono visualizzati tutti i messaggi ma soltanto cinque, bisogna creare un For che restituisca il numero di pagine, in modo da andare avanti con la visualizzazione dei messaggi:
if($numero_pagine > 1){
for($pagina = 1; $pagina <= $numero_pagine; $pagina++){
if($pagina == $pagina_corrente){
echo"<b>".$pagina."</b>";
}else{
echo"<a href='default.php?inizio=".(($pagina - 1) * $numero_record)."'>".$pagina."</a>";
}
}
}
mysql_free_result($query);
mysql_free_result($query2);
Chiudiamo la connessione a MySQL
mysql_close();
La pagina default.php, è quasi giunta a termine, bisogna soltanto aggiungere il form che contiene i campi per l’ inserimento dei messaggi nella tabella del Database:
<form method="post" action="insert.php">
* Autore: <input type="text" name="autore" size="15">
Sito (http://): <input type="text" name="sito" size="25">
* E-Mail: <input type="text" name="email" size="20">
* Testo: <textarea name="testo" cols="40" rows="6"></textarea>
Voto: <select name="voto">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<input type="submit" value="Inserisci Messaggio">
</form>
( * ) Campi obbligatori
Pagina: insert.php
Siccome dobbiamo utilizzare il Database del Guestbook, per prima cosa includiamo il file di connessione, poi recuperiamo i dati inviati dal form e impostiamo la data e l’ ora corrente:
include("conn.php");
$autore = $HTTP_POST_VARS["autore"];
$sito = $HTTP_POST_VARS["sito"];
$email = $HTTP_POST_VARS["email"];
$testo = $HTTP_POST_VARS["testo"];
$voto = $HTTP_POST_VARS["voto"];
$data = date("d/m/Y")." - ".date("H:i:s");
Modifichiamo la variabile $sito, togliendo "http://" casomai l’ utente l’ avesse inserito nel campo del form:
$sito = str_replace("http://", "", $sito);
Ora dobbiamo eseguire una serie di controlli; prima verifichiamo se i campi obbligatori sono stati compilati. Quindi controlliamo che l’ indirizzo E-mail sia corretto ed infine inseriamo il messaggio nella tabella del Database:
if((strlen($autore) == 0) or (strlen($email) == 0) or (strlen($testo) == 0)){
header('Location: default.php?messaggio=Attenzione,+devi+compilare+tutti+i+campi+obbligatori+!');
}else{
if(eregi("^[a-z0-9][_\.a-z0-9-]+@([a-z0-9][0-9a-z-]+\.)+([a-z]{2,4})",$email)){
$strsql = "insert into messaggi(id, testo, data_ora, autore, email, sito, voto) values('', '$testo', '$data', '$autore', '$email', '$sito', '$voto')";
$query = mysql_query($strsql);
header('Location: default.php?messaggio=Messaggio+inserito+correttamente+!');
}else{
header('Location: default.php?messaggio=Specificare+un+indirizzo+E-mail+valido+!');
}
}
Chiudiamo la connessione al Database:
mysql_close();
Se tutti questi controlli trovano qualche errore, o se il messaggio viene inserito, il codice ci riporta ala pagina default.php e manda in output un responso. Quindi bisogna tornare nelle pagina default.php e all' inizio della pagina, dopo l' inclusione del file di connessione, inserire il responso:
if(!isset($messaggio)){
$messaggio = "";
}else{
echo "<font color='green'><b>".$messaggio."</b></font>";
}
Lato Amministratore
La parte Lato Amministratore, è riservata appunto all' Amministratore del sito, quindi non deve eccellere in grafica, ma deve essere semplice ed efficace, in quanto è utilizzate per eliminare i messaggi. Questa parte, comprende la pagina admin.php, nella quale è presente l' elenco di tutti i messaggi e la pagina delete.php, che serve per l' eliminazione dei messaggi.
Pagina: admin.php
Per prima cosa, includiamo sempre il file di connesione al Database:
include("conn.php");
Quindi recuperiamo tutti i messagi dal Database attraverso il solito ciclo While e chiudiamo la connessione al Database:
$strsql = "select * from messaggi order by id desc";
$query = mysql_query($strsql);
while($row = mysql_fetch_array($query)){
$id = $row["id"];
$autore = $row["autore"];
$testo = $row["testo"];
$email = $row["email"];
$sito = $row["sito"];
$data = $row["data_ora"];
$voto = $row["voto"];
echo "<b>Autore: </b>".$autore." (".$email.")<br>";
echo "<b>Sito: </b>http://".$sito."<br>";
echo "<b>Testo: </b>".$testo."<br>";
echo "<b>Data e Ora: </b>".$data."<br>";
echo "<b>Voto: </b>".$voto."<br>";
echo "<a href='delete.php?id=".$id."'>Elimina</a><hr>"; 
}
mysql_free_result($query);
mysql_close();
Sotto la visualizzazione di ogni messaggio, aggiungiamo un collegamento alla pagina delete.php, che invierà l' id del messaggio.
Pagina: delete.php
Come al solito, includiamo il file di connessione alla tabella del nostro Database:
include("conn.php");
Ora recuperiamo l' id del messaggio, che precedentemente è stato inviatao dalla pagina admin.php, ed eliminiamo il messaggio dalla tabella del Database:
$id = $HTTP_GET_VARS["id"];
$strsql = "delete from messaggi where id = $id";
$query = mysql_query($strsql);
header('Location: admin.php');
Dopo aver eliminato il messaggio, il codice ci porterà di nuovo alla pagina admin.php. Infine chiudiamo la connessione al Database:
mysql_close();

Recuperare piu' Records da una Form
Introduzione
Posso immaginare che il titolo e la descrizione di questo Tutorial vi abbiano fatto un po pensare... Comunque, tornando a noi, vi siete mai chiesti come richiamare piu' Records provenienti da una Form, costituiti a loro volta da piu' campi ?
Penso che esisteranno tanti metodi per risolvere questo problema, personalmente ho pensato di risolverlo creando uno script "fatto in casa" e quale posto migliore che questa Community per esporre la mia soluzione ?
Ma adesso non ci perdiamo in troppe parole e iniziamo a scrivere un po di codice.
Realizziamo la Form
La realizzazione della form non presenta molte difficolta', per questo esempio, ho pensato fosse il caso di creare una serie di campi (che costituiranno i nostri records) tramite un semplice ciclo FOR, ecco quindi il codice completo per la Form:
File: form.php
<form method="post" action="write.php">
<?php
//Creazione campi
//Possiamo anche aumentare il numero dei campi
for($i = 1; $i <= 3; $i++){
?>
<input type="hidden" name="id_<?php echo $i;?>" value="<?php echo $i;?>">
<?php echo $i;?>) Nome: <input type="text" name="nome_<?php echo $i;?>">
Tel: <input type="text" name="tel_<?php echo $i;?>">
<hr>
<?php
}
?>
<input type="submit" value="Invia Dati">
</form>
Questo e' tutto il codice per la nostra Form, ovviamente il ciclo FOR potrebbe essere facilmente sostituito con un ciclo While per scorrere i Records provenienti da una tabella di un Database (un carrello della spesa ad esempio).
In grassetto comunque, ho evidenziato una parte importante del codice, ovvero, ogni Record deve avere un campo Hidden (nascosto) contenente il numero identificato per ogni record (ID), necessario per effettuare le modifiche sul record nella pagina successiva.
Recuperare i Dati
Una volta realizzata la form vediamo dunque, inviati i dati, come recuperarli. Lo script di cui ora verra' visualizzato il codice srogente completo, non fa altro che recuperare tutte le variabili postate da una form, e inserirle in un array, vediamo il codice commentato in ogni signola riga ;-)
File: write.php
<?php
//Richiamo tutte le variabili
$vars = get_defined_vars();
//Array contenente tutte le variabili
$my_array = array();
//Popolo l' array
foreach($vars['_POST'] as $key => $val){
array_push($my_array, $val);
}
//Configuro la visualizzazione
$no_field = 3; // Numero dei campi inviati x ogni record
$size = (count($my_array) / $no_field); //Numero dei Records
$start = 0; //Record iniziale
for($i = 1; $i <= $size; $i++){
//Prelevo i dati del record
$id = $my_array[$start];
$nome = $my_array[$start + 1];
$tel = $my_array[$start + 2];
//Visualizzo i Dati
echo "<li>ID:" . $id;
echo "<li>NOME:" . $nome;
echo "<li>TEL:" . $tel;
echo "<hr>";
//Passo al prossimo record
$start = $start + $no_field;
}
?>
Questo e' tutto, la variabile piu' importante di cui dobbiamo tenere conto e' $no_field, ovvero, il numero di campi di cui e' costituito ogni record. In questo esempio, il nostro record e' composto da tre campi (ID, Nome, Telefono), quindi $no_field sara' 3

Installazione LAMP su Win32
Questa è una piccola ma grande guida all'installazione del PHP, che vi permetterà di installare i seguenti programmi:
-> PHP 5.0
-> Apache 1.*
-> Apache 2.*
-> MySQL 4.*
--> PHP 5.0
Questo è il parser dei nostri script php, che ci permetterà di tradurre il nostro codice php in linguaggio html. La 5 è l'ultima release stabile, e la potete trovare
nel sito ufficiale, in particolare qui trovate quella per i sistemi win32: 
Tutti i Mirror per PHP 5.0.0 per Win32
In questo link, invece, trovare tutte le release di PHP, divise per versione:
Tutte le releases di PHP
In seguito parleremo della sua installazione in Apache 1 ed in Apache 2.
--> Apache 1.*
Quest'altro è in nostro WebServer, cioè quell'applicazione che permette agli altri computer di connettersi al nostro, e di visualizzare dei determinati dati.
Qui trovate il link necessario per scaricare la versione 1.3 per un SO win32:
Pacchetto installazione Apache 1.3.33 per Win32
Qui, invece, trovate la lista di tutti i pacchetti Unix e per Windows:
Tutte le releases di Apache
--> Apache 2.*
Questa evoluzione di Apache 1.* gira bene su linux, ma non molto è ottimizzata per windows, anche se molti server oggi lo montano. Per il download, utilizzate il link
sopra citato.
--> MySQL 4.*
Questo è un RDBMS, vale a dire un Database Relazionale, capace di gestire una vasta quantità di dati attraverso delle query in linguaggio SQL. Ecco l'elenco
di tutti i mirrors per la versione 4:
Pacchetto installazione MySQL 4.1.7 per Win32
--------------------------------------------------------------------------------

Per prima cosa, scompattate il vostro archivio contenente il PHP 5, in una cartella a vostro piacimento, qui io utilizzerò [b]C:/Programmi/PHP5/[/b] come esempio.
Una volta scompattato il file, dobbiamo installare il nostro apache: Dovete far eseguire il file d'installazione di Apache 1.3 o 2, installarlo, ed alla fine configurarlo. L'unica differenza fondamentale che trovate in Apache 1 e 2 nella sua installazione, è proprio la configurazione.
-> INSTALLAZIONE APACHE 1.*
aprite il file httpd.conf con il notepad, nella cartella conf di apache, e dovete cercare la seguente riga:
LoadModule foo_module modules/mod_foo.so
Una volta trovato, scorrete la lunga lista di moduli, ed aggiungete alla fine questo, ovviamente senza il #, che indica una stringa commentata:
LoadModule php5_module C:/Programmi/PHP5/php5apache.dll
Ciò indica ad Apache di caricare il modulo di php. Poco sotto, troverete una lunga lista di AddModule, dovrete aggiungere alla sua fine quanto segue:
AddModule mod_php5.c
Ora cercate la seguente stringa:
AddType application/x-tar .tgz
ed aggiungete alla fine di tutti gli AddType, questa direttiva:
AddType application/x-httpd-php .php
OK, php è installato. Ora cercate questo:
<IfModule mod_dir.c>
E sostituite la DirectoryIndex sottostante con una tipo questa:
DirectoryIndex index.php index.htm index.html
Queste sono le pagine che vengono caricate di default se si immette un url generico.
Infine, andate a cercare la seguente direttiva:
DocumentRoot
e sosituite tutta la riga con:
DocumentRoot = "C:\Programmi\Apache Group\Apache\htdocs"
Naturalmente potete sostituire la directory sopra citata con quella che preferite.
-> INSTALLAZIONE APACHE 2.*
Con apache 2, l'installazione risulta molto simile, ma la spiego lo stesso.
Innanzitutto cercate la seguente riga nel file httpd.conf:
LoadModule foo_module modules/mod_foo.so
e scorrete tutta la lista di LoadModule fino all'ultimo, e aggiungete quanto segue:
LoadModule php5_module C:/Programmi/PHP5/php5apache2.dll
Ora andate a cercare questo:
AddType image/x-icon .ico
Ciò fa parte di una lunga lista di AddType, aggiungete alla fine questo:
AddType application/x-httpd-php .php
Ok, se avete finito, poco più su trovate questa riga:
DirectoryIndex
La dovete sostituire insieme a ciò che segue, con questo:
DirectoryIndex index.php index.htm index.html
Queste sono le pagine che vengono caricate di default se si immette un url generico.
Infine, andate a cercare la seguente direttiva:
DocumentRoot
e sosituite tutta la riga con:
DocumentRoot = "C:\Programmi\Apache Group\Apache2\htdocs"
Naturalmente potete sostituire la directory sopra citata con quella che preferite.
----------------------------------------------------------------------------
--> PHP
OK, ora andate e copiare il file C:/Programmi/PHP5/php5ts.dll in %windir%/system32/
e rinominate il file php.ini-raccommended (sempre nell cartella di PHP) in php.ini
ed apritelo col notepad. Dovete cercare questo:
include_path
e sostituire la riga relativa a windows con quanto segue:
include_path = "c:\programmi\php5\includes"
Ok, per ultima cosa, dovete settare la cartella per le estensioni di php e
selezionare quali caricare: cercate questa direttiva:
extension_dir
sostituire tutta la riga con:
extension_dir = "C:/Programmi/PHP5/ext"
e sostituire tutta la lunga fila di extension poco più sotto, e sostituirla con
questa:
;extension=php_bz2.dll
;extension=php_cpdf.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_dbx.dll
;extension=php_exif.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_iconv.dll
;extension=php_ifx.dll
;extension=php_iisfunc.dll
;extension=php_imap.dll
;extension=php_interbase.dll
extension=php_java.dll
;extension=php_ldap.dll
;extension=php_mbstring.dll
;extension=php_mcrypt.dll
;extension=php_mhash.dll
;extension=php_mime_magic.dll
;extension=php_ming.dll
;extension=php_mssql.dll
;extension=php_msql.dll
extension=php_mysql.dll
;extension=php_oci8.dll
extension=php_openssl.dll
extension=php_oracle.dll
;extension=php_pdf.dll
;extension=php_pgsql.dll
extension=php_shmop.dll
;extension=php_snmp.dll
extension=php_sockets.dll
;extension=php_sybase_ct.dll
;extension=php_tidy.dll
;extension=php_w32api.dll
;extension=php_xmlrpc.dll
;extension=php_xsl.dll
;extension=php_yaz.dll
extension=php_zip.dll
Per finire in bellezza, salvate il file e copiatelo in %systemroot%, ovvero la cartella di windows.
-> INSTALLAZIONE MySQL 4.*
Aprite il file d'installazione di MySQL ed installatelo in una directory a vostro
piacimento; Io vi consiglio C:/Programmi/MySQL, anche per un fatto di comodità.
Una volta installato, andiamo nella directory di MySQL, apriamo la sottodirectory
chiama [b]bin[/b] e fate un collegamento al desktop di [b]winmysqladmin.exe[/b],
che sarebbe il programma che gestisce mysql. Ora andate ad aprire il file php.ini
e cercate la seguente riga:
[MySQL]
e modificate le opzioni sottostanti in modo da avere un risultato più o meno come questo:
; Permette le connessioni persistenti ai database
mysql.allow_persistent = On
; Numero massimo di connessioni persistenti ( -1 = illimitate )
mysql.max_persistent = -1
mysql.max_links = -1
; Porte di default di MySQL ( Da non modificare )
mysql.default_port = 3306
; Host di default di MySQL ( Localhost se si lavora in locale )
mysql.default_host = localhost
; Utente MySQL di default
mysql.default_user =
; Password MySQL di default
mysql.default_password =
Infine, copiate il file libmysql.dll, presente in C:/Programmi/PHP5/, nella
directory %systemroot%/system32
OK. Anche mysql è stato installato correttamente. Non ci resta di fare una prova per vedere se il tutto è stato installato correttamente. Aprite Il vostro browser
di default, e digitate:
http://localhost/
Dovrebbe apparirvi una pagina con scritto qualcosa su Apache, e dei ringraziamenti per averlo usato (oppure una pagina Apache). Per testare il PHP, create un file
chiamato [b]index.php[/b] nella cartella per i vostri documenti php, e metteteci questo contenuto:
<? phpinfo(); ?>
provate a riandare in http://localhost/, e vi dovrebbe spuntare una lunghissima pagina con le impostazioni di php. Se vi è spuntato, bene, se no, male... Provate
a rileggere la guida e non dimenticate neanche un passaggio... 
Bene. Se vi è spuntato quello sopra descritto penso di aver scritto questa guida all'installazione di Apache-PHP5-MySQL nel modo migliore. Se i problemi persistono,
consultare il medic... ehm... il forum, che è sempre a disposizione per qualsiasi esigenza. Spero di non essere stato troppo vago, dispersivo o sintetico, e che siete riusciti ad installare il tutto.

Una completa gestione delle date
Introduzione
Tra gli argomenti piu' importanti che riguardano la programmazione web e lo sviluppo di nuove applicazioni, rientra sicuramente quello relativo alla gestione delle Date. Le funzioni messe a dispozione da PHP sono numerose e ci permettono di effettuare qualsiasi tipo di operazione sulle Date.
Per chi si avventura per le prime volte in questo argomento, si preoccupera' esclusivamente di apprendere nuovi nozioni, ma invece, per chi come me, migra da un linguaggio di programmazione web come ASP e ASP.Net a PHP, scopre nuovi metodi e concetti che con le tecnologie di Microsoft non hanno nulla a che vedere.
Questo Tutorial quindi, rappresenta una completa guida sulla gestione delle date e contiene anche riferimenti alla guida ufficiale [url=http://www.php.net]php.net[/url].
La funzione Date()... Iniziamo
La funzione di partenza per la gestione delle date in PHP e' Date(), descriviamo quindi il suo funzionamento:
string date ( string formato [, int timestamp])
Restituisce una stringa formattata in base ai parametri passati e relativa anche al Timestamp, eventualmente passato.
I caratteri che vengono utilizzati nella stringa formato sono i seguenti: (direttamente dal php.net)
# a - "am" o "pm"
# A - "AM" o "PM"
# B - Swatch Internet time
# d - giorno del mese, 2 cifre senza tralasciare gli zero; i.e. "01" a "31"
# D - giorno della settimana, testuale, 3 lettere; i.e. "Fri"
# F - mese, testuale, long; i.e. "January"
# g - ora, formato a 12-ore senza eventuali zero; i.e. "1" a "12"
# G - ora, formato a 24-ore senza eventuali zero; i.e. "0" a "23"
# h - ora, formato a 12-ore; i.e. "01" a "12"
# H - ora, formato a 24-ore; i.e. "00" a "23"
# i - minuti; i.e. "00" a "59"
# I (i grande) - "1" se c'è l'ora legale, "0" altrimenti.
# j - giorno del mese senza eventuali zero; i.e. "1" a "31"
# l ('L' piccola) - giorno della settimana, testuale, long; i.e. "Friday"
# L - valore booleano per stabilire se è un anno bisestile; i.e. "0" o "1"
# m - mese; i.e. "01" a "12"
# M - mese, testuale, 3 lettere; i.e. "Jan"
# n - mese senza eventuali zero; i.e. "1" a "12"
# O - Differenza in ore dal fuso orario Greenwich; i.e. "+0200"
# r - Data formattata RFC 822; i.e. "Thu, 21 Dec 2000 16:01:07 +0200" (aggiunto nel PHP 4.0.4)
# s - secondi; i.e. "00" a "59"
# S - Suffisso ordinale Inglese per i giorni del mese, 2 caratteri; i.e. "th", "nd"
# t - numero di giorni del mese dato; i.e. "28" a "31"
# T - Fuso orario di questo computer; i.e. "MDT"
# U - secondi dall'epoca since the epoch
# w - giorno della settimana, numerico, i.e. "0" (Domenica) a "6" (Sabato)
# W - ISO-8601 Numero della settimana dell'anno, le settimane iniziano il lunedì (aggiunto in PHP 4.1.0) (Sabato)
# Y - anno, 4 cifre; i.e. "1999"
# y - anno, 2 cifre; i.e. "99"
# z - giorno dell'anno; i.e. "0" a "365"
# Z - Fuso orario in secondi (i.e. "-43200" a "43200"). Il fuso orario ad ovest dell'UTC è sempre negativo, e per quelli ad est è sempre positivo.
Mentre tutti gli altri caratteri che non sono ammessi nella stringa formato, verranno scritti come sono.
Utilizzare la funzione Date
A questo punto, una volta che abbiamo studiato il funzionamento di Date() visualizziamo ora alcuni esempi pratici per rendere meglio l' idea:
Gli esempi fanno riferimento a php.net:
$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$today = date("m.d.y"); // 03.10.01
$today = date("j, n, Y"); // 10, 3, 2001
$today = date("Ymd"); // 20010310
$today = date('h-i-s, j-m-y, it is w Day z '); // 05-16-17, 10-03-01, 1631 1618 6 Fripm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day.
$today = date("D M j G:i:s T Y"); // Sat Mar 10 15:16:08 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:17 m is month
$today = date("H:i:s"); // 17:16:17 

Upload di immagini con PHP
Introduzione
Per chi ha intenzione di realizzare una galleria di immagini o qualsiasi altra cosa che abbia a che fare con le immagini, avra' senz' altro bisogno di uno script che sia in grado di caricare le immagini presenti sul nostro Computer, direttamente sul server.
In questa guida, vedremo proprio come realizzare questo script.
Upload di immagini
Dopo questa breve introduzione, siamo pronti per mettere giu' un po di codice. Prima di iniziare, vediamo di quante pagina sara' formato il nostro script:
# Form.php
# Upload.php
Queste saranno le pagine che costituiranno il nostro script, la pagina form.php, conterra' la form da compilare e la pagina upload.php, il codice completo, necessario all' upload dell' immagine. Senza perdere altro tempo, vediamo il codice relativo alla pagina form.php:
File: form.PHP
<form enctype="multipart/form-data" method="post" action="upload.php">
Immagine: <input type="file" name="txt_file" size="40">
<input type="submit" value="Upload Immagine">
</form>
Come possiamo ben vedere, in questa form e' stato definito un enctype che individua dei dati da inviare, inoltre anche l' input, e' di tipo File, appunto per permetterci di sfogliare le directory e i files presenti sul nostro computer.
Adesso, non mi resta che visualizzare il codice sorgente completo relativo alla pagina upload.php:
File: upload.php (1° Parte: Alcune funzioni utili)
<?php
//Funzioni utili...
//Funzione Replace " " in "_" (evitiamo possibili errori)
function fSpace($string)
{
return str_replace(" ", "_", $string);
}
//Funzione per ricavare l' estensione di un File
function fExt($string)
{
//Controllo il file
$trova_punto = explode(".", $string);
$estensione = $trova_punto[count($trova_punto) - 1];
$estensione = strtolower($estensione);
// Se non ci sono estensioni
if (isset($trova_punto[1]) == FALSE)
{
return '';
}
//Ritorno il valore dell' estensione
return $estensione;
}
//Fine funzioni
...
Il codice sopra riportato, contiene due funzioni, rispettivamente, la prima e' necessaria a sostituire lo spazio con un Underscore ("_"), questo serve a evitare che il server restiuisca eventuali errori durante l' upload di files nel caso in cui il nome presentasse degli spazi. La seconda, invece, e' utile a ricavare l' estensione del file.
File: upload.php (2° Parte: Upload del file)
...
//Effettuo l' upload dell' immagine...
$uploaddir = 'uploads/';
$uploadfile = fspace($_FILES['txt_file']['name']);
$upload = $uploaddir . $uploadfile;
//Controllo che sia stato specificato un file
if(!strlen($uploadfile) == 0)
{
//Controllo l' estensione del file
if((fExt($uploadfile) == 'gif') or (fExt($uploadfile) == 'jpeg'))
{
//Creo la cartella
mkdir($uploaddir);
//Eseguo l' upload
if(move_uploaded_file($_FILES['txt_file']['tmp_name'], $upload))
{
//Upload eseguito con successo
echo "Upload eseguito correttamente";
echo "<p><img src='". $upload ."'>";
echo "<p><a href='form.php'>Carica una nuova immagine</a>";
}else{
//Upload fallito
echo "Upload fallito !";
}
}else{
//Messaggio di errore
echo "File non valido";
echo "<br><a href='form.php'>Torna dietro</a>";
}
}else{
//Messaggio di errore
echo "Specificare un file !";
echo "<br><a href='form.php'>Torna dietro</a>";
}
A questo punto, il codice relativo alla pagina upload.php e' concluso e qui termina anche questa guida.
Attenzione: Il PHP di default consente l' upload di un file non superiore ai 2 Mb (2048 Kb), il tutto e' comunque modificabile dal file di configurazione PHP.INI

Validare i campi di una Form
Introduzione
Quante volte ci sarà capitato di controllare che i campi di un form siano stati compilati ? Mettiamo il caso di avere una tabella di un database costituita dai campi NOME - COGNOME - SITO - TESTO. Ora vogliamo controllare che i dati inseriti nella tabella tramite un form siano stati compilati correttamente. Il seguente Tutorial nasce da un problema postato sul Forum di Discussione, raggiungibile dal seguente link. Voglio sottolineare che il codice seguente è molto più ottimizzato e semplice di quello postato sul Forum, in quanto lavora direttamente su un’ unica pagina.
Controlliamo i campi
Pagina: default.php
Innanzitutto, creiamo il form nella pagina default.php con tutti i campi a noi utili (Nome, Cognome, Sito e Testo) e a fianco di ogni input, inseriremo una variabile (differente per ogni input) che in caso di errore restituirà un messaggio di testo:
<form method="post" action="default.php?azione=invia">
* Nome: <input type="text" name="nome" size="15"><b><?=$erroruser?></b><br>
* Cognome: <input type="text" name="cognome" size="15"><b><?=$errorpass?></b><br>
Sito (http://): <input type="text" name="sito" size="25"><br>
* Testo: <textarea name="testo" cols="30" rows="6"></textarea><b><?=$errortesto?></b><br>
<input type="submit" value="Inserisci Messaggio"><br>
( * ) Campi obbligatori
</form>
Come avete notato ho impostato come campi obbligatori solo Nome, Cognome e Testo. Infatti il campo relativo al Sito non possiede la variabile per il messaggio di errore.
Per quanto riguarda il codice, questo ruota tutto intorno alla variabile $azione in quanto attraverso questa la pagina default.php deciderà se caricare soltanto il form o se inviare i messaggi di errore:
//Se la variabile $azione non è settata la impostiamo come nulla
if(!isset($azione)){
$azione = "";
}
//Se la variabile $azione è nulla, vuol dire che la pagina è stata appena caricata quindi le variabili che contengono i messaggi di errore devono essere impostate come nulle
if($azione == ""){
$errornome = "";
$errorcognome = "";
$errortesto = "";
}
//Quando invece inviamo i dati del form la variabile $azione prende il valore invia
if($azione == "invia"){
//Recuperiamo i dati del form
$nome = $HTTP_POST_VARS["nome"];
$cognome = $HTTP_POST_VARS["cognome"];
$testo = $HTTP_POST_VARS["testo"];
//Eseguiamo quindi il controllo dei campi obbligatori
if($nome == ""){
$erroruser = "Devi compilare il campo Nome";
}
if($cognome == ""){
$errorpass = "Devi compilare il campo Cognome";
}
if($testo == ""){
$errortesto = "Devi compilare il campo Testo";
}
//Se tutti i campi obbligatori sono stati compilati, il codice ci porterà alla pagina insert.php, dove verrà effettuato l’ inserimento dei dati
if((strlen($nome)!= 0) and (strlen($cognome)!= 0) and (strlen($testo)!= 0)){
header('Location: insert.php');
}
}

Gestire le directories con php
Introduzione
PHP mette a disposizione un limitato, ma pressochè completo, numero di funzioni per "maneggiare" ed interagire con le directories in modo semplice ed efficace.
Scopo di questo articolo è analizzare una per una queste funzioni (più alcune altre che si trovano nella sezione "funzioni sul filesystem") e costruire due sistemi alternativi (e parimenti efficaci) per "scorrere" ed eventualmente manipolare il contenuto di una directory.
Anticipo subito che i link di riferimento, sul manuale ufficiale, sono questo (la sezione del manuale dedicata alle directories), e questo per le altre (la sezione dedicata alla gestione del filesystem).
Le funzioni dedicate
Iniziamo subito ad analizzare le funzioni dedicate specificamente alle directories:
opendir() come suggerisce il nome, serve per "aprire" una directory, analogamente a quanto fanno le funzioni che lavorano con i files.
Restituisce un handle (una variabile del tipo "risorsa", sui tipi delle variabili si può leggere questo articolo), da utilizzare con le altre apposite funzioni che vedremo immediatamente, o false in caso di errore. Accetta un solo parametro, la stringa con il percorso della directory da aprire.
closedir() chiude, come è facile intuire, la directory precedentemente aperta con opendir() (funzione di cui è quindi complementare) ed accetta un solo parametro, ossia l'handle restituito da opendir(). Da notare che la funzione non restituisce alcun valore (void).
readdir() questa funzione è utilizzata per leggere il contenuto di una directory precedentemente aperta da opendir().
Come avviene per i files e per gli array, anche questa funzione utilizza un puntatore che, inizialmente, punta al primo elemento contenuto nella directory aperta, (secondo l'ordine cui tali elementi sono memorizzati nel filesystem e sempre che esistano, ovviamente) restituendolo sotto forma di stringa , e si sposta quindi all'elemento successivo (per questa ragione si usa, solitamente all'interno di un ciclo).
Prende come parametro l'handle restituito da opendir() e, nota bene, restituisce anche gli elementi contrassegnati con . (la directory corrente) e .. (la directory immediatamente superiore) contenuti in ogni directory, che vanno pertanto esplicitamente esclusi nel caso in cui si voglia scorrere ed analizzarne il contenuto (come vedremo fra breve).
rewinddir() questa funzione è utilizzata per "riavvolgere" il puntatore interno di PHP, ossia per riportarlo al primo elemento. Prende come parametro l'handle resituito da opendir().
Da notare che la funzione non restituisce alcun valore (void).
chdir() questa funzione serve a cambiare la directory corrente usata da PHP e resituisce TRUE o FALSE a seconda dell'esito dell'operazione.
getcwd() restituisce come stringa la directory di lavoro (Current Working Directory) attualmente in uso.
dir() questa non è una vera funzione, ma un "meccanismo pseudo orientato agli oggetti" (per usare la terminologia del manuale ufficiale di PHP), per lavorare con le directories e alternativo a quello classico, ma a questo pressochè identico, per cui usare l'uno o l'altro diventa quasi una pure questione di stile.
Alla chiamata di dir(), viene aperta la directory specificata come argomento e viene istanziato un oggetto; a questo punto avremo a disposizione un puntatore (handle) e tre metodi, read, rewind e close, in tutto e per tutto identici alle analoghe funzioni precedentemente illustrate.Le funzioni sul filesystem
Analizziamo adesso altre importanti funzioni per le directories che il manuale ufficiale annovera fra le "funzioni sul Filesystem":
mkdir() funzione utilizzata per (tentare di) creare una directory, accetta due parametri, la directory da creare (con il relativo percorso, ovviamente) e il mode, ossia i permessi della nuova directory (generalmente espressi in ottale), che sono peraltro influenzati dall'umask corrente e che pertanto possono essere settai al volo con la funzione umask(), sulla quale peraltro non è il caso di soffermarsi oltre, perchè non funzionante sui sistemi windows.
La funzione restituisce TRUE o FALSE a seconda che la creazione della directory sia andata o meno a buon fine.
rmdir() funzione utilizzata per (tentare di) rimuovere una directory, a condizione che sia vuota e che i suoi permessi lo consentano (sui permessi e la loro gestione, si veda questo articolo).
La funzione restituisce TRUE o FALSE a seconda che la rimozione della directory sia andata o meno a buon fine.
is_dir() restituisce TRUE o FALSE a seconda che il filename passatole come parametro, sia o meno una directory.
Come avverte il manuale, la funzione lavora solo con i file accessibili tramite il filesystem del server e non con i file remoti.
dirname() dato un determinato percorso (passato alla funzione come unico parametro), questa funzione estrae e restituisce, da questo, il nome della directory, ad esempio dirname("/home/web/website/index.php") restituirà "/home/web/website".Lavorare con le directories
Dopo aver sommariamente analizzato le funzioni che PHP ci mette a disposizione per la gestione delle directories, cercheremo adesso di mettere a punto due sistemi per poter "scorrere" il contenuto di una directory al fine di lavorare in qualche modo con il suo contenuto.
Il primo metodo, che potremmo definire classico, farà uso delle funzioni opendir(), reddir() e closedir(), nel secondo invece useremo la classe dir():
Primo metodo
<?php
// percorso della directory da leggere
$directory = "test";
// apriamo la directory
$open_handle = opendir($directory);
// impostiamo un ciclo while() per scorrere tutto il contenuto
while($read = readdir($open_handle)) {
// escludiamo . e ..
if($read != "." && $read != "..") {
// in questo esempio stampiamo a video i nomi di file e directory
echo $read . "<br>\n";
}
}
// chiudiamo la directory
closedir($open_handle);
?>
Secondo metodo
<?php
// percorso della directory da leggere
$directory = "test";
// instanziamo l'oggetto e apriamo la directory
$d = dir($directory);
// impostiamo un ciclo while() per scorrere tutto il contenuto
while ($read = $d->read()) {
// escludiamo . e ..
if($read != "." && $read != "..") {
// in questo esempio stampiamo a video i nomi di file e directory
echo $read . "<br>\n";
}
}
// chiudiamo la directory
$d->close();
?>
I due sistemi, come detto, sono identici nella sostanza e la scelta fra l'uno o l'altro è una questione soggettiva; io, ad esempio, preferisco il secondo, quello che usa gli oggetti, ma solo perchè ho sempre usato quello e sono un abitudinario.
Riguardo al codice, i commenti dovrebbero essere sufficienti, aggiungo solo che all'interno del ciclo while(), si possono fare, come è ovvio, operazioni ben più complesse della semplice visualizzazione, ad esempio, per dirne una, avvalersi delle funzioni is_file() e is_dir() al fine di distinguere fra files e directories (ed eventualmente contarli).

Creare un Login Script con PHP e MySQL
Prefazione
Se stai navigando sul web, hai probabilmente più siti che visiti tutti i giorni. Spesso, molti di questi si hanno una caratteristica comune - un luogo per gli utenti dove fare il "login" e personalizzare il sito autonomamente. Probabilmente stai cercando una pagina per fare il login.
Hai bisogno di un server web (preferibilmente Apache). Dovrà essere installato, ovviamente, anche PHP e il Database MySQL e i permessi che dovrai avere, saranno il "create" e il "drop" database.
Creazione del database
La prima cosa da fare è partire con la creazione del database, dove memorizzare gli utenti che crei.
Creazione del DB
mysql> CREATE DATABASE dictators;
mysql> use dictators;
mysql> CREATE TABLE users (
    -> user_name varchar(15) NOT NULL,
    -> password varchar(32) NOT NULL,
    -> PRIMARY KEY (user_name));
La prima cosa da fare è creare una database "dictators" (o quello che si vuole) che conterrà le informazioni sugli utenti. Secondariamente, devi dire a MySQL che si vuole utilizzare questo database. In seguito, puoi creare due campi, uno per  lo "user_name" e uno per le "password". Il campo "username" può essere riempito fino a 15 caratteri. E il campo password può contenere fino a 32 caratteri. Per il momento il DB conterrà questi dati, ma possiamo incrementare il numero dei campi, a nostro piacimento.
Aggiunta dei Dati
Cominciamo ad aggiungere un utente e una password per testare:
mysql> INSERT INTO users VALUES('pol_pot', 'evilevil');
Con questo, abbiamo aggiunto lo user 'pol_pot', con la password 'evilevil'. Ora abbiamo un utente nel DB con cui possiamo accedere.
log in, o non log in...
Per acquisire i dati per effettuare il login, abbiamo bisogno di un semplice form HTML per catturare lo username e la password.
Login.html
<html>
<head>
<title>login.html</title>
</head>
<body>
<form name="login" method="post" action="validate.php">
username:<input type="text" name="user_name"><br>
password:<input type="password" name="password"><br>
<input type="submit" value="submit">
</form>
</body>
</html>
Validate.php
<html>
<head>
<title>validate.php</title>
</head>
<body>
<?php
$user_name = $_POST['user_name'];
$password = $_POST['password'];
?>
</body>
</html>
Le variabili del form passate attraverso il metodo "post", finisco nel $_POST array ( Versioni precedenti al PHP 4.1, si utilizzeràil comando $HTTP_POST_VARS array).
Validare l'utente
Ora che abbiamo le variabili in PHP, siamo pronti per le prime autenticazioni; faremo un controllo alla variabili che avremo mandato al file validate.php con quelle che sono salvate nel database. Per fare questo, dovremo fare una connessione al DB di MySQL attraverso PHP, poi proveremo a recuperare le voci dal database con gli stessi user_name e password che abbiamo inserito. Se esiste un solo campo valido, l'utente sarà autenticato. Aggiungeremo codici al file validate.php per ottenere questo:
The Validation Script
<?php
session_start();
$db_user = 'mysql_username';
$db_pass = 'mysql_password';
$user_name = $_POST['user_name'];
$password = $_POST['password'];
//connect to the DB and select the "dictator" database
$connection = mysql_connect('localhost', $db_user, $db_pass) or die(mysql_error());
mysql_select_db('dictators', $connection) or die(mysql_error());
//set up the query
$query = "SELECT * FROM users
WHERE user_name='$user_name' AND password='$password'";
//run the query and get the number of affected rows
$result = mysql_query($query, $connection) or die('error making query');
$affected_rows = mysql_num_rows($result);
//if there's exactly one result, the user is validated. Otherwise, he's invalid
if($affected_rows == 1) {
print 'validated';
}
else {
print 'not valid';
}
?>
Utilizzo delle Sessioni
A questo punto, potremo fare un redirect dell'utente a una pagina di "ricevuta", ma abbiamo ancora un problema - se l'utente vuole andare ovunque nel sito, non vogliamo che effettui di nuovo il login. Per fissare questo, aggiungeremo alcune variabili di sessione per dirci che l'utente è già loggato.
Codice delle Sessioni
<?php
//...snip...
if($affected_rows == 1) {
print 'validated';
//add the user to our session variables
$_SESSION['username'] = $user_name;
}
else {
print 'not valid';
}
?>

 
Fatto...
E finalmente, controlliamo se gli utenti sono loccati in ogni pagina, includendo questo:
Include VerifyLogin.php
<?php
session_start();
if(empty($_SESSION['username'])) {
die('An error has ocurred. It may be that you have not logged in, or that your session has expired.
Please try <a href="login.php">logging in</a> again or contact the
<a href="mailto:admin@example.com">system administrator</a>');
}
?>
E ora, abbiamo sviluppato un semplice script di autenticazione. Questa è solo la base per ulteriori sperimenti.
P.S. Guida liberamente tradotta da me, da un testo in inglese, trovato su internet

Creare un'area riservata utilizzando il ciclo if-else di Php
Questa lezione vuole essere un pretesto per imparare a capire il funzionamento del costrutto if-else e non un modo per imparare a creare un'area riservata vera e propria in quanto sappiamo benissimo che un sistema di protezione così implementato è facilmente penetrabile.
Innanzitutto dobbiamo creare la pagina del form, alla quale assegniamo un titolo a piacere. Questo il suo codice xhtml:
<form action="login.php" method="get" name="login" id="login">
<p>
<input name="user" type="text" id="user" value="user" />
<br />
<input name="pass" type="text" id="pass" value="pass" />
<br />
<input type="submit" name="Submit" value="Invia" />
</p>
</form>
Il form appena creato punta alla pagina "login.php" il cui scopo è quello di ricevere i dati in ingressso, confrontarli con due variabili assegnate ($username e $password) ed eseguire una delle due operazioni dichiarate in base al risultato del confronto. Nel nostro caso i valori corretti da inserire sono username = michele e password = sassi. E' inutile dire che questi valori possono, anzi, devono essere modificati!
<?php
$username = "michele"; //dichiaro username
$password = "sassi"; //dichiaro password
$user = $_GET['user']; //username inserito viene preso in input dal form
$pass = $_GET['pass']; //password inserita viene presa in input dal form
//controllo che i due valori inseriti corrispondano a quelli stabiliti...
//in caso positivo rimando alla pagina riservata
if ($username == $user && $password == $pass)
{
header("Location: areariservata.php");
}
//in caso negativo stampo un messaggio di errore
else
{
print "Hai sbagliato l'inserimento dei dati!";
}
?>
Da notare l'utilizzo dell'operatore di confronto AND (&&) nella stringa in cui abbiamo dichiarato la condizione: if ($username == $user && $password == $pass); affinchè l'espressione sia valida per l'operatore AND è necessario che entrambe le condizioni siano soddisfatte. Apro una piccola parentesi (per spiegare la differenza) sull'utilizzo dell'operatore OR, indicato dal doppio simbolo di pipe ( || ); per quest'operatore è sufficiente che anche una sola delle due condizioni sia verificata per attribuire valore positivo all'espressione.
Un suggerimento... Nel nostro caso, per semplicità, abbiamo preferito stampare un messaggio d'errore per dichiarare all'utente che non ha inserito i dati corretti. Un uso più intelligente sarebbe quello di rimandare il visitatore sulla pagina con il form per la registrazione al sito! Divertitevi pure!

Autenticare gli utenti con PHP
Quello dell’autenticazione degli utenti è da sempre un problema molto sentito da parte di tutti i webmaster. Inibire l’accesso a determinate aree del proprio sito può essere necessario per molteplici motivi. I siti che offrono servizi a pagamento, ad esempio, devono disporre di zone accessibili soltanto agli utenti registrati. Chi crea delle aree di amministrazione per il proprio sito (cosa molto comune, in PHP) avverte chiaramente l’esigenza di proteggere le pagine con cui gestisce tutto il sito.
Per questi e per tanti altri motivi gli sviluppatori web si adoperano da sempre creando script o sfruttando le caratteristiche dei vari web server (Apache in primis) per proteggere files e cartelle dei propri siti. Anche il PHP interagisce al meglio con i web server (creando ad esempio dei file .htaccess di Apache) e, cosa di cui tratteremo in queste pagine, può inviare degli header HTTP al browser che richiedano nome e password dell’utente. Sfrutteremo questa caratteristica del PHP per richiedere i dati dell’utente, che cercheremo poi in un database. Se l’utente esiste permetteremo l’accesso, altrimenti ne consentiremo l’iscrizione inserendo i nuovi dati nel DB stesso. Per provare l’esempio di queste pagine ci sarà bisogno di un webserver Apache, del PHP e di MySQL. Troverete tutti i software necessari nella sezione “Il meglio” del CD-Rom di questo mese.
La tabella utenti
Visto che conserveremo in un database i dati degli utenti, la prima cosa da fare è di sicuro quella di creare il DB stesso e la tabella che conterrà tali dati. La struttura della tabella sarà molto semplice, formata da soli sei campi:
* Id – il campo che fungerà da contatore
* Nome – lo username scelto dall’utente in fase di registrazione
* Email – la sua e-mail, che servirà anche per inviare la password
* Password – il campo che conterrà la password
* Data – la data di registrazione
* Ip – l’indirizzo IP dell’utente al momento della registrazione
Dopo aver avviato il server MySQL (si può fare riferimento all’altro articolo di pratica presente in questo numero) apriamo una sessione di DOS e, dalla sottocartella bin di MySQL, lanciamo il client digitando mysql.
Il codice SQL da digitare per creare la nostra tabella (che chiameremo anagrafica) è il seguente:
CREATE database utenti;
USE utenti;
CREATE TABLE anagrafica (
id int(3) NOT NULL auto_increment,
nome char(8) NOT NULL default '',
email char(255) NOT NULL default '',
password char(8) NOT NULL default '',
data char(255) NOT NULL default '',
ip char(15) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY id (id),
KEY id_2 (id) ) TYPE=MyISAM;
è possibile copiare il codice esattamente come lo si vede; battere il tasto invio alla fine di ogni riga, non dimenticando di digitare il punto e virgola alla fine, per dire a mysql che l’istruzione stessa è terminata. I nomi da attribuire al DB e alla tabella possono essere cambiati a seconda delle prorie esigenze; l’importante è specificarli nel file di configurazione che creeremo tra poco.
Ora che abbiamo la tabella nella quale memorizzare i dati, possiamo iniziare a scrivere un po’ di codice PHP. Stabiliamo, per essere ordinati, che creeremo tre piccoli script PHP, in tre diversi file.
Il primo conterrà semplicemente i dati di connessione al database, mentre il secondo invierà gli header, ed il terzo permetterà di iscriversi agli utenti che ancora non compaiono nella tabella. La struttra dei tre file è molto semplice; vediamo dapprima di scrivere il codice del file di configurazione da includere negli altri due, e che chiameremo conf.inc.php:
<?
$data = date ("d/m/Y H:i");
con l’istruzione date ricaveremo facilmente la data nel formato GG/MM/AAAA (giorno, mese, anno). Scriviamo ora i fondamentali dati per connettersi correttamente al server MySQL:
$server = "localhost";
$utente = "root";
$db_pass = "";
$datab = "gol61";
$tabella = "anagrafica";
oltre all’indirizzo dell’host e i dati dell’utente, abbiamo conservato in due variabili quelli con il nome del database da utilizzare e quello della tabella. Volendo personalizzare questi dati sarà sufficiente intervenire sulle due variabili. Com’è ormai nostra abitudine, creeremo una piccola funzione al’interno di questo file, chiamata errore_server(). Questa funzione servirà semplicemente ad informarci minuziosamente su eventuali errori in fase di connessione e di interrogazione.
function errore_server()
{
echo "<b>Il database MySql sembra
non rispondere...</b><br>MySql
dice:<br><font color=red>";
echo mysql_error();
echo "</font><br>pregasi
<a href=\"mailto:iltuo@indirizzo.com\">
segnalare</a> il problema";
}
A questo punto non dobbiamo fare altro che connetterci al server e selezionare, direttamente in questa fase, il database da utilizzare.
$connessione = @mysql_connect ($server, $utente, $db_pass)
or die (errore_server ());
$db = mysql_select_db ($datab, $connessione)
or die (errore_server ());
?>
Salviamo il file conf.inc.php in una cartella del nostro webserver, e pensiamo a creare quello che sarà l’indice della cartella stessa.
Sei autorizzato? Controlliamo…
Il file index.php avrà l’importantissimo compito di inviare gli headers e, una volta che l’utente abbia inserito i dati richiesti, di verificare che questi siano presenti nel database.
Per fare una prova, e visualizzare tutti gli headers di una richiesta http, possiamo prendere in prestito un’esempio direttamente dal manuale PHP:
<?
$headers = getallheaders();
while (list ($header, $value) = each ($headers)) {
echo "$header: $value<br />\n";
}
echo $REMOTE_ADDR;
?>
Questo piccolo ciclo while approfitta dell’istruzione getallheaders() per restituire i valori dell’array definito dall’istruzione stessa. Gli headers sono in realtà di molteplici tipi, e quello che ci interessa si chiama $PHP_AUTH_USER. Ricordiamo che gli headers vanno inviati al browser prima di qualsiasi altra cosa, anche di un solo semplice carattere, onde evitare spiacevoli errori. Ecco quindi le prime righe del nostro file index.php
<?
if (!isset($PHP_AUTH_USER)) {
header('WWW-Authenticate: Basic realm="Area privata"');
header('HTTP/1.0 401 Unauthorized');
echo 'Richiesta autorizzazione.';
exit; }
Queste poche istruzioni controllano che il valore $PHP_AUTH_USER non sia presente nell’ambiente (if (!isset…) e lanciano la classica finestrella di autenticazione http, dove si dovranno inserire lo username e la password. In caso di errore ci si limiterà a stampare a video la frase Richiesta autorizzazione. Qualora l’utente abbia inserito i dati richiesti, ricorreremo ad un else che ne controllerà l’esistenza nel DB.
else {
include ("conf.inc.php");
ovviamente includeremo all’inizio di questo ciclo il file che contiene le configurazioni. Subito dopo penseremo a creare la query e ad eseguirla sul database:
$sql = "SELECT id FROM $tabella WHERE nome='$PHP_AUTH_USER'
and password='$PHP_AUTH_PW'";
$query = mysql_query($sql) or die (errore_server());
la query può fornire un solo risultato o riga (il nome utente deve infatti essere necessariamente univoco). Controlliamo quindi il suo valore, grazie all’istruzione mysql_num_rows
$num = mysql_numrows($query);
if ($num == 1) {
echo "<P>Ok, sei autorizzato<br>";
echo "Il tuo nome utente è <b>$PHP_AUTH_USER</b><br>";
echo "La tua passwd è <b>$PHP_AUTH_PW</b></p>";
}
Se il risultato è uguale ad 1 il nome utente esiste, e corrisponde alla password digitata. Nell’esempio abbiamo semplicemente mostrato a video i dati digitati, ma è proprio qui (all’interno del bracket) che potrete inserire il codice riservato agli utenti presenti nel DB. È anche plausibile pensare di includere un file invece di scrivere tutto il codice che serve; si dia un’occhiata al boxino di queste pagine per approfondire.
else if ($num == 0)
{
echo "Nome utente o password non validi<br>";
echo "<a href=\"iscriviti.php\">iscriviti</a>";
}
}
Se invece il risultato della query è uguale a zero visualizzeremo un link che rimanda al file per iscriversi nel database.
L’iscrizione degli utenti
Memorizzare gli utenti nel database è meno difficile di quello che sembra.
Il file iscriviti.php non dovrà far altro che visualizzare un form HTML e, dopo aver controllato che lo username inserito non sia già presente, inserire i dati nella tabella stessa. Dopo avere svolto questo compito, invieremo due distinte e-mail: una a chi si è appena iscritto, e un’altra al proprietario del sito stesso, per informarlo della presenza di un nuovo utente. Creeremo un ciclo if che controlli inizialmente la presenza della variabile $invia (il nome del pulsante del form HTML). Se questa non esiste, si visualizza subito il form:
<?
include ("conf.inc.php");
if (!$invia){
echo <<
Il tuo nome utente non è stato trovato nel database
<br>Registrati<br> </h1>
<form method=post>
<table width=85% border=1 align=center> <tr><td>Nome</td>
<td> <input type="text" name="nome"> </td></tr>
<tr> <td>Email</td>
<td><input type="text" name="email"></td> </tr> <tr>
<td>passwd</td>
<td><input type="password" name="passwd"></td>
</tr>
<tr>
<td align=right><input type="submit" name="invia"></td>
<td align=left><input type="reset"></td>
</tr>
</table>
</form>
EOD;
}
Da notare che, usando questa “tecnica”, non abbiamo neanche bisogno di specificare l’action del form stesso. Se il pulsante viene premuto potremo proseguire con i controlli del caso e l’eventuale inserimento; vediamo prima se il nome utente esiste:
else {
$sql = "select * from $tabella where nome='$nome'";
$query =mysql_query ($sql) or die (errore_server());
$num = mysql_numrows($query);
if ($num == 1) {
echo "nome utente già occupato<br>";
echo "<a href=\"javascript:history.back()\">ritenta</a>
con un altro username";
}
Utilizzando la solita istruzione mysql_numrows controlleremo il risultato della query e, qualora esso sia maggiore di 0, rimanderemo indietro l’utente per farlo riprovare con un altro nick.
else {
$ip = $REMOTE_ADDR;
$sql="INSERT INTO anagrafica (id,nome,email,password,
data,ip) VALUES ('', '$nome', '$email',
'$passwd', '$data', '$ip')";

$query = mysql_query ($sql) or die (errore_server());
echo "dati inseriti correttamente<br>";
E Inviamo le e-mail
Dopo aver inserito tutti i dati dell’utente nel nostro bravo database, possiamo pensare a inviare le due e-mail. La prima, come dicevamo, sarà indirizzata all’utente e conterrà i suoi dati, a mò di promemoria, e l’altra arriverà al webmaster del sito. Vediamo il codice della prima mail:
$from_mail = "iltuo@indirizzo.tld";
$To="$email";
$Headers ="From: $from_mail";
$Soggetto="[Inserire nome del sito] I tuoi dati di accesso";
$Corpo.="Ciao!\n\n";
$Corpo.="Sono il programma Sendmail di http://$HTTP_HOST\n";
$Corpo.=" La tua iscrizione è stata accettata!\n\n";
$Corpo.=" Questi sono i tuoi dati:\n\n";
$Corpo.=" Il tuo nome utente: $nome\n";
$Corpo.=" La tua password: $passwd\n\n";
$Corpo.=" A presto!\n\n";
$Corpo.="--------------------------------------------\n";
$Corpo.="$from_mail\n";
$Corpo.="http://$HTTP_HOST\n";
$Corpo.="--------------------------------------------\n";
La variabile $from_mail conterrà l’indirizzo che verrà visualizzato come mittente dell’e-mail, e che inseriremo negli headers della mail (occhio, non sono quelli uguali http…:) ). In $To lo script prenderà l’indirizzo dell’utente per utilizzarlo come destinatario, mentre in $Soggetto il testo (personalizzabile) dell’oggetto della mail. Per quanto riguarda il contenuto del messaggio, esso verrà creato concatenando la variabile $Corpo, in modo da inviare un messaggio composto da più righe ordinate. Abbiamo inserito nel corpo anche la variabile d’ambiente $HTTP_HOST, giusto per includere nel messaggio anche il nome del sito.
mail($To, $Soggetto, $Corpo, $Headers);
echo "ti è stata inviata una mail all'indirizzo
$email con i tuoi dati";
Praticamente la stessa cosa sarà da farsi con l’e-mail da inviare al webmaster del sito.
$webmaster = "iltuo@indirizzo.tld";
$email1 ="$email";
$mailTo1="$webmaster";
$mailHeaders1="From: $email1";
$mailSubject1="[Inserire il nome del sito]
Nuovo UTENTE registrato";
$mailBody1.="Ciao!\n\n";
$mailBody1.="Un nuovo utente si è registrato!\n\n";
$mailBody1.="Questi sono i suoi dati:\n\n";
$mailBody1.="Username: $nome\n";
$mailBody1.="passwd: $passwd\n";
$mailBody1.="Email: $email1\n";
mail($mailTo1, $mailSubject1, $mailBody1, $mailHeaders1);
}}
Abbiamo approfittato per chiudere i cicli ancora aperti; il compito dello script, in realtà, è terminato.

Form per il contatto con il web master.
Il form sarà composto da tre pagine e saranno scritte in linguaggio PHP quindi proma di creare le pagine assicuratevi che il vostro host supporti questo tipo di codice.
Questa è la pagina con i campi di testo, anche essa è con estenzione *.PHP. Ma andiamo a vedere il codice.
form.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Sito Utile Form</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?
include('config.php');?>
<form name="Sito Utile Form" method="post" action="invia.php">
<table width="333" align="center">
<tr>
<td>Nome</td>
<td><input name="primo" size="<? echo $lung_nome ?>"></td>
</tr>
<tr>
<td height="24">E-Mail</td>
<td><input name="secondo" size="<? echo $lung_mail ?>"></td>
</tr>
<td>Oggetto</td>
<td><input name="terzo" id="terzo" size="<? echo $lung_ogg ?>">
<tr>
<td>Messaggio</td>
<td><textarea name="quarto" id="quarto"></textarea>
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Invia">
<input type="reset" name="Submit2" value="Cancella">
<?
echo "<input type=hidden name=ip value=$REMOTE_ADDR>";
echo "<input type=hidden name=riferimento value=$HTTP_REFERER>";
echo "<input type=hidden name=ora value=$ora>";
echo "<input type=hidden name=data value=$data>";
?>
</table>
</form>
</body>
</html>
Bene questo sono i campi del form, naturalmente sarà possibile cambiarli a proprio piacimento, ma ricordate che il form dovrà sempre inviare i dati alla pagina "invia.php". La pagina dovrà essere con estenzione *.php perchè al suo interno è inclusa la pagina che regolerà la grandezza dei form e sopratutto perchè sono presenti alla fine del codice delle stringhe:
<?
echo "<input type=hidden name=ip value=$REMOTE_ADDR>";
echo "<input type=hidden name=riferimento value=$HTTP_REFERER>";
echo "<input type=hidden name=ora value=$ora>";
echo "<input type=hidden name=data value=$data>";
?>
che mostrano l' IP e la provenienza di colui che ha contattato il web master.
Ora andiamo a vedere la pagina di configurazione della grandezza del form.
config.php
<?php
$lung_nome="60";
$lung_mail="60";
$lung_ogg="60";
$lung_mes="100";
$ora = date ("h:i:s A");
$data = date ("d:m:Y");
?>
Come noterete in questa pagina non ci sono i tag <html>, <head> e <body>, non è un errore no preoccupatevi ma è semplicemente perchè una volta inclusa la pagina diventa tutt'uno con l' altra. Ora i parametri sono settati a lunghezza 60, questo significa che il messaggio per ogni singolo campo potrà essere di 60 lettere, voi potete allungarlo a vostro piacimento.
Ora andiamo a vedere il codice della terza pagina, quello più importante e cioè quello che ci permetterà di inviare il nostro messaggio al WebMaster.
invia.php
<html>
<head>
<title>Grazie</title>
</head>
<body>
<table width="400" align="center">
<tr>
<td>
<?
if ($primo == "")
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\">Attenzione! Non hai inserito il <strong>Nome</strong> </div></td>
</tr></table>";
}
elseif ($secondo == "" || (!ereg(".+\@.+\..+", $secondo)) || (!ereg("^[a-zA-Z0-9_@.-]+$", $secondo)))
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\">Attenzione! Non hai inserito l' <strong>E-mail</strong> </div></td>
</tr></table>";
}
elseif ($terzo == "")
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\">Attenzione! Non hai inserito l' <strong>Oggetto</strong> </div></td>
</tr></table>";
}
elseif ($quarto == "")
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\">Attenzione! Non hai inserito il <strong>Messaggio</strong> </div></td>
</tr></table>";
}
else
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\"><strong>Grazie, il tuo messaggio è stato inviato!</strong></div></td>
</tr></table>";
$ora = date ("h:i:s A");
$data = date ("d:m:Y");
$primo = stripslashes($primo);
$secondo = stripslashes($secondo);
$terzo = stripslashes($terzo);
$quarto = stripslashes($quarto);
mail("tuaemail@xxxx.xxx","Modulo di invio dal Sito",
"Inviato da: $primo
il $data alle ore $ora
____________________________________________________________
Nome : $primo
E-mail: $secondo
Oggetto: $terzo
Messaggio: $quarto
IP: $ip
Referrer: $riferimento
____________________________________________________________
, "From: $primo <$secondo>");
}
?>
</td>
</tr>
</table>
<br>
<center><a href="form.php" alt="indietro">Torna indietro</a></center>
</body>
</html>
Bene allora, analizziamo il codice. Con queste stringhe di codice verrà controllato se sono stati riempiti i campi del form e sopratutto grazie a questo "($secondo == "" || (!ereg(".+\@.+\..+", $secondo)) || (!ereg("^[a-zA-Z0-9_@.-]+$", $secondo)))" piccolo pezzo di codice si potrà controllare se è stata inserità un e-mail con il simbolo @ (at) e non parole senza senzo.
<?
if ($primo == "")
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\">Attenzione! Non hai inserito il <strong>Nome</strong> </div></td>
</tr></table>";
}
elseif ($secondo == "" || (!ereg(".+\@.+\..+", $secondo)) || (!ereg("^[a-zA-Z0-9_@.-]+$", $secondo)))
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\">Attenzione! Non hai inserito l' <strong>E-mail</strong> </div></td>
</tr></table>";
}
elseif ($terzo == "")
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\">Attenzione! Non hai inserito l' <strong>Oggetto</strong> </div></td>
</tr></table>";
}
elseif ($quarto == "")
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\">Attenzione! Non hai inserito il <strong>Messaggio</strong> </div></td>
</tr></table>";
}
else
{
echo "<table cellspacing=\"2\" cellpadding=\"2\" width=\"98%\" align=\"center\">
<tr>
<td><div align=\"center\"><strong>Grazie, il tuo messaggio è stato inviato!</strong></div></td>
</tr></table>";
Ora basta inserire l'E-Mail del WebMaster in questa parte di codice assieme al titolo del messaggio ed il gioco è fatto.
$ora = date ("h:i:s A");
$data = date ("d:m:Y");
$primo = stripslashes($primo);
$secondo = stripslashes($secondo);
$terzo = stripslashes($terzo);
$quarto = stripslashes($quarto);
mail("tuaemail@xxxx.xxx","Modulo di invio dal Sito",
"Inviato da: $primo
il $data alle ore $ora
Naturalmente le pagine dovranno essere tutte nella stessa cartella oppure basterà cambiare i collegamenti e poi metterle dove si vuole.

Files dentro a MySQL
Introduzione
Credo sia utile spiegare come memorizzare file binari (come immagini, file compressi, ecc..) in un Database (MySql nel nostro caso), per poi recuperarli per vari scopi (ad esempio per scaricarli).
Alcune nozioni prendono spunto dall'articolo di Florian Dittmer, pubblicato su phpbuilder.com, che comunque, stando alle varie discussioni sui forum, ha dato qualche problema nelle sue applicazioni pratiche.
Le ragioni per effettuare lo storage di un file in un DB anzichè in una directory, possono essere molteplici; una di queste è certamente la necessità di proteggere adeguatamente i files da visualizzazioni o download indesiderati o non autorizzati, risultato che si ottiene in modo più facile e, forse, più efficace con il metodo che si sta proponendo. Pensiamo infatti, riprendendo l'esempio di cui sopra, all'ipotesi in cui si volesse consentire soltanto ad utenti registrati la possibilità di scaricare dei files da una zona protetta; appare evidente che avere i files stessi all'interno del Database, assicurerebbe una protezione ed una efficacia maggiore rispetto all'alternativa di avere gli stessi in qualche directory sperduta all'interno del disco rigido.
Cercheremo quindi di costruire uno script che ci consenta di inserire il file desiderato nel db, tramite Upload con metodo POST, e che successivamente ci permetta di scaricare il file stesso, magari dopo un'autenticazione, o di visualizzarlo.
Creazione della tabella
Anzitutto dobbiamo realizzare Il Database e la relativa tabella destinata a contenere il file uploadato (lo faremo tramite script, ma naturalmente si può fare da linea di comando, o tramite tools quali phpMyAdmin).
Ecco il codice PHP necessario per compiere queste operazioni (da copiare ed incollare in un file di testo da salvare come quello_che_vuoi.php):
<?php
// CONNESSIONE AL MYSQL
@mysql_connect('host', 'user', 'password') or die('Connessione fallita !');
// CREAZIONE DATABASE
@mysql_query("CREATE DATABASE IF NOT EXISTS FileBinari")
or die('Creazione database fallita !');
// SELEZIONE DATABASE
@mysql_select_db('FileBinari') or die('Selezione Database fallita !');
// CREAZIONE TABELLA
@mysql_query("
CREATE TABLE file_binari (
Id int(10) UNSIGNED NOT NULL auto_increment,
Descrizione varchar(255) NOT NULL default '',
DatiBinari mediumblob NOT NULL,
Nome varchar(100) NOT NULL default '',
Size int(10) UNSIGNED NOT NULL default '0',
Type varchar(255) NOT NULL default '',
PRIMARY KEY (Id)
)
") or die('Creazione Tabella fallita !');
?>
Il campo destinato ad accogliere i dati binari (DatiBinari) è di tipo mediumblob e può contenere fino a 1,6 Megabyte di dati (dovrebbe essere sufficiente, ma volendo si può optare per il tipo longblob, che può contenere fino a 4,2 Gigabyte di dati. Nel caso di file superiori ai due Mega, ci si dovrà preoccupare di cambiare il settaggio del parametro upload_max_filesize nel file php.ini, che di default è 2 Megabyte.
Inseriamo il file
Una volta creati il Database e la tabella, possiamo occuparci della pagina che conterrà sia il modulo html, che ci consentirà di fare l'Upload del file, sia il codice PHP che processerà il contenuto del form e provvederà ad inserire il file uploadato nel DB (anche qui, copiare ed incollare in un file di testo da salvare come quello_che_vuoi.php):
<?php
if(isset($_POST['invia'])) {
// CONNESSIONE A MYSQL
@mysql_connect('host', 'user', 'password') or die('Connessione fallita !');
// SELEZIONE DATABASE
@mysql_select_db('FileBinari') or die('Selezione Database fallita !');
// MEMORIZZIAMO NELLA VARIABILE $data IL CONTENUTO DEL FILE
$data = addslashes(fread(fopen($_FILES['file_binario']['tmp_name'], 'rb'), $_FILES['file_binario']['size']));
// ESEGUIAMO LA QUERY DI INSERIMENTO
$result = @mysql_query("INSERT INTO file_binari
(Descrizione, DatiBinari, Nome, Size, Type)
VALUES ('{$_POST['Descrizione']}', '{$data}', '{$_FILES['file_binario']['name']}',
'{$_FILES['file_binario']['size']}', '{$_FILES['file_binario']['type']}')")
or die('Query di inserimento fallita !');
// ESITO POSITIVO
echo 'Il file ' . basename($_FILES['file_binario']['name']) . ' è stato correttamente inserito nel Database.';
// CHIUDIAMO LA CONNESSIONE A MYSQL
@mysql_close();
} else {
echo "
<html>
<head>
<title>Form per l'inserimento</title>
</head>
<body>
<div align=\"center\">
<table>
<form action=\"{$_SERVER['PHP_SELF']}\" method=\"POST\" enctype=\"multipart/form-data\">
<tr>
<td valign=\"top\">Descrizione </td>
<td><textarea name=\"Descrizione\" cols=\"40\" rows=\"5\"></textarea></td>
</tr>
<tr>
<td>File</td>
<td><input type=\"file\" name=\"file_binario\" size=\"40\"></td>
</tr>
<tr>
<td colspan=\"2\" valign=\"bottom\" align=\"center\" height=\"30\">
<input type=\"submit\" value=\"Invia il file\" name=\"invia\"></td>
</tr>
</form>
</table>
</div>
</body>
</html>
";
}
?>
La parte che voglio rimarcare di questo codice (non mi soffermo sul modulo HTML, ovviamente, nè sull'inserimento vero e proprio nel Database su cui si possono guardare le guide presenti in questo sito), è la lettura e la "preparazione" del file all'inserimento. Questo avviene grazie alla funzione fread(), che salvaguarda la corrispondenza binaria, ed alla funzione addslashes(), che fa l'escape (aggiungendo un backslash) dei caratteri che potrebbero dare "fastidio" (apici singoli, apici doppi e lo stesso backslash).
Inseriamo qualche file di esempio nel Database (possibilmente di tipi diversi, magari qualche immagine e qualche altro tipo di file).
Visualizzare o scaricare il file
A questo punto abbiamo bisogno del codice per visualizzare e/o scaricare questi files ma, siccome siamo dei bravi programmatori, prepareremo uno script che a seconda del tipo proponga o meno l'opzione "visualizza" oltre a "scarica". Ecco il possibile codice della pagina che visualizzerà i files con le opzioni(da copiare ed incollare in un file di testo da salvare come quello_che_vuoi.php):
<?php
// CONNESSIONE AL MYSQL
@mysql_connect('host', 'user', 'password') or die('Connessione fallita !');
// SELEZIONE DATABASE
@mysql_select_db('FileBinari') or die('Selezione Database fallita !');
// TIPI DI FILE VISUALIZZABILI
$visualizzabili = array('image/jpeg', 'image/pjpeg', 'image/gif', 'image/png');
$select = @mysql_query("SELECT * FROM file_binari") or die('Query fallita !');
echo "
<div align=\"center\"> <table>
";
while($result = @mysql_fetch_array($select)) {
echo " <tr>\n <td align=\"center\">" . $result["Nome"];
echo "<font size=\"1\">(" . $result['Size'] . " bytes)</font>";
if($result['Descrizione']) echo '<br />' . $result['Descrizione'];
echo "</td>\n <td valign=\"top\"> <a href=\"actions.php?action=download";
echo "&Id=" . $result['Id'] . "\" target=\"_blank\">download</a> </td>\n";
echo " <td valign=\"top\">";
if(in_array($result['Type'], $visualizzabili)) {
echo " <a href=\"actions.php?action=view&Id=" . $result['Id'] . "\" ";
echo "target=\"_blank\">visualizza</a> ";
}
echo "</td>\n </tr>\n";
}
echo "</table>\n</div>\n";
// CHIUDIAMO LA CONNESSIONE A MYSQL
@mysql_close();
?>
Molto semplice: estraiamo tutto il contenuto del Database e lo visualizziamo, a seconda poi che il file sia o meno di un tipo compreso nell'array $visualizzabili (immagini .gif, .jpg e .png), viene o non viene proposta l'opzione "visualizza" (l'opzione download è comunque offerta).
Problemi di Content-Type
Ed ecco il possibile codice della pagina actions.php che provvederà a visualizzare o a far scaricare il file (da copiare ed incollare in un file di testo da salvare come actions.php):
<?php
if($_GET['action'] && $_GET['Id'] && is_numeric($_GET['Id'])) {
// CONNESSIONE AL MYSQL
@mysql_connect('host', 'user', 'password') or die('Connessione fallita !');
// SELEZIONE DATABASE
@mysql_select_db('FileBinari') or die('Selezione Database fallita !');
switch($_GET['action']) {
// VISUALIZZAZIONE
case 'view' :
$select = @mysql_query("SELECT DatiBinari, Type
FROM file_binari WHERE Id = " . intval($_GET['Id']))
or die('Query fallita !');
$result = @mysql_fetch_array($select);
$data = $result['DatiBinari'];
$type = $result['Type'];
Header('Content-type: ' . $type);
echo $data;
break;
// DOWNLOAD
case 'download' :
$select = @mysql_query("SELECT DatiBinari, Nome, Type
FROM file_binari WHERE Id = " . intval($_GET['Id']))
or die('Query fallita !');
$result = @mysql_fetch_array($select);
$data = $result['DatiBinari'];
$name = $result['Nome'];
$type = $result['Type'];
// SE IL BROWSER E' INTERNET EXPLORER
if(ereg("MSIE ([0-9].[0-9]{1,2})", $_SERVER['HTTP_USER_AGENT'])) {
header('Content-Type: application/octetstream');
header('Content-Disposition: inline; filename=' . $name);
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
} else {
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $name);
header('Expires: 0');
header('Pragma: no-cache');
}
echo $data;
break;
default :
// DEFAULT CASE, NESSUNA AZIONE
break;
} // endswitch
// CHIUDIAMO LA CONNESSIONE
@mysql_close();
} //endif
?>
Come detto, la pagina chiamata actions.php visualizza o forza il download del file desiderato. A quest'ultimo proposito però vanno fatte alcune considerazioni in relazione al Content-Type octet-stream (o octetstream come preferisce, per oscure ragioni, Internet Explorer), che può essere considerato come il tipo "standard" per i file binari.
Octet Stream vuol dire, letteralmente, "flusso di ottetti", ossia flusso di numeri a otto bit.
Ebbene il problema sorge perchè si è lontani dall'affermarsi di uno standard in tema di Content-Type, per cui quando si inviano intestazioni di questo tipo, occorre porre attenzione ai vari browser che queste intestazioni possono ricevere; a questo proposito ecco i browser (su piattaforma Windows e Linux) su cui ho testato con successo questo script:
WINDOWS
Explorer 5.5, 6.0
Mozilla 1.1, 1.2, 1.3, 1.4, 1.5, 1.6
Firebird 0.7
Opera 7.23
LINUX
Konqueror 2.2.1, 3.1.0
Mozilla 1.1, 1.2, 1.3, 1.4, 1.5, 1.6
Galeon 1.2.5
Firebird 0.7
Opera 7.11
Netscape Communicator 4.78
Conclusioni
A conclusione di questo articolo, voglio segnalarvi anche un altro modo per visualizzare le immagini. Inserire il link alla pagina che abbiamo chiamato actions.php (passando nella query string anche l'ID e l'action uguale a view, naturalmente) all'interno del tag <img> (anche all'interno di una normale pagina .HTML). Per vedere quanto questo sia facile, provate a sostituire, all'interno del codice della pagina che ci offre l'opportunità di scaricare e/o visualizzare i files, il ciclo while ivi presente con questo:
while($result = @mysql_fetch_array($select)) {
if(in_array($result['Type'], $visualizzabili)) {
echo " <tr>\n <td align=\"center\">";
echo "<img src=\"actions.php?action=view&Id=" . $result['Id'] . "\">";
echo "</td>\n </tr>\n";
}
}

La funzione mail()
Introduzione
A mio modesto avviso uno dei più interessanti ed utili aspetti di Internet è dato dalla possibilità di inviare e ricevere Email, la cosiddetta Posta Elettronica, una forma di comunicazione sempre più diffusa e, per varie ragioni, fra tutte la semplicità d'uso e l'immediatezza del messaggio.
Quando parliamo di mail probabilmente pensiamo subito ad un Client di Posta Elettronica (Outlook o Eudora, per citarne due tra i più diffusi), software grazie al quale riusciamo agevolmente a gestire la nostra corrispondenza telematica o, in alternativa, a quei servizi on-line con cui è possibile ottenere lo stesso risultato.
Quello che molti non sanno, invece, è che è possibile inviare email grazie a PHP, sempre in modo molto semplice, grazie a pochissime righe di codice, come vedremo immediatamente. I messaggi non saranno soltanto di puro testo ma anche in formato HTML e con allegati.
Ma cos'è una mail ? Volendo semplificare al massimo la definizione, una mail non è altro che un file di testo, composto da una serie di intestazioni (separate da loro dal carattere di Nuova Linea e che rappresentano delle istruzioni per un software di posta elettronica o danno particolari informazioni sulla struttura e la natura della mail stessa) e dal messaggio vero e proprio.
La funzione, l'unica, che PHP ci mette a disposizione per l'invio di email dal server è la funzione mail(), che prevede tre argomenti obbligatori e due facoltativi.
Prima di addentrarci nell'esame della funzione, è necessario fare un passo indietro, perchè possiamo utilizzare efficacemente mail(), dobbiamo infatti accertarci che PHP sia correttamente configurato. A questo scopo dobbiamo ovviamente dare un'occhiata al file di configurazione, php.ini, nella parte dedicata a questo argomento:
[mail function]
; For Win32 only.
SMTP = localhost
; For Win32 only.
sendmail_from = me@localhost.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path =
Come si vede è necessario indicare un server SMTP (Simple Mail Transfer Protocol) ed un indirizzo email che costituirà il mittente di posta predefinito, soltanto nel caso in cui PHP venga eseguito su Windows; nel caso in cui si lavori su piattaforma UNIX, invece, sarà necessario solo verificare il corretto percorso del programma per l'invio di posta che sarà nel 90% dei casi, sendmail che è installato di default su quasi tutti i sistemi UNIX e che si preoccuperà di svolgere tutto il lavoro di invio del messaggio al mail server del destinatario.
Evidente quindi che la funzione mail() si limita semplicemente ad inviare al sistema di posta (locale o remoto), il messaggio elettronico e restituisce TRUE quando il messaggio stesso è passato correttamente, a prescindere dal fatto che la mail sia stata inviata o ricevuta con successo.
La funzione mail()
La funzione mail(), si diceva, prevede tre argomenti obbligatori, essi sono:
1) l'indirizzo Email (o gli indirizzi, separati fra loro con una virgola) del destinatario
2) il soggetto della Mail
3) il corpo (il contenuto) della mail
Questi argomenti vanno indicati per la corretta esecuzione della funzione, ma è possibile comunque lasciare vuoti il secondo e terzo campo; ad esempio, questa riga di codice:
mail("mail@sito.it", "", "");
provvederà ad inviare una mail, senza soggetto e senza contenuto, all'indirizzo mail@sito.it.
La funzione prevede, inoltre, altri due parametri facoltativi.
1) il primo destinato a contenere le intestazioni supplementari della mail, fra cui ricordiamo:
# From - serve a specificare il mittente della mail stessa, in caso di mancata indicazione, verrà indicato il mittente di default del sistema. La sintassi di From è la seguente:
# From: mittente@sito.it
o, in alternativa
# From: mittente
# Reply-to: l'indirizzo (o gli indirizzi) di posta elettronica cui inviare le risposte
# Cc: Carbon Copy (Copia Carbone), ossia un elenco di ulteriori indirizzi (separati da una virgola), destinatari della mail
# Bcc: Blind Carbon Copy (Copia Carbone Nascosta), l'indirizzo ( o gli indirizzi) cui inviare la mail senza che lo stesso (o gli stessi) siano visualizzati tra i destinatari
# La versione MIME (Multipurpose Internet Mail Extensions)
# Il tipo di contenuto (text/html, text/plain, multipart/mixed)
# La codifica di trasferimento dei contenuti
# Il set di caratteri
2) nel quinto parametro (facoltativo, aggiunto a partire da PHP 4.05), infine, è possibile specificare dei parametri addizionali a linea di comando.
Tutte le intestazioni vanno separate tra di loro da un carattere di ritorno (\r) più uno di nuova riga (\n), anche se a questo proposito va detto che il carattere \n sarebbe sufficiente (sicuramente lo è sui sistemi UNIX), ma purtroppo si è ben lontani dall'affermarsi di uno standard universale che venga correttamente interpretato da tutti i client di posta e da tutti gli MTA (Mail Transfer Agent), per cui occorre regolarsi di volta in volta.
Alla luce di quanto detto, una mail un pò più "completa" potrebbe essere questa:
<?php
$headers = "From: mittente\nCc: copy@sito.it\nReply-to: reply@sito.it";
mail("mail@sito.it", "Soggetto", "Contenuto", $headers);
?>
Invio di una email in formato testo
Cerchiamo adesso di analizzare dei casi concreti di applicazione della funzione mail(); primo fra tutti, ovviamente, il classico "form to mail", ossia uno script che provveda ad inviare il contenuto di un modulo HTML ad un indirizzo Email specificato.
Il form HTML potrebbe essere questo:
<form action="./mail.php" method="POST">
<table border="0">
<tr>
<td>Nome</td>
<td><input type="text" name="Nome" size="30"></td>
</tr>
<tr>
<td>Età</td>
<td><input type="text" name="Anni" size="5"></td>
</tr>
<tr>
<td>Città</td>
<td><input type="text" name="City" size="30"></td>
</tr>
<tr>
<td>Indirizzo</td>
<td><input type="text" name="Address" size="30"></td>
</tr>
<tr>
<td valign="top">Note</td>
<td><textarea rows="6" name="Note" cols="50"></textarea></td>
</tr>
<tr>
<td colspan="2" valign="bottom" align="center" height="30">
<input type="submit" value="Invia">
<input type="reset" value="Cancella"></td>
</tr>
</table>
</form>
La pagina .php destinata a ricevere il contenuto del modulo (mail.php, nel nostro esempio) potrebbe essere la seguente:
<?php
// L'INDIRIZZO DEL DESTINATARIO DELLA MAIL
$to = "mail@sito.it";
// IL SOGGETTO DELLA MAIL
$subject = "Modulo proveniente dal sito www.miosito.it";
// COSTRUIAMO IL CORPO DEL MESSAGGIO
$body = "Contenuto del modulo:\n\n";
$body .= "Nome: " . trim(stripslashes($_POST["Nome"])) . "\n";
$body .= "Età: " . trim(stripslashes($_POST["Anni"])) . "\n";
$body .= "Città: " . trim(stripslashes($_POST["City"])) . "\n";
$body .= "Indirizzo: " . trim(stripslashes($_POST["Indirizzo"])) . "\n";
$body .= "Note: " . trim(stripslashes($_POST["Note"])) . "\n";
// INTESTAZIONI SUPPLEMENTARI
$headers = "From: Modulo utenti<modulo@sito.it>";
// INVIO DELLA MAIL
if(@mail($to, $subject, $body, $headers)) { // SE L'INOLTRO E' ANDATO A BUON FINE...
echo "La mail è stata inoltrata con successo.";
} else {// ALTRIMENTI...
echo "Si sono verificati dei problemi nell'invio della mail.";
}
?>
Poco o niente da dire sul codice (i commenti dovrebbero essere più che sufficienti), solo da notare come costruiamo il corpo del messaggio concatenando i vari elementi del modulo e, come prevediamo, di inviare in ogni caso messaggi personalizzati che indichino all'utente l'esito dell'invio del modulo (la @ anteposta alla funzione, impedisce la stampa a video dei messaggi di errore predefiniti di PHP).
Invio di un allegato
Nel caso in cui si volesse inviare la mail in formato HTML, è possibile usare il codice di cui sopra, cui è sufficiente aggiungere una intestazione (appena sotto $headers = ...), per specificare il tipo di contenuto ed il set di caratteri:
$headers .= "Content-Type: text/html; charset=iso-8859-1\n";
Per concludere voglio spiegare brevemente, con il codice di esempio, come allegare un file ad una mail, argomento che è certamente tra i più interessanti in relazione all'invio di mail con PHP e che è sicuramente meno ostico di quanto potrebbe apparire, tenendo conto che un allegato non è altro che un insieme di dati che vengono codificati in un certo modo. È sufficiente indicare al sistema di posta che riceverà il messaggio il tipo di codifica utilizzata.
Ecco subito il codice necessario, anzitutto il modulo HTML:
<form action="sendmail.php" enctype="multipart/form-data" method="POST">
<table cellpadding="0" cellspacing="0">
<tr>
<td>Destinatario: </td>
<td><input type="text" name="Destinatario" size="40"></td>
</tr>
<tr>
<td>Soggetto:</td>
<td><input type="text" name="Soggetto" size="40"></td>
</tr>
<tr>
<td>Allegato:</td><td><input type="file" name="allegato" size="40"></td>
</tr>
<tr>
<td valign="top">Contenuto:</td>
<td><textarea name="Contenuto" rows="15" cols="50"></textarea></td>
</tr>
<tr>
<td height="30" valign="bottom" colspan="2" align="center">
<input type="submit" value="Invia la mail">
</tr>
</table>
</form>
Voglio far notare l'attributo del form multipart/form-data, sulla cui spiegazione vi rimando al mio articolo sugli Upload in PHP.
Ecco il codice della pagina sendmail.php "puntata" dal form:
<?php
// RENDIAMO LO SCRIPT COMPATIBILE CON LE VERSIONI DI PHP < 4.1.0
if(!isset($_POST)) $_POST = $HTTP_POST_VARS;
if(!isset($_FILES)) $_FILES = $HTTP_POST_FILES;
// RIPULIAMO I VARI CAMPI DEL MODULO
$Destinatario = trim($_POST["Destinatario"]);
$Soggetto = trim(stripslashes($_POST["Soggetto"]));
$Contenuto = trim(stripslashes($_POST["Contenuto"]));
// ASSEGNIAMO A VARIABILI PIU' LEGGIBILI, LE PROPRIETA' DELL'ALLEGATO
$attach = $_FILES["allegato"]["tmp_name"];
$file_name = $_FILES["allegato"]["name"];
$file_type = $_FILES["allegato"]["type"];
$file_size = $_FILES["allegato"]["size"];
// DELIMITATORE
$boundary = md5(uniqid(microtime()));
// APRIAMO L'ALLEGATO PER LEGGERLO E CODIFICARLO
$file = @fopen($attach, "r");
$contents = @fread($file, $file_size);
$encoded_attach = chunk_split(base64_encode($contents));
@fclose($file);
// INTESTAZIONI DELLA MAIL
$mail_headers .= "MIME-version: 1.0\n";
$mail_headers .= "Content-type: multipart/mixed; boundary=\"$boundary\"\n";
$mail_headers .= "Content-transfer-encoding: 7BIT\n";
$mail_headers .= "X-attachments: $file_name\n";
// COSTRUIAMO IL CORPO DELLA MAIL
$mail_body = "--$boundary\n";
$mail_body .= "Content-Type: text/plain; charset=us-ascii\n";
$mail_body .= "Content-Transfer-Encoding: 7bit\n\n";
$mail_body .= "$Contenuto\n\n";
$mail_body .= "--$boundary\n";
$mail_body .= "Content-type: $file_type; name=\"$file_name\"\n";
$mail_body .= "Content-Transfer-Encoding: BASE64\n";
$mail_body .= "Content-disposition: attachment; filename=\"$attach_name\"\n\n";
$mail_body .= "$encoded_attach\n";
$mail_body .= "--$boundary--\n";
// INVIO DELLA MAIL
if(@mail($Destinatario, $Soggetto, $mail_body, $mail_headers)) { // SE L'INVIO E' ANDATO A BUON FINE...
echo "La mail è stata inoltrata con successo.";
} else {// ALTRIMENTI...
echo "Si sono verificati dei problemi nell'invio della mail.";
}
?>
Analizziamo il codice
Una breve spiegazione del codice si impone. Anzitutto, a differenza delle mail che contengono puro testo, qui entrano in gioco gli standard MIME (Multipurpose Internet Mail Extensions), che consentono di estendere le potenzialità delle mail consentendo, fra l'altro, di allegarvi dei file. Ecco quindi che la prima intestazione che abbiamo specificato è la versione MIME.
Sempre riguardo alle intestazioni, notiamo come il content-type sia multipart/mixed, questo perchè la mail è destinata a contenere dei dati non testuali.
Caratteristica dei messaggi di questo tipo è che il loro corpo deve essere diviso in uno o più parti, separate fra di loro da un delimitatore (boundary) specificato sempre nella stessa intestazione, che non deve assolutamente comparire all'interno delle parti che delimita. Ecco perchè abbiamo usato le funzioni md5(uniqid(microtime())) per costruirlo: esse generano una stringa alfanumerica casuale di 32 caratteri; in questo modo avremo così la certezza pressochè assoluta che la stringa risultante non sarà presente nel corpo della mail.
Ciascuna parte deve pertanto iniziare con il boundary preceduto da due trattini (--$boundary); l'ultima parte del messaggio deve invece essere seguita dal boundary preceduto e seguito da due trattini (--$boundary--), in questo modo si indica al programma di posta che il messaggio non contiene altre parti.
La successiva intestazione, specifica il nome del file allegato (contenuto nella variabile $file_name). A questo punto iniziamo a costruire il corpo della mail suddiviso, come si diceva, in varie parti che iniziano con --$boundary; la prima parte è destinata a contenere il contenuto della textarea (puro testo), per cui vengono specificati il content-type ed il set di caratteri (rispettivamente text/plain e us-ascii), quindi il Content-transfer-encoding, ossia il tipo di codifica utilizzato sui dati e che verrà utilizzato dal sistema di posta che riceverà la mail per la relativa decodifica (7bit è la normale codifica utilizzata sui caratteri US ASCII); segue quindi il contenuto (testuale) vero e proprio del messaggio.
E' la volta quindi dell'allegato. Dopo il boundary vengono indicati il tipo ed il nome del file, quindi il Content-transfer-encoding, base64 in questo caso, che è il tipo di codifica più affidabile per i dati non testuali. Segue infine l'allegato vero e proprio; a questo proposito è necessario fare un passo indietro, dopo che il file viene "letto" (con fread(), che salvaguarda la corrispondenza binaria), viene "trasformato" con la codifica base64 (funzione base64_encode()) e, al contempo, viene suddiviso (con la funzione chunk_split()) in chunks (pezzi) di 76 caratteri, questo perchè i dati codificati con base64 devono essere rappresentati in righe non superiori a 76 caratteri.
A conclusione del corpo della mail ($mail_body) viene quindi inserito il boundary di chiusura (--$boundary--) e la mail può quindi essere inviata.

Un motore di ricerca in PHP e MySQL
In questo tutorial, edito in due puntate, ci occuperemo di realizzare un motore di ricerca interno con PHP e MySQL.
La prima operazione sarà realizzare la tabella "Articoli" con campi "titolo" e "link" entrambi di tipo text.... potete anche realizzare una chiave primaria "Id", ma non ci servirà.
Fatto questo, creiamo il file di connessione al database, "connessione.php", di cui ecco il codice:
<?php
$hostname_articoli = "host";
$database_articoli = "nomedatabase";
$username_articoli = "nomeutente";
$password_articoli = "password";
$articoli = mysql_pconnect($hostname_articoli, $username_articoli, $password_articoli) or trigger_error(mysql_error(),E_USER_ERROR);
?>
Ora creiamo la pagina "cerca.htm", contenente il form; ecco il codice:
<?php require_once('connessionericerca.php'); ?>
<?php
$colname_ricerca = "1";
if (isset($_POST['titolo'])) {
$colname_ricerca = (get_magic_quotes_gpc()) ? $_POST['titolo'] : addslashes($_POST['titolo']);
}
mysql_select_db($database_articoli, $articoli);
$query_ricerca = sprintf("SELECT * FROM articoli WHERE titolo = '%s'", $colname_ricerca);
$ricerca = mysql_query($query_ricerca, $articoli) or die(mysql_error());
$row_ricerca = mysql_fetch_assoc($ricerca);
$totalRows_ricerca = mysql_num_rows($ricerca);
?>
<form name="ricerca" action="ricerca.php">
<input type="text" name="titolo">
<input type="submit" value="Cerca">
</form>
Chiaramente la grafica è tutta personalizzabile, ma lascio a voi questo compito.
Nella prossima puntata vedremo come realizzare "ricerca.php".
Ora creiamo "ricerca.php", la pagina che visualizzerà i risultati della ricerca.
Ecco il codice:
<?php require_once('connessione.php'); ?>
<?php
$colname_ricerca = "1";
if (isset($_GET['titolo'])) {
$colname_ricerca = (get_magic_quotes_gpc()) ? $_GET['titolo'] : addslashes($_GET['titolo']);
}
mysql_select_db($database_articoli, $articoli);
$query_ricerca = sprintf("SELECT * FROM articoli WHERE titolo LIKE '%%%s%%' ORDER BY titolo ASC", $colname_ricerca);
$ricerca = mysql_query($query_ricerca, $articoli) or die(mysql_error());
$row_ricerca = mysql_fetch_assoc($ricerca);
$totalRows_ricerca = mysql_num_rows($ricerca);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Risultati della ricerca</title>
</head>
<body>
<div align="left">
<p>
<?php do { ?>
<a href="<?php echo $row_ricerca['link']; ?>"><?php echo $row_ricerca['titolo']; ?></a>
<?php echo $row_ricerca['data']; ?>
<?php } while ($row_ricerca = mysql_fetch_assoc($ricerca)); ?>
</p>
<p><form name="ricerca" action="ricerca.php">
<div align="center">Effettua un'altra ricerca
<input type="text" name="titolo">
<input type="submit" value="Cerca">
</div>
</form></p>
</div>
</body>
</html>
<?php
mysql_free_result($ricerca);
?>

Come faccio a copiare un file remoto?
Esistono molti modi, ma il piu' semplice e' l'utilizzo di questo script:
//avoids annoying errors, unset to debug
error_reporting(5);
//opens file for read from
$srcfile1 = fopen("$remotefile", "r");
//opens local file
if (!($fp1 = fopen($localfile,"w"))) die("Could not open local file for writing");
//writes contents of remote(actually, local temp file) file
//to local file
while ($contents = fread( $srcfile1, 8192 )) {
fwrite( $fp1, $contents, strlen($contents) );
//close them both
}
fclose($srcfile1);
fclose($fp1);

Come faccio ad eseguire un programma esterno al php?
Devi utilizzare le funzioni exec() o system().
E' possibile anche utilizzare la funzione virtual().
Maggiori informazioni sul manuale del PHP presente all'url:
http://www.php.net/manual

Esistono servizi GRATUITI di web hosting con supporto PHP/SQL?
www.mycgiscripts.com
www.spaceports.com
www.3q.to

E' possibile stampare da uno script PHP?
No. Gli script PHP sono server-side, ovvero eseguiti dal server remoto e quindi non e' possibile far stampare su una macchina locale.

Da "2000-12-15" a "15 Dec 2000"
$dates="2000-12-15";
Then do the following nifty stuff:
$sho=explode("-",$dates);
$showMe=date("j-M-Y",mktime(0,0,0,$sho[1],$sho[2],$sho[0]));
echo $showMe;

Come creo un piccolo contatore senza appoggiarmi a nessun DB?
Basta utilizzare questo piccolissimo script:
$fp = fopen("num.txt","r ");
$num = (int)fgets($fp,32);
$num ;
fseek($fp,0);
fputs($fp,$num);
fclose($fp);
Attenzione che se lo script contenente questo pezzo di codice viene eseguito 2 o piu' volte nello stesso momento allora una sola volta il file "num.txt" sara' aggiornato.

Frasi random ad ogni accesso di pagina
Questa volta impareremo a far visualizzare una frase diversa ad ogni accesso di pagina.
Il codice è uguale a quello usato per le immagini ma avremo bisogno dell aiuto di un Array.
Incominciamo, prendiamo il nostro editor preferito ed incominciamo scrivendo questo codice.
<?
$frasi = array('ciao come stai?', 'grazie per la tua visita', 'oggi è una bella giornata', 'che temporale!');
$num=rand(0,3);
print $frasi[$num];
?>
Ora con la variabile $frase dichiareremo l' array ed i suoi valori (le frasi al suo interno), il codice sulla riga di sotto randomizzerà i numeri (ora da 0 a 3).
In fine l' array viene stampato ma al posto del valore verrà messa la variabile $num per far si che la frase venga random.

Immagini casuali ad ogni accesso di pagina
Impariamo a far visualizzare un immagine diversa ad ogni accesso di pagina con l' aiuto del PHP.
Incominciamo, apriamo il nostro editor html preferito (potete usare anche il Blocco Note di Windows) e inserite questo codice.
<?
$num=rand(1,10);
print("<img src=\"images/img".$num.".gif\">");
?>
Bene, analizziamo il codice. La prima striga fa si che le immagini (in questo caso 10) siano visualizzate in modo casuale.
La seconda stamperà a schermo l' immagine che in quel momento lo script a scelto. Per far si che il codice funzioni bisogna rinominare le immagini con dei numeri, come visto nella prima righa, da 1 a 10 (i numeri potete cambiarli) e mettere le immagini in modo che vengano trovate dal percorso stampato dallo script.

Un visualizzatore di immagini con PHP
In Php possiamo con un semplice codice e con un minimo di ingegno costruire piccole utility per il nostro sito, come il visualizzatore di immagini che esamineremo in questo Articolo. Si crei il file viewer.php (attenzione, se volete rinominarlo dovete cambiare il nome del file anche nel codice in fase di creazione del menu di navigazione) ed eseguitelo sul vostro server dopo aver copiato il codice che segue:
<?PHP
$id = $_GET['id'];
$immagine = "";
if (is_numeric($id) == FALSE)
{
$immagine = "blank";
}
else
{
$immagine = $id;
}
?>
<h1 align="center">VISUALIZZATORE DI IMMAGINI</h1>
<p align="center">
<img src="<?print $immagine?>.jpg">
<br><br>
<?PHP
for ($i=1; $i<5; $i++)
{
print "[<a href='viewer.php?id=" . $i . "'>" . $i . "</a>] ";
}
?>
</p>
Il funzionamento è semplice: si crei il file blank.jpg che rappresenti un'immagine bianca, del colore di sfondo della vostra pagina o un simbolo a vostra scelta. Si prendano poi 4 file immagine con estensione .jpg e li si dispongano nella stessa cartella o posizione sul server. Cliccando sul menu di navigazione verrà passata alla pagina una querystring che visualizzerà l'immagine di cui al numero cliccato. Per aggiungere immagini è necessario modificare il ciclo for inserendo il numero di immagini che avete a disposizione (+ 1); si consiglia di usare una numerazione crescente senza lasciare spazi tra i numeri (es. 1 2 3 5 6 7 dove manca il 4).

Creare un circuito banners in PHP
Articolo a cura di Alberto Giuliani
Riferimenti dell'autore: @ URL
In questo tutorial vedremo come realizzare un semplice circuito di rotazione banner in PHP.
Supponiamo di voler far ruotare 3 banners, e di non disporre di database MySQL per memorizzare le informazioni dei singoli banners.
La pagina in cui ruotano i nostri banners si chiamerà "circuito.php".
Tramite la funzione random genero un numero a caso compreso tra 1 e 3, quindi lo controllo con un ciclo SWITCH (il migliore in questo caso) e infine, in base al numero visualizzo un banner.
Ecco il codice da inserire all'inizio della pagina prima dei TAGs HTML:
<?
// Genero il numero casuale
$numero = rand(1,3);
// Ciclo SWITCH con tanti casi quanti sono i banners
switch($numero)
{
// Primo banner
case "1":
$img = "banner1.gif";
$link = "http://www.link1.it";
break;
// Secondo banner
case "2":
$img = "banner2.gif";
$link = "http://www.link2.it";
break;
// Terzo banner
case "3":
$img = "banner3.gif";
$link = "http://www.link3.it";
break;
}
?>
Ed ecco ora il codice da inserire nel punto in cui si vuole visualizzare il banner:
<?php
// Visualizzo il banner
echo ("<a href='$link' target='_blank'><img src='$img' border='0'></a>");
?>
Potremmo inserire il primo codice in un file a parte del tipo "cod.php" e richiamarlo con un include() nei vari files in cui deve comparire il banner...
Aggiungiamo MySQL..
E' possibile far sì che le informazioni riguardo ai banners siano prelevate da MySQL.
Supponiamo di avere una tabella "banners" con tre campi:
- id, di tipo INT - chiave primaria - AUTO INCREMENT
- img, di tipo TEXT
- link, di tipo TEXT
La selezione del banner avverrebbe in base all'ID:
<?
// Genero il numero casuale
$numero = rand(1,3);
// Genero il codice MySQL per la selezione
$query = mysql_query("SELECT * FROM banners WHERE id = '$numero'");
// Quindi assegno i risultati
$img = $row_query['img'];
$link = $row_query['link'];
?>
Il processo di visualizzazione è il medesimo del primo esempio.

Creare un sito web con PHP
Articolo a cura di Alberto Giuliani
Riferimenti dell'autore: @ URL
In questo tutorial vedremo come realizzare un sito in PHP.
In dettaglio vedremo le tecniche da utilizzare per un sito web facilmente aggiornabile.
Supponiamo di avere un sito con un header superiore, un corpo centrale ed un footer inferiore.
Inserendo in ogni pagina il codice di header, footer e corpo centrale, l'aggiornamento risulterebbe assai difficoltoso e lento.
Ci serviremo quindi del comando include() di PHP, che permette di richiamare più files in altri.
Abbiamo già trattato in dettaglio questo comando a questo articolo. In questa lezione vedremo l'applicazione più comune.
Creiamo un file "header.php" ed inseriamoci questo codice:
<div id="header">
Qui tutto il codice dell'header...
</div>
Da notare come in questo file non siamo presenti i tags HTML o BODY.
Ora creiamo "footer.php":
<div id="footer">
Qui tutto il codice del footer
</div>
Quindi "index.php":
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Il mio sito con PHP</title>
</head>
<body>
<!-- Inizio HEADER -->
<?php include("header.php"); ?>
<!-- Fine Header -->
<!-- Inizio codice pagina -->
<div id="corpo">
Qui il codice della pagina
</div>
<!-- Fine codice pagina -->
<!-- Inizio codice footer -->
<?php include("footer.php"); ?>
<!-- Fine codice footer -->
</body>
</html>
Da notare come il codice di header e footer venga richiamato in ogni pagina, di modo che sia possibile modificarlo nei rispettivi file e rendere effettive le modifiche in tutte le pagine del sito.
Possiamo ora personalizzare la grafica dei tre DIV con i CSS.
Sicuramente un passo in avanti nella realizzazione di un sito web.

Un semplice sistema di protezione in PHP
In questo tutorial vedremo come realizzare un semplice sistema di protezione in PHP.
Abbiamo già affrontato l'argomento in un altro articolo, ma in questo tutorial proporremo una struttura diversa.
Si tratta di un ciclo IF-ELSE semplificato all'osso, ma comunque molto efficace.
Lo script si compone di due pagine:
- modulo.htm, contenente il form per l'accesso;
- accedi.php, contenente il codice PHP per il controllo.
Nel caso in cui l'utente inserisca un codice di accesso errato, sarà rimandato alla pagina modulo.htm per rieffettuare il login, ma potremmo indirizzarlo ad una pagina di errore da noi creata.
Ecco il codice del form di modulo.htm:
<form name="modulo" action="accedi.php" method="post">
Digita qui il codice di accesso:<br />
<input type="password" name="codice_di_accesso" size="30" />
</form>
Passiamo quindi alla realizzazione di "accedi.php":
<?php
// Recupero i dati dal form
$codice_digitato = $_POST['codice_di_accesso'];
// Settare qui sotto la password reale di accesso all'area protetta
$codice_reale = "pippo";
if ($codice_digitato!=$codice_reale)
{
header("Location: modulo.htm");
exit;
}
?>
<html>
...
Da notare di questo codice la riga
$codice_reale = "pippo";
in cui definisco la password di accesso;
e la riga
header("Location: modulo.htm");
in cui stabilisco la pagina a cui viene rimandato l'utente in caso di errore.
Nella riga
<html>
...
dovrete inserire il codice HTML dell'area riservata.
Logicamente il ciclo può essere esteso ad un controllo USERNAME ePASSWORD semplicemente modificando le condizioni dell'IF.
Ad esempio:
..
if (($user_digitato!=$user_reale) && ($pass_digitato!=$pass_reale))
{
...
}
...

Modulo "Segnala sito ad un amico" in PHP
In questo tutorial vedremo come realizzare un modulo cosiddetto "Tell a friend", ossia un form mail attraverso cui un visitatore può consigliare un sito web ad un amico.
Lo script si compone di due pagine:
- modulo.htm, contenente il form per l'inserimento dei dati;
- send.php, contenente il codice PHP per l'invio dell'email.
Apriamo quindi il nostro editor HTML o testuale e digitiamo il codice di modulo.htm:
<form method="post" action="send.php">
Il tuo nome<br />
<input name="nomemittente" type="text" size="50" />
<br />
Il tuo indirizzo e-mail<br />
<input name="emailmittente" type="text" size="50" />
<br />
Il nome dell'amico<br />
<input name="nomedestinatario" type="text" size="50" />
<br />
L'indirizzo e-mail dell'amico<br />
<input name="emaildestinatario" type="text" size="50" />
<br />
<input type="submit" value="Invia segnalazione" />
<input type="reset" value="Cancella segnalazione" />
</form>
Il codice qui sopra riguarda logicamente solo il form, e quindi dovremo aggiungerlo alla struttura di base, formata dai TAGs classici ed indispensabili, quali <HTML>, <HEAD> e <BODY>.
Procediamo ora con la realizzazione di send.php; per spirito di eleganza, realizzeremo un codice PHP che invii l'email in formato HTML, basandoci su quanto detto in un altro tutorial:
<?PHP
// Processo di recupero dei dati
$nomemittente = $_POST['nomemittente'];
$emailmittente = $_POST['emailmittente'];
$nomedestinatario = $_POST['nomedestinatario'];
$emaildestinatario = $_POST['emaildestinatario'];
// Configuro il testo del messaggio che apparirà all'amico
$messaggio = "Ciao $nomedestinatario, ricevi questa mail perchè $nomemittente ti ha consigliato di visitare AG web solutions";
// Processo di controllo [Opzionale]
if ($nomemittente==null)
{
echo ("Errore: compilare il campo 'Il tuo nome'");
}
else
{
if ($emailmittente==null)
{
echo ("Errore: compilare il campo 'Il tuo indirizzo e-mail'");
}
else
{
if ($nomedestinatario==null)
{
echo ("Errore: compilare il campo 'Il nome dell'amico'");
}
else
{
if ($emaildestinatario==null)
{
echo ("Errore: compilare il campo 'Indirizzo e-mail dell'amico'");
}
else
{
// Processo di configurazione dell'email
// [Destinatario, mittente, ecc]
$mail_to = $emaildestinatario;
$mail_from = $emailmittente;
$mail_subject = "$nomemittente ti segnala AG web solutions";
$mail_body = "<p><font color=#000000>$messaggio</font></p>";
// Intestazioni HTML
$mail_in_html = "MIME-Version: 1.0\r\n";
$mail_in_html .= "Content-type: text/html; charset=iso-8859-1\r\n";
$mail_in_html .= "From: <$mail_from>";
// Processo di invio
if (mail($mail_to, $mail_subject, $mail_body, $mail_in_html))
{
echo ("E-mail inviata con successo");
}
else
{
echo ("Errore interno durante l'invio...");
}
}
}
}
}
?>
Il codice è sufficientemente commentato, e presenta un processo di recupero dei dati iniziale, seguito da un controllo, seguito dal processo di invio.
Salviamo i files e proviamo a testare lo script.

Inviare e-mail con il PHP
Articolo a cura di Alberto Giuliani
Riferimenti dell'autore: @ URL
In questo tutorial vedremo come inviare e-mail dal web, con dei moduli a piacere con il PHP.
Creiamo la pagina contenete il modulo, "modulo.htm". Ecco il codice del form, da inserire tra i tags BODY:
<form method="post" action="inviamail.php" name="inviamail">
Nome:
<input type="text" size="40" name="nome">
E-mail:
<input type="text" size="40" name="email">
Oggetto:
<input type="text" size="40" name="oggetto">
Messaggio:
<textarea cols="50" rows="10" name="messaggio"></textarea>
<input type="submit" value="Invia"><input type="reset" value="Cancella">
</form>
Ora creiamo "inviamail.php". Essa conterrà le istruzioni PHP per inviare la mail ad indirizzo a piacere. Ecco il codice:
<?php
$indirizzo="tuamail@dominio.it";
{
mail($indirizzo,"Messaggio da parte di $nome: $oggetto","$nome - $email ha inviato il seguente messaggio:","$messaggio");
echo ("Il messaggio è stato inviato con successo ");
}
?>
<p><a href="http://www.sito.com">Torna al sito</a></p>
Ed ecco che, una volta impostata la variabile $indirizzo con il vostro indirizzo e-mail, lo script vi invierà tutti i contatti effettuati con il form della pagina "modulo.htm"

Restituzione di una porzione di un campo
Mettiamo il caso di dover estrarre dal db un testo e di doverne restituire una porzione.
La prima cosa che ci viene da fare è:
$res=mysql_query("SELECT testo FROM TABELLA");
$testo=mysql_result($res,0);
$porzione=substr($testo,0,10);
questo restituirà le prime 10 lettere del testo.
Bhè, potremmo più semplicemente scrivere:
$res=mysql_query("SELECT SUBSTRING(testo,1,10) FROM tabella);
$porzione=mysql_result($res,0);
Lavora meno il mysql (estrae meno byte), lavora meno il php (meno codice e funzioni) e lavoriamo meno noi!

Frasi random
Una operazione random non è nient'altro che una operazione che seleziona una serie di dati in maniera casuale, senza nessuna differenza.
Nel php come in una vasta gamma di linguaggi è possibile utilizzare una particolare funzione chiamata funzione rand che ci permette di utilizzare le operazioni random.
Ora in questa lezione vi spiegherò come creare uno script che con la funzione random ci permette di selezionare una varia serie di caratteri.
La sintassi da utilizzare è la seguente:
<?
$saluto[1] = "ciao";
$saluto[2] = "hi";
$saluto[3] = "salut";
$random = rand(1, count($saluto));
floor($random);
echo $saluto[$random];
?>
Possono essere anche aggiunti altre variabile saluto.
Prima creiamo diverse variabile uguali con una unica differenza: il numero di riconoscimento. Come dei valori di un array.
Poi creo una variabile che seleziona tutte le variabile tipo array, e le fa selezionare in modalità random.
Il tutto in fine viene stampato a video.
============================================
Frasi Random ad ogni accesso di pagina
Con questo tutorial faremo apparire ad ogni accesso di pagina una frase differente. Useremo lo stesso codice del tutorial delle immagini random con l' aggiunta di un Array.
Scriviamo il codice con il nostro editor preferito, potete anche usare un blocco note.
random.php
<?
$frasi = array('ciao come stai?', 'grazie per la tua visita', 'oggi è una bella giornata', 'che temporale!');
$num=rand(0,3);
print $frasi[$num];
?>
Con la variabile $frasi dichiareremo l' Array ed i suoi valori (le frasi che verranno stampate). La seconda stringa, già vista nel tutorial precedente, prenderà un numero random a scelta tra quelli inseriti (ora 0-3 come i valori dell array).
Con l' ultima stringa stamperemo il valore dell' Array $frasi corrispondente al numero che verrà "estratto" dalla variabile $num.

Usare un file di testo come database!
In questo tutorial vedremo appunto come leggere i dati presenti in un file di testo, che chiameremo "bancadati.txt".
Il nostro file conterrà una semplice rubrica telefonica con i numeri di telefono dei nostri amici. Precisamente avremo le seguienti informazioni: Nome, Cognome, Numero di Telefono.
Tutte le informazioni dovranno essere separate da un simbolo che prende il nome di delimitatore. In questo esempio useremo i due punti (":").
Ecco un esempio di contenuto:
Giuseppe:Garibaldi:0123/456789
Maria:Stuarda:0123/987654
Adesso dobbiamo creare la nostra applicazione che chiameremo "rubrica.php". Questa deve trovarsi nella stessa directory del file txt che usiamo come database.
Ecco il contenuto:
<?
#specifichiamo il percorso del nostro file txt
$percorso = file("bancadati.txt");
#attiviamo un ciclo usando while
while(list(,$value) = each($percorso))
{
list($nome, $cognome, $tel) = split("[:]", $value);
#Usiamo trim() per eliminare eventuali spazi vuoti
$params["nome"] = trim($nome);
$params["cognome"] = trim($cognome);
$params["tel"] = trim($tel);
#Stampiamo i risultati a video
echo $params["nome"]." - ".$params["cognome"]." - ".$params["tel"]. "<br>";
}
?>
Nel comando split(), all'interno delle parentesi quadre, abbiamo inserito il delimitatore utilizzato nel nostro file di testo. Nel nostro caso abbiamo usato i due punti, ma potete utilizzare qualunque altro simbolo.
Nel nostro esempio abbiamo realizzato una rubrica del telefono ma, come avrete capito, con qualche piccola modifica il codice qui sopra può essere utilizzato per le più disparate necessità.