| 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"> </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 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
<br> <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