Come posso trasformare una stringa di caratteri tutta in minuscolo o maiuscolo? Come faccio ad eliminare un file usando il PHP?
Voglio inviare delle e-mail ai miei utenti usando il formato HTML. Si può? Esiste un pacchetto che installa il PHP & C. senza troppi problemi per i sistemi Windows?
Qual è l'istruzione per leggere il contenuto di un file? Ho la necessità di inviare e-mail a più di un destinatario da uno script PHP, quasi una mailing list. È possibile?
Come faccio a visualizzare il codice di un file php o di una stringa? Magari con il testo colorato? Ho il mio bel sito tutto in ASP, ma vorrei convertirlo al PHP, che mi sembra più veloce. Devo rifare tutto il codice?
Come faccio a cambiare url da una pagina PHP? In pratica come il normale redirect in HTML? Come faccio a generare un numero casuale in PHP?
Come faccio a ottenere il numero del giorno corrente nell'anno? Vorrei visualizzare nel mio sito una cosa come: «Oggi è il 185° giorno dell'anno» Se uso la funzione mail(), sotto Windows, il PHP mi dice sempre che «non riesce a connettersi». Ma a cosa vuole connettersi?
Nel sito che sto costruendo utilizzo spesso le stesse variabili in quasi tutti i file. Come posso ottimizzare il codice per non riscrivere ogni volta le stesse variabili in tutte le pagine? Ho un file PHP che mi conta le visite, e vorrei richiamarlo da una pagina HTML. È possibile ?
Come faccio a conoscere la «taglia di un file», ovvero la sua grandezza espressa in bytes? Ho trovato uno script in PHP che vorrei modificare e ridistribuire. È possibile o commetto qualche reato?
Vorrei sapere quante righe sono contenuti in un file di testo; come faccio? Come faccio ad eliminare i tags HTML da una stringa?
Come conto il numero di linee presenti in un file? Come converto un numero da esadecimale a binario?
Devo leggere un file di testo in PHP, ma quando lo visualizzo nel browser l'ouput non rispetta le interruzioni di linea, e mi stampa tutto su un rigo. Che posso fare? Come elimino gli spazi all'inizio e alla fine di una stringa di testo?
Sono su sistema Unix/Linux. È possibile cambiare i permessi di lettura/scrittura a un file o una cartella con PHP? Ho soltanto la necessità di trasformare i miei dati dal formato Access al formato MySQL (http://www.anse.de/). Posso?
Vorrei controllare che i miei utenti non lascino dei campi vuoti quando riempiono un form. Come faccio? È possibile conoscere la data dell'ultimo accesso a un file?
Esiste un documento con tutti gli errori tipici segnalati dagli utenti? Posso accedere a un database Access con Php?
In caso di errore come faccio a risalire alla causa? Ho installato Php, ma non mi compila le pagine: come mai?
Come faccio a conoscere tutte le funzioni che Php mette a disposizione? Ho sentito dire che il PHP crea le immagini «al volo». Sarebbe utile per creare dei grafici dinamici con i risultati delle query da un database.
Utilizzo la funzione highlight_string() per visualizzare il «codice a colori». È possible cambiare i colori? So che i file con estensione .inc sono poco sicuri, ma sono costretto ad usarli a meno di non dover ritoccare tutto il codice degli script che uso. Che posso fare? Sono su Apache.
Sono già esperto e queste FAQ non mi dicono nulla che già non sapessi, dove posso trovare risposte più approfondite? Aiuto! Le funzioni per Mysql non esistono più?
Meglio installare PHP 5 con Apache 1.3.x o Apache 2.x? Qual è esattamente il codice per inviare una mail in PHP?
Creare una semplice galleria di immagini in PHP Creiamo un menù dinamico
Creare un guestbook MySQL: Ricerca full-text in un database MySQL

 

Come posso trasformare una stringa di caratteri tutta in minuscolo o maiuscolo?
Il PHP è dotato di due funzioni che svolgono proprio questo compito:
strtolower ($stringa); // tutto minuscolo
strtoupper ($stringa); // tutto maiuscolo

Come faccio ad eliminare un file usando il PHP?
Devi usare l'istruzione unlink($nomefile), dando a $nomefile il percorso esatto del file da eliminare. Attenzione, su sistemi Unix devi avere i giusti permessi di scrittura.

Voglio inviare delle e-mail ai miei utenti usando il formato HTML. Si può?
Dovrai soltanto avere l'accortezza di specificare negli headers FROM il «content type» della mail:
mail($recipient, $subject, $message,
From: Content-Type: text/html; charset=iso-8859-1);

Esiste un pacchetto che installa il PHP & C. senza troppi problemi per i sistemi Windows?
In Rete se ne trova più di uno. Prova a dare un occhio a questi link:
* Easyphp.org - http://www.easyphp.org/
* Miniportal - http://instantservers.com/
* Merlin Server - http://www.abriasoft.com/
* PHP Triad - http://sourceforge.net/projects/phptriad/
Il più completo è di sicuro Merlin Server.

Qual è l'istruzione per leggere il contenuto di un file?
Per leggere un file e restituirne il contenuto in «standard output» puoi utilizzare l'istruzione file($nomefile) per mettere il testo in un array, e successivamente convertirlo in stringa con l'istruzione join, in questo modo:
<?
echo join ('', file ('/home/subnet/public_html/html.it/faq/FileDaLeggere.txt'));
?>

Ho la necessità di inviare e-mail a più di un destinatario da uno script PHP, quasi una mailing list. È possibile?
Puoi utilizzare gli «header addizionali», specificando in questi il campo «CC» (copia conoscenza), in una forma simile a questa:
<?
mail($destinatario, $soggetto, $corpo_messaggio,
"CC: indirizzo1@url.com, indirizzo1@ur2.com ...>");
?>
Ovviamente puoi mettere gli indirizzi tutti in una variabile.

Come faccio a visualizzare il codice di un file php o di una stringa? Magari con il testo colorato?
Per i files puoi usare indifferentemente show_source($nomefile) oppure highlight_file($nomefile). Se devi visualizzare una stringa ti conviene utilizzare highlight_string($stringa). Attenzione: highlight_file e highlight_string girano solo su PHP4.

Ho il mio bel sito tutto in ASP, ma vorrei convertirlo al PHP, che mi sembra più veloce. Devo rifare tutto il codice?
È stato creato un programma apposta. Gira su sistemi Linux, e può risparmiarti gran parte del lavoro. Lo trovi su http://asp2php.naken.cc/

Come faccio a cambiare url da una pagina PHP? In pratica come il normale redirect in HTML?
Utilizza l'istruzione:
<?
Header("Location: http://server.tld/pagina.htm");
?>
Attenzione però a non inviare nessun output prima di questa istruzione.

Come faccio a generare un numero casuale in PHP?
Devi usare srand, che inizializza il generatore di numeri casuali, e poi «ricavare» il numero con rand, in questo modo:
<?
srand((double)microtime()*1000000);
echo rand(0,100);
?>

Come faccio a ottenere il numero del giorno corrente nell'anno? Vorrei visualizzare nel mio sito una cosa come: «Oggi è il 185° giorno dell'anno»
L'istruzione DATE() ha un parametro che è fatto apposta, «z». Esso visualizza il giorno corrente. Prova con questo semplice script:
<?
$giorno=date("z");
echo "Oggi è il $giorno ° giorno dell'anno";
?>

Se uso la funzione mail(), sotto Windows, il PHP mi dice sempre che «non riesce a connettersi». Ma a cosa vuole connettersi?
Vuole connettersi al tuo eventuale mail server, che è quasi d'obbligo installare per inviare mail in PHP. Un buon mail server per uso personale puoi trovarlo qui (http://www.infradig.com/infradig/inframail/index.shtml). In alternativa puoi provare a settare nel php.ini (nel parametro SMTP) l'indirizzo del server SMTP che usi abitualmente per inviare la posta. Ma non è detto che funzioni...

Nel sito che sto costruendo utilizzo spesso le stesse variabili in quasi tutti i file. Come posso ottimizzare il codice per non riscrivere ogni volta le stesse variabili in tutte le pagine?
Ti conviene sicuramente utilizzare l'istruzione include. Memorizza tutte le variabili che ti servono in un file .php, e richiamalo in tutti i file del sito con
<?
include("nome_del_file_con_le_variabili.php")
?>
Puoi utilizzare la stessa tecnica anche per le funzioni che creerai e non solo per le variabili.

Ho un file PHP che mi conta le visite, e vorrei richiamarlo da una pagina HTML. È possibile ?
Puoi provare a chiamarlo come se fosse un'immagine, utilizzando i classici TAG, così:
<img src=nomedelfile.php width=1 height=1>
In questo modo «l'immagine» sarà praticamente invisibile.

Come faccio a conoscere la «taglia di un file», ovvero la sua grandezza espressa in bytes?
Devi usare la funzione filesize(). La sintassi corretta sarebbe echo filesize("tuofile.txt").

Ho trovato uno script in PHP che vorrei modificare e ridistribuire. È possibile o commetto qualche reato?
La maggior parte degli script in PHP viene distribuita sotto licenza GPL, che puoi leggere qui (http://www.gnu.org/home.it.html) oppure in traduzione italiana sul sito di Openpress (http://www.apogeonline.com/openpress/gnu_gen_pub_lic.html). Se anche lo script che hai trovato è «sotto GPL», puoi distribuirlo tranquillamente, ma ricorda di leggere la licenza.

Vorrei sapere quante righe sono contenuti in un file di testo; come faccio?
Con «file(nomefile)» puoi mettere il file tutto in un array e con count puoi contarne i valori, in questo modo:
<?
$righi_del_file=file("miofile.txt");
echo count($righi_del_file);
?>

Come faccio ad eliminare i tags HTML da una stringa?
Esiste apposta l'istruzione strip_tags($stringa). Essa prova a rimuovere tutti i tag HTML e PHP che trova all'interno di una stringa, restituendo la stringa in «output standard». Prova con una cosa come questa:
<?
$stringa = "<font size=\"5\"><b>ciao</b></font>";
echo $stringa;
echo "<hr>";
echo strip_tags($stringa);
?>

Come conto il numero di linee presenti in un file?
Leggendolo prima con l'istruzione file(), che converte il contenuto del file in un array, e quindi contando i valori dell'array con count():
<?
$linee_del_file=file("ilmiofile.dat");
echo count($linee_del_file);
?>

Come converto un numero da esadecimale a binario?
Con l'istruzione decbin($numero), di cui esiste anche il contrario: bindec($numero).

Devo leggere un file di testo in PHP, ma quando lo visualizzo nel browser l'ouput non rispetta le interruzioni di linea, e mi stampa tutto su un rigo. Che posso fare?
Usa l'istruzione nl2br() (newline to br) che converte la interruzioni di linea in «break» HTML:
<?
$stringa = "Io sono il primo rigo\nIo inceve sono il secondo";
echo nl2br($stringa);
?>

Come elimino gli spazi all'inizio e alla fine di una stringa di testo?
Grazie alla funzione trim ()
<?
$stringa =" HTML.it - le faq sul PHP";
echo "$stringa\n";
echo trim($stringa);
?>

Sono su sistema Unix/Linux. È possibile cambiare i permessi di lettura/scrittura a un file o una cartella con PHP?
Si usa praticamente la stessa istruzione della shell di Unix, chmod. Devi però avere l'accortezza di scrivere i valori come numeri (es. 777), e non come stringa (es. r+w). Inoltre, è preferibile scrivere i valori in ottale, facendo precedere sempre uno zero.
<?
chmod ("nome_cartella/nome_file.txt", 0777)
?>

Ho soltanto la necessità di trasformare i miei dati dal formato Access al formato MySQL (http://www.anse.de/). Posso?
Puoi utilizzare l'ottimo programma MySQLFront, che tra l'altro è gratuito, per esportare facilmente i tuoi dati tramite ODBC. In alternativa puoi esportare il tuo DB Access in file .CSV ed importarli poi in MySQL (ad esempio con LOAD FILE).

Vorrei controllare che i miei utenti non lascino dei campi vuoti quando riempiono un form. Come faccio?
Potresti utilizzare un semplicissimo ciclo IF/ELSE. Assumendo che il nome del campo da controllare sia $nome_campo, potresti fare qualcosa del genere:
<?
if ($nome_campo==""){
echo "Devi inserire il tuo nome!";
}
else {
echo "Ciao $nome!!!";
}
?>

È possibile conoscere la data dell'ultimo accesso a un file?
Certo, puoi usare la funzione fileatime(nomefile). La data viene restituita in formato Unix.

Esiste un documento con tutti gli errori tipici segnalati dagli utenti?
All'url http://www.php.net/manual sono disponibili manuali continuamente aggiornati anche con i commenti degli utenti. Altrimenti si può dare uno sguardo a http://bugs.php.net.

Posso accedere a un database Access con Php?
Certo. Di solito si utilizza il driver ODBC tramite le funzioni ODBC messe a disposizione da Php. L'importante è configurare il driver ODBC dal pannello di controllo in modo che acceda ai database che si vogliono utilizzare.

In caso di errore come faccio a risalire alla causa?
Per prima cosa cerca di capire qual è la riga che ha generato l'errore. Successivamente consulta il manuale per capire se la sintassi che hai utilizzato è corretta. Eventualmente, se ritieni di aver riscontrato un bug nel programma puoi confrontare la tua impressione con i bug segnalati dagli utenti nel sito http://bugs.php.net.

Ho installato Php, ma non mi compila le pagine: come mai?
Probabilmente il tuo web server non è configurato correttamente per eseguire il codice php. Con Apache basta inserire la riga:
AddType application/x-httpd-php3 .php3
All'interno del file httpd.conf, facendo attenzione che le pagine che contengono il codice abbiano estensione ".php3". Con i web server di Windows ci possono essere varie possibilità, per le quali consigliamo di seguire bene le note di installazione rilasciate con la distribuzione ed eventualmente il manuale (http://www.php.net/manual/it/)

Come faccio a conoscere tutte le funzioni che Php mette a disposizione?
Esistono dei manuali disponibili gratuitamente all'url http://www.php.net/docs.php3. Purtroppo al momento non esistono ancora traduzioni dei manuali in italiano.

Ho sentito dire che il PHP crea le immagini «al volo». Sarebbe utile per creare dei grafici dinamici con i risultati delle query da un database.
E anche per molto altro. Se adeguatamente compilato con le librerie GD, il PHP rende ogni programmatore un vero artista, grazie alle istruzioni:
* imagecreate()
* imagecolorallocate()
* Imagegif()
ma queste sono solo alcune. Dai un'occhiata al manuale; troverai esempi molto esplicativi.

Utilizzo la funzione highlight_string() per visualizzare il «codice a colori». È possible cambiare i colori?
Devi intervenire sempre nel file php.ini. Cerca la sezione
Colors for Syntax Highlighting mode
e cambia i valori presenti di default con quelli che preferisci.

So che i file con estensione .inc sono poco sicuri, ma sono costretto ad usarli a meno di non dover ritoccare tutto il codice degli script che uso. Che posso fare? Sono su Apache.
Se usi il server Apache sei a buon punto, ma il tuo provider deve offrirti la possibilità di modificare i file .htaccess. Utilizzando le classiche direttive di Apache per inibire la lettura di alcuni file, puoi editare un file .htaccess scrivendo così
<Files *.inc>
order deny,allow
deny from all
</Files>
Ricorda di uploadare il file sul server in formato ASCII!

Sono già esperto e queste FAQ non mi dicono nulla che già non sapessi, dove posso trovare risposte più approfondite?
http://www.zend.com/php/ask_experts.php

Aiuto! Le funzioni per Mysql non esistono più?
A causa di alcune incompatibilità tra licenze (http://it2.php.net/manual/en/faq.databases.php#faq.databases.mysql.php5) non sono più abilitate di default. In Linux è necessario avere installato Mysql e utilizzare l'opzione di configurazione with-mysql=/path/to/mysql_install_dir. In Windows è necessario copiare in System (o System32) la libreria libmysql.dll (presente nel pacchetto di installazione di PHP), verificare che nella directory ext sia presente php_mysql.dll e decommentare l'apposita riga nel php.ini.

Meglio installare PHP 5 con Apache 1.3.x o Apache 2.x?
Per ora le sole versioni di Apache supportate appartengono al ramo 1.3.x. Questo non significa che abilitando il prefork (http://httpd.apache.org/docs-2.0/mod/prefork.html) o utilizzando PHP CGI o FAST CGI le cose non possano funzionare egregiamente, ma per ora il team PHP sconsiglia l'utilizzo di Apache 2.x in siti di produzione.

Qual è esattamente il codice per inviare una mail in PHP?
Il modo più immediato è sicuramente questo:
<?
mail ("$destinatario", "$soggetto", "$corpo_mesaggio", "From: $tuoemail");
?>

Creare una semplice galleria di immagini in PHP
Menu
* Introduzione
* Iniziamo
* Lo Script per la galleria
* Rivediamo e organizziamo il codice
* Thumbnails
* Conclusioni
Introduzione
L'obiettivo di questo tutorial è quello di dare un'idea su come creare una galleria di immagini dall'inizio alla fine, non che questa sia l'unica via, o la via migliore per creare una galleri adi immagini, ma solo un approccio per poi personalizzarla a vostro piacimento. Per continuare con questo tutorial, è necessario installare sul vostro server il PHP >= 4.3 e le librerie GD 2.
Situazione: avete molte immagini che volete visualizzare in un modo molto semplice, e molte immagini arriveranno in poco tempo. Per visualizzare queste immagini volete impiegare il minor tempo possibile e quando dico minor tempo possibile intendo fare l'upload delle immagini e basta.
Il piano: non viene utilizzato nessun database, utilizzeremo il file system per immagazzinare le immagini. Costruiremo un sistema di categorie, dove ogni cartella sarà una categoria e ogni sotto-cartella sarà una sotto-categoria. Quando visualizzeremo le immagini, saremo in grado di scegliere il numero di immagini da visualizzare contemporaneamente, in questo modo visualizzaremo le immagini in più pagine, ma daremo all'utente anche la possibilità di visualizzare tutte le immagini di una categoria contemporaneamente. Inoltre le thumbnails, verranno create automaticamente utilizzando le librerie GD.
costruire un'interfaccia di amministrazione, è più appropriato farlo come estensione di un pannello di controllo già esistente, in questo modo non sarà necessario effettuare numerosi login per ogni sezione del vostro sito. Per ora pianifichiamo solo le opzioni di upload e di eliminazione delle immagini, via FTP.
La nostra galleria sarà costituita da tre script:
- config.php (contiene le informazioni per la configurazione)
- images.php (visualizza la nostra galleria)
- imgsrc.php (crea le thumbnails)
Iniziamo
Per cominciare, ci serve l'informazione più importante contenuta in un file di configurazione. Questa informazione deve essere modificabile, ma non dinamicamente. Per esempio, dobbiamo conoscere la directory con la quale lavoreremo:
<?PHP
// directory principale delle immagini
define('PATH', '/inetpub/wwwroot/scripts/gallery/images/');
?>
Qualche volta i programmi FTP inseriscono automaticamente files di log alle direcotory che utilizziamo. Per evitare tutto questo ed assicurarci che il nostro script lavori solo con le immagini, definiamo un array di validi tipi di files MIME; dobbiamo utilizzare la funzione serialize(), perchè la funzione define() lavora solo con valori scalari.
<?PHP
// tipi di files MIME validi, tutti gli altri verranno ignorati
define('TYPE', serialize(array('image/jpg', 'image/jpeg', 'image/pjpeg')));
?>
Considerando che visualizzeremo la nostra galleria in una tabella HTML, dobbiamo determinare anche quante immagini vogliamo visualizzare alla volta, impostando il numero massimo di colonne e di righe che poi andranno a comporre la tabella.
<?PHP
// quante righe di immagini da visualizzare per ogni pagina
define('ROWS', 3);
// quante colonne di immagini da visualizzare per ogni pagina
define('COLS', 5);
?>
Poi, dobbiamo impostare le dimansioni delle nostre thumbnails.
<?PHP
// larghezza massima delle thumbnails
define('THMBWIDTH', 100);
// altezza massima delle thumbnails
define('THMBHEIGHT', 100);
?>
Questo è tutto, il nostro primo script (config.php) è concluso..
Lo Script Per La Galleria
Ecco il nostro prossimo script: images.php. Sappiamo già come strutturarlo, perciò l'idea è quella di scrivere una cosa alla volta e poi organizzare le informazioni. In altre parole, l'ultima function che scriveremo, sarà la prima ad essere inserita nello script.
Fino a quando lavoriamo con il file system del database, il nostro primo compito, è quello di acquisire la directory di lavoro dal nostro file di configurazione ed inserire il suo contenuto in un array associativo. La nostra prima riga di codice, includerà il file config.php così avremo accesso al percorso della directory.
<?PHP
require_once('config.php');
?>
Ora ci serve il contenuto della directory di lavoro. Piuttosto che scrivere un pezzo di codice alla volta e spiegarlo, commenterò il codice ed utilizzerò dei nomi per le variabili molto semplici per permettervi di seguire ogni passo. Questa è la nostra funzione directory:
<?PHP
// lettura del contenuto della directory di lavoro
function directory($dir)
{
$mydir = opendir($dir);
while(false !== ($file = readdir($mydir)))
{
if($file != "." && $file != "..")
{
// se il nostro file è una directory, dobbiamo cercare questa directory
if(is_dir($dir.$file))
{
// facendo attenzione al safe mode, quando utilizziamo chdir
// potrebbe generare un avvertimento, così lo spprimiamo utilizzando il carattere @ // prima della funzione
@chdir('.');
// siccome la funzione richiama se stessa, dobbiamo indicizzare
// tutte le sotto-directory con il loro nome
$tree[$file] = directory($dir.$file.'/');
@chdir('..');
}
else
{
$size = getimagesize($dir.$file);
// Se i nostri files passano il controllo della validità del tipo di file,
// li inseriamo nell'array con un numero indicativo
if(in_array($size['mime'], unserialize(TYPE)))
$tree[] = $file;
}
}
}
closedir($mydir);
return $tree;
}
$tree = directory(PATH);
?>
Ora abbiamo un array con l'intera struttura della directory di lavoro. Possiamo facilmente vedere la differenza tra quali elementi sono una directory e quali sono un'immagine, solo osservando l'indice. Il prossimo passo è quello di raffigurare come come determinare ciò che ci viene richiesto. Faremo ciò passando una variabile nella uri che abbiamo chiamato $nav, il valore di $nav cambierà dinamicamente in base a ciò che l'utente ha cliccato.
Piuttosto che scorrere tutto l'array ad ogni richiesta dell'utente, è meglio andare diretamente nel punto richiesto dall'utente. In questo caso, il valore di $nav sarà una lista di elementi che punteranno ad una particolare locazione del nostro array. Per esempio, prendiamo in considerazione questa struttura ad albero:
Array
(
[category one] => Array
(
[0] => img1.jpg
[1] => img2.jpg
[2] => img3.jpg
)
[category two] => Array
(
[sub category] => Array
(
[0] => img4.jpg
[1] => img5.jpg
)
)
)
Se vogliamo visualizzare img4.jpg, il valore di $nav, sarà ['category two']['sub category'][0]. Se vogliamo visualizzare la galleria della prima categoria, il valore di $nav sarà ['category one']. Così facendo possiamo prendere il valore di $nav e richiamarlo all'interno della variabile $tree, per avere esattamente ciò che vogliamo. Quando creeremo i link ipertestuali per la navigazione della galleria, daremo un nuovo valore a $nav dopo ogni click e sarà una stringa come questa: images.php?nav=>category+two>sub+category>0 - In questo modo sapremo sempre ed esattamente dove ci troviamo. NOTA: Utilizzerò l'operatore "?" molte volte, così se non lo conoscete eccovi una spiegazione (altrimenti potete visitare il sito ufficiale php.net per ulteriori informazioni):
<?PHP
$value = (esperssione) ? 'valore se vero' : 'valore se falso';
?>
ritorniamo al nostro progetto:
<?PHP
// impostiamo la navigazione
$nav = isset($_REQUEST['nav']) ? urldecode($_REQUEST['nav']) : null;
if(isset($nav))
{
// dobbiamo eliminare i separatori presenti
$crunch = explode('>', trim($nav));
foreach($crunch as $value)
{
if(!ctype_alnum(str_replace(' ', '', $value)))
$invalid = true;
}
if($invalid)
$nav = null;
}
?>
Fino a quando lavoreremo con i valori $_REQUEST, è importanteessere sicuri che i dati che riceviamo, siano del tipo di dati permessi. Non è possibile garantire che un utente non provi a modificare il percorso, ma è possibile garantire che vengano accettati solo i caratteri alfanumerici. Ora che abbiamo il nostro percorso, dobbiamo inserirlo nel nostro array $tree e dirigere il nostro script dove andare successivamente.
<?PHP
function categories($navtree)
{
// se abbiamo un percorso col quale lavorare...
if(isset($GLOBALS['nav']))
{
// dobbiamo associare il percorso al nostro array
// iniziando a contare da 1 (0 è vuoto)
for($i=1; $i<count($GLOBALS['crunch']); $i++)
$navtree = $navtree[$GLOBALS['crunch'][$i]];

// tra poco studieremo questa funzione
display_body($navtree);
}
else
display_body($navtree);
}
categories($tree);
?>
Sappiamo che se $nav è impostato, allora anche $crunch lo è, così ci risparmiamo il problema di ripetere il codice qui richiamandolo come variabile globale. Notate come colleghiamo il percorso al nostro array utilizzando un riferimento; l'ho realizzato con $array.$elements ma non lavorava come doveva.
La prossima cosa da considerare, è la funzione display_body, che è la più lunga di tutte le funzioni del nostro progetto. Questa funzione necessita di determinare se è stata richiesta una singola immagine, una lista di caegorie oppure una galleria di thumbnails. Ma prima di addentrarci in questo, dobbiamo impostare le variabili appropriate per la nostra galleria multipagina. Questo lo realizziamo aggiungendo una variabile al nostro percorso uri chiamata $pg. Il valore di $pg sarà un numero, che indica in quale pagina ci troviamo, oppure il valore "all" che indica che l'utente vuole visualizzare tutte le immagini di una galleria contemporaneamente.
<?PHP
// decidiamo quale pagina di quale galleria stiamo visualizzando
$pg = isset($_REQUEST['pg']) && (ctype_digit($_REQUEST['pg']) || $_REQUEST['pg'] == 'all') ? $_REQUEST['pg'] : 0;
$viewall = is_numeric($pg) ? null : true;
$pg = intval($pg) <= 0 ? 1 : $pg;
?>
Qui siamo sicuri che $pg avrà sempre un valore numerico allo scopo di evitare problemi matematici nel codice che segue. Se il valore di $pg è "all" dobbiamo solo definire la variabile $viewall come true e convertire $pg in un numero.
<?PHP
// numero di immagini da visualizzare per pagina
$section = ROWS * COLS;
// ultimo punto di fine per le immagini,dipendentemente dalla pagina nella quale ci troviamo
$end = $section * $pg;
// punto di inizio per le immagini,dipendentemente dalla pagina nella quale ci troviamo
$start = $end - $section;
// pagina precedente
$prev = $pg - 1;
// pagina successiva
$next = $pg + 1;
?>
Ora possiamo scrivere i due collegamenti prev e next. La variabile passata, $total, sarà il totale delle immagii con le quali lavoreremo.
<?PHP
function navigator($total)
{
// link alla pagina precedente
$p = '<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav'])
.'&pg='.$GLOBALS['prev'].'"><<</a>';
// link alla pagina successiva
$n = '<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav'])
.'&pg='.$GLOBALS['next'].'">>></a>';
// link alla pagina vedi tutto
$a = '<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav'])
.'&pg=all">view all</a>';

// il navigatore
print('<tr><td align="center" colspan="' . COLS . '">');

if(($GLOBALS['pg'] == 1 && $GLOBALS['end'] >= $total) || isset($GLOBALS['viewall']))
print('<< : view all : >>');
elseif($GLOBALS['pg'] == 1)
print('<< : '.$a.' : '.$n);
elseif($GLOBALS['end'] < $total)
print($p.' : '.$a.' : '.$n);
else
print($p.' : '.$a.' : >>');

print('</td></tr>');
}
?>
La funzione navigator, deve fare qualche calcolo per determinare quali links è appropriato visualizzare in base a quante pagine di immagini abbiamo. Questo lo abbiamo inserito in una funzione nel caso che volessiamo avere il nostro navigatore in più punti della pagina, ad esempio sopra e sotto la galleria di immagini.
<?PHP
// visualizziamo i collegamenti alle categorie e alle immagini
function display_body($navtree)
{
if(isset($GLOBALS['nav']))
{
// ci serve il percorso come una directory per visualizzare le immagini
for($i=1; $i<count($GLOBALS['crunch']); $i++)
$uri .= !is_numeric($GLOBALS['crunch'][$i]) ? $GLOBALS['crunch'][$i].'/' : '';
}

// se abbiamo un array, allora la nostra richiesta sarà o una
// categoria di links o una galleria di immagini
if(is_array($navtree))
{
// qui combiniamo tutte le chiavi del nostro array in una stringa
// se non contiene un valore numerico allora abbiamo
// delle categorie da visualizzare
if(!is_numeric(implode('', array_keys($navtree))))
{
print('<tr><td>');
foreach($navtree as $key=>$value)
{
if(!is_int($key))
{
// se il valore della nostra categoria è un array, allora
// creeremo un link indietro allo script delle immagini e
// assegneremo a $nav il valore appropriato
if(is_array($value))
print('<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav']
.'>'.$key).'">'.$key.'</a><br />');
else // se la categoria è vuota, il link non serve
print($key.'<br />');
}
}
print('</td></tr>');
}
else
{
// se non stiamo lavoriamo con le categorie, allora stiamo
// lavorando con le immagini, perciò decidiamo quante
// righe visualizzare (dipende se $viewall è true o false)
$total = count($navtree);
if(isset($GLOBALS['viewall']))
{
$check = $total / COLS;
$rows = is_int($check) ? $check : floor($check) + 1;
}
else
$rows = ROWS;

// visualizziamo il nostro navigatore
navigator($total);
// iniziamo a visualizzare il contenuto della tabella
for($i=0; $i<$rows; $i++)
{
print('<tr>');
for($n=0; $n<COLS; $n++)
{
$index = $GLOBALS['start']++;
// vogliamo o il nome del file dell'immagine, oppure
// uno spazio vuoto per riempire il resto della tabella
$image = $index < $total ? $navtree[$index] : ' ';
print('<td align="center" width="'.THMBWIDTH.'" height="'.THMBHEIGHT.'">');
if($image != ' ')
{
// questo link fornisce l'esatto percorso
// dell'immagine che vogliamo visualizzare
print('<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav']
.'>'.$index).'">');

// il tag img crea la chiamata al nostro prossimo
// script, imgsrc.php, il quale viene richiamato
// con l'intero percorso della directory dell'immagine
print('<img src="imgsrc.php?src='.PATH.rawurlencode($uri).$image.'" border="0" />');
print('</a>');
}
else // se l'immagine non esiste, visualizza uno spazio
print($image);

print('</td>');
}
print('</tr>');
}
// visualizza un altro navigatore
navigator($total);
}
}
elseif(file_exists(PATH.$uri.$navtree))
{
// se $navtree non è un array, allora dobbiamo richiamare direttamente
// un'immagine, prima controlleremo se il file esiste
// ora abbiamo il percorso appropriato per visualizzare
// l'immagine
$root = explode('/', dirname(PATH.'.'));
print('<tr><td><img src="'.end($root).'/'.$uri.$navtree.'"></td></tr>');
}
else // niente array e niente file = richiesta non valida
print('<tr><td>invalid request</td></tr>');
}
?>
Se studiate bene il codice, l'intero script inizierà ad avere un senso, specialmente dove creiamo i links e assegnamo a $nav l'appropriato valore. Come avrete sicuramente notato in questa sezione, codifichiamo sempre i dati prima di inviarli, e li decodifichiamo quando vengono richiesti. abbiamo utilizzato molte funzioni del PHP e se volete avere maggiori informazioni su di esse, visitate il sito ufficiale scrivendo questo indirizzo: www.php.net/il_nome_della_funzione_che_volete_conoscere
L'ultimo script che ci serve, è imgsrc.php, il quale crea le nostre thumbnails in base al percorso che inviamo tramite la variabile $src come abbiamo già visto nella funzione display_body. Prima di addentrarci in questo script, voglio rivedere quello che abbiamo fatto fino ad ora e mostrarvi com'è organizzato il file images.php.
Rivediamo Ed Organizziamo Il Codice
Il primo script creato è il config.php:
<?php
// directory principale dele immagini
define('PATH', '/inetpub/wwwroot/scripts/gallery/images/');
// i files MIME validi tutti gli altri verranno ignorati
define('TYPE', serialize(array('image/jpg', 'image/jpeg', 'image/pjpeg')));
// Quante righe di immagini da visualizzare per pagina
define('ROWS', 3);
// Quante colonne di immagini da visualizzare per pagina
define('COLS', 5);
// larghezza massima delle thumbnail
define('THMBWIDTH', 100);
// altezza massima delle thumbnail
define('THMBHEIGHT', 100);
?>
Il secondo script creato, è images.php, è stato creato passo per passo. Il seguente codice è il nostro intero script; notate che ho eliminato molti commenti e che ho inserito i tag di apertura e di chiusura delle tabelle.
<?php
require_once('config.php');
// il navigatore
$nav = isset($_REQUEST['nav']) ? urldecode($_REQUEST['nav']) : null;
if(isset($nav))
{
$crunch = explode('>', trim($nav));
foreach($crunch as $value)
{
if(!ctype_alnum(str_replace(' ', '', $value)))
$invalid = true;
}
if($invalid)
$nav = null;
}
// decidiamo quale pagina di quale particolare galleria stiamo visualizzando
$pg = isset($_REQUEST['pg']) && (ctype_digit($_REQUEST['pg']) || $_REQUEST['pg'] == 'all') ? $_REQUEST['pg'] : 0;
$viewall = is_numeric($pg) ? null : true;
$pg = intval($pg) <= 0 ? 1 : $pg;
// immagini per pagina
$section = ROWS * COLS;
// ultimo punto di fine per le immagini,dipendentemente dalla pagina nella quale ci troviamo
$end = $section * $pg;
// punto di inizio per le immagini,dipendentemente dalla pagina nella quale ci troviamo
$start = $end - $section;
// pagina precedente
$prev = $pg - 1;
// pagina successiva
$next = $pg + 1;
// inizio tabella
print('<table border="0" align="center" cellpadding="1" cellspacing="1">');
// creiamo i link alla pagina precedente e successiva
function navigator($total)
{
$p = '<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav'])
.'&pg='.$GLOBALS['prev'].'"><<</a>';
$n = '<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav'])
.'&pg='.$GLOBALS['next'].'">>></a>';
$a = '<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav'])
.'&pg=all">view all</a>';
// il navigatore
print('<tr><td align="center" colspan="' . COLS . '">');
if(($GLOBALS['pg'] == 1 && $GLOBALS['end'] >= $total) || isset($GLOBALS['viewall']))
print('<< : view all : >>');
elseif($GLOBALS['pg'] == 1)
print('<< : '.$a.' : '.$n);
elseif($GLOBALS['end'] < $total)
print($p.' : '.$a.' : '.$n);
else
print($p.' : '.$a.' : >>');
print('</td></tr>');
}
// lettura del contenuto della directory di lavoro
function directory($dir)
{
$mydir = opendir($dir);
while(false !== ($file = readdir($mydir)))
{
if($file != "." && $file != "..")
{
if(is_dir($dir.$file))
{
chdir('.');
$tree[$file] = directory($dir.$file.'/');
chdir('..');
}
else
{
$size = getimagesize($dir.$file);
if(in_array($size['mime'], unserialize(TYPE)))
$tree[] = $file;
}
}
}
closedir($mydir);
return $tree;
}
$tree = directory(PATH);
// visualizziamo i link delle categorie e delle immagini
function display_body($navtree)
{
if(isset($GLOBALS['nav']))
{
// ci servirà il percorso delle immagini sistemato come una directory
for($i=1; $i<count($GLOBALS['crunch']); $i++)
$uri .= !is_numeric($GLOBALS['crunch'][$i]) ? $GLOBALS['crunch'][$i].'/' : '';
}

if(is_array($navtree))
{
if(!is_numeric(implode('', array_keys($navtree))))
{
print('<tr><td>');
foreach($navtree as $key=>$value)
{
if(!is_int($key))
{
if(is_array($value))
print('<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav']
.'>'.$key).'">'.$key.'</a><br />');
else
print($key.'<br />');
}
}
print('</td></tr>');
}
else
{
// decidiamo quante righe visualizzare
$total = count($navtree);
if(isset($GLOBALS['viewall']))
{
$check = $total / COLS;
$rows = is_int($check) ? $check : floor($check) + 1;
}
else
$rows = ROWS;

navigator($total);
for($i=0; $i<$rows; $i++)
{
print('<tr>');
for($n=0; $n<COLS; $n++)
{
$index = $GLOBALS['start']++;
$image = $index < $total ? $navtree[$index] : ' ';
print('<td align="center" width="'.THMBWIDTH.'" height="'.THMBHEIGHT.'">');
if($image != ' ')
{
print('<a href="'.$_SERVER['PHP_SELF']
.'?nav='.rawurlencode($GLOBALS['nav']
.'>'.$index).'">');
print('<img src="imgsrc.php?src='
.PATH.rawurlencode($uri).$image.'" border="0" />');
print('</a>');
}
else
print($image);

print('</td>');
}
print('</tr>');
}
navigator($total);
}
}
elseif(file_exists(PATH.$uri.$navtree))
{
$root = explode('/', dirname(PATH.'.'));
print('<tr><td><img src="'.end($root).'/'.$uri.$navtree.'"></td></tr>');
}
else
print('<tr><td>invalid request</td></tr>');
}
// navighiamo nelle categorie appropriate
function categories($navtree)
{
if(isset($GLOBALS['nav']))
{
for($i=1; $i<count($GLOBALS['crunch']); $i++)
$navtree = &$navtree[$GLOBALS['crunch'][$i]];

display_body($navtree);
}
else
display_body($navtree);
}
categories($tree);
// chiusura tabella
print('</table>');
?>
Thumbnails
L'ultima parte del nostro progetto, è composta dallo script imgsrc.php. Questo script viene richiamato con l'intero percorso di un'immagine, tramite la variabile $src, e restituirà in output la thumbnail di quell'immagine facendo riferimento alle dimensioni che abbiamo inserito nel file config.php.
<?php
require_once('config.php');
$src = isset($_REQUEST['src']) ? urldecode($_REQUEST['src']) : null;
// utilizziamo la funzione file_exists per prevenire lavori con files remoti
if(isset($src) && file_exists($src))
{
header('Content-Type: image/jpeg');
list($width, $height, $type, $attr) = getimagesize($src);
$img = imagecreatefromjpeg($src);
$lowest = min(THMBWIDTH / $width, THMBHEIGHT / $height);
if($lowest < 1)
{
$smallwidth = floor($lowest*$width);
$smallheight = floor($lowest*$height);
$tmp = imagecreatetruecolor($smallwidth, $smallheight);
imagecopyresized($tmp, $img, 0, 0, 0, 0, $smallwidth, $smallheight, $width, $height);
imagedestroy($img);
$img = $tmp;
}
imagejpeg($img, '', 100);
imagedestroy($img);
}
?>
Conclusioni
Abbiamo creato una completa e funzionale galleria di immagini. Basta solo inserire i tre files nella stessa directory e impostare il file config.php. Ci sono molte cose da notare. Questo progetto, presuppone che tutte le immagini appartengano ad una particolare categoria, perciò avere delle immagini nella stessa directory che contiene sotto-directory potrebbe non dare i risultati voluti. Nei miei test, sono state ignorate le immagini e visualizzate le sotto-categorie.
Consigli:
* nel file imgsrc.php, è possibile trarre vantaggio dal secondo argomento della funzione imagejpeg e copiare automaticamente cosìle thumbnail nella directory di vostra scelta, poi controllate se la thumbnail esiste ed utilizzate la funzione readfile() per visualizzarla se necessario.
* se programmate di creare un pannello di controllo per questo script per effettuare l'upload delle immagini e per eliminarle, vi consiglio i utilizzare lo schema esistente piuttosto che riscrivere il codice. Per esempio, se un amministratore è collegato, basta solo modificare il codice per visualizzare una casella di controllo (check box) per l'eliminazione a fianco della categoria e dell'immagine e inserire due campi vicino alle categorie per effetuare l'upload o per crearne delle nuove. Ovviamente le directory vuote, per gli utenti non vengono visualizzate con il loro collegamento, ma possono essere visualizzate col loro collegamento solo per gli admin per permettere loro di modificarle.

Creiamo un menù dinamico
Vediamo come creare un menu dinamico con php.
Per ora, la funzione non può essere interfacciata con alcun database, in futuro vedrò se implementare anche l'utilizzo di database (MySQL).
Cominciamo ad analizzare un pò il codice.
Per prima cosa creiamo i vari links da visualizzare nel nostro menu:
$nav[] = array("Homepage", "index.php");
$nav[] = array("Links", "links.php");
$nav[] = array("Contatti", "contatti.php");
Come si nota, per creare le sezioni da visulizzare nel menu usiamo gli array().
Per aggiungere una sezione basta copiare una delle stringhe e modificare il nome della sezione e il links.
Il nome della sezione, ovviamente, può anche essere una immagine e il suo collegamento può avere anche QueryString.
Vediamo ora il codice della funzione, ossia quello che ci permette di visualizzare il menu.
for ($id = 0; $id <= count($GLOBALS["nav"]) - 1; $id++)
{
$testo = $GLOBALS["nav"][$id][0];
$pagina = $GLOBALS["nav"][$id][1];
if ($pagina == basename($_SERVER['PHP_SELF']))
{
echo "<strong>$testo</strong><br />\n";
}
else
{
echo "<a href=\"$pagina\">$testo</a><br />\n";
}
}
Analiziamo ora queste stringhe.
Come vedete per visualizzare tutti i links usiamo il ciclo for().
Passiamo ora all'analizzazione delle due variabili presenti nel code: la variabile $testo , ci serve per prelevare il nome della sezione e la variabile $pagina , per prelevare il collegamento.
Vediamo anche che è presente un if che ci serve per vedere l'indirizzo della pagina, nel caso sia uguale a quello presente in uno degli array non visualizza il collegamento ipertestuale nel caso opposto sì.
Come ultima cosa vediamo come mostrare il menu:
Navigation ();
Beh... c'è davvero poco da dire...
In quel modo si chiama la funzione.
Ecco il codice completo:
<?php
$nav[] = array("Homepage", "index.php");
$nav[] = array("Links", "links.php");
$nav[] = array("Contatti", "contatti.php");
function Navigation()
{
for ($id = 0; $id <= count($GLOBALS["nav"]) - 1; $id++)
{
$testo = $GLOBALS["nav"][$id][0];
$pagina = $GLOBALS["nav"][$id][1];
if ($pagina == basename($_SERVER['PHP_SELF']))
{
echo "<strong>$testo</strong><br />\n";
}
else
{
echo "<a href=\"$pagina\">$testo</a><br />\n";
}
}
}

Navigation();
?>

Creare un guestbook
vedremo come costruire un libro degli ospiti, meglio conosciuto come Guestbook.
Cominciamo con l'aprire il nostro editor e a salvare il primo file, chiamandolo config.php e inserendoci questo codice:
<?php
$msg_per_page = 5;
$mysql['host'] = "";
$mysql['pass'] = "";
$mysql['user'] = "";
$mysql['name'] = "";
@mysql_connect($mysql['host'], $mysql['user'], $mysql['pass']);
@mysql_select_db($mysql['name']);
?>
La prima variabile, $msg_per_page, ci serve per indicare il numero di messaggi che si vogliono visualizzare per ogni pagina; ovviamente, il numero è arbitrario, ma lasciatevi dare un consiglio... non alzate troppo la cifra altrimenti chi non ha connessioni veloci potrebbe aver difficolt? alla visualizzazione della pagina.
La seconda variabile, $mysql, è un array, e ci serve per indicare i dati del nostro database MySQL.
In questo file non sono presenti altre variabili, ma già incontriamo due funzioni: mysql_connect() e mysql_select_db().
Come è facile intuire le due funzioni sono legate a MySQL, infatti, la prima serve per la connessione al server e la seconda per selezionare il database che si vuole usare.
Passiamo ora alla creazione della tabella nel database MySQL.
Aprire un nuovo documento vuoto e inserire all'intorno questo codice:
<?php
require("config.php");
@mysql_query("DROP TABLE IF EXISTS gbook");
@mysql_query("CREATE TABLE gbook (
`id` INT(11) DEFAULT '0' NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`url` VARCHAR(255),
`messaggio` TEXT NOT NULL,
`ip` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);");
echo "Operazione avvenuta con successo !!\n";
@mysql_close();
?>
Non ci sono variabili ma sono presenti due query al database, la prima ci serve per cancellare la tabella se esiste già, la seconda per crearla.
Fatte attenzione, la tabella che serve a noi, si chiama "gbook", e se esiste già verrà cancellata e tutti i dati presenti verrano cancellati e non saranno recuperabili in alcun modo.
Dopo aver visto la parte di configurazione, cominciamo ad entrare nel vivo dell'applicazione.
Ora, aprire un nuovo documento vuoto e salvarlo come: leggi.php ed ecco il codice che dovrà contenere:
<?php
require("config.php");
$count_mess = @mysql_query("SELECT COUNT(id) FROM gbook");
$res_count = @mysql_fetch_array($count_mess);
if ($res_count[0] == FALSE) {
echo "Nessun messaggio ? stato inserito nel database";
} else {
$tot_pages = ceil($res_count[0]/$msg_per_page);
$curr_page = (!$_GET['page']) ? 1 : (int)$_GET['page'];
$primo = ($curr_page - 1) * $msg_per_page;

$query = mysql_query("SELECT * FROM gbook ORDER BY id DESC LIMIT $primo,$msg_per_page");
while($result = mysql_fetch_array($query)) {
$result['messaggio'] = str_replace("\n", "<br>", $result['messaggio']);
echo " <strong>? Nome:</strong> " . $result['nome'] . "<br>\n";
echo " <strong>? E-Mail:</strong> <a href=\"mailto:" . $result['email'] . "\">" . $result['email'] . "</a><br>\n";
echo " <strong>? URL:</strong> <a href=\"" . $result['url'] . "\">" . $result['url'] . "</a><br>\n";
echo " <strong>? Messaggio:</strong><br> " . $result['messaggio'] . "\n";
echo " <hr>\n";
}
for($page = 1; $page <= $tot_pages; $page++) {
if($page == $curr_page) {
$pag .= "<strong>$page</strong> ";
} else {
$pag .= "<a href=\"?page=$page\">$page</a> ";
}
}
echo $pag . "<br>\n";
}
echo "<a href=\"firma.php\">Firma il Guestbook</a>";
@mysql_close();
?>
Questo file servirà per visualizzare tutti i messaggi degli utenti.
Le prime due variabili, $count_mess e $res_count, ci serviranno per impaginare correttamente i messaggi presenti nel database.
Appena dopo queste due variabili ci troviamo davanti ad un if(), questo controllo ci è utile per vedere se sono presenti o meno messaggi nel database, se ce ne sono li stampa a video, in caso contrario viene fuori un messaggio di allerta.
Ora incontriamo tre variabile, che, anchesse servono per l'impaginazione dei messaggi.
Ed ecco finalmente che arriviamo alla parte 'importante' dello script.
Incontriamo subito la variabile $query che, tramite la funzione mysql_query() di php ci permette di inviare un 'comando' al database.
Subito dopo si nota un ciclo while() che serve per stampare a video il tutto.
Infine, stampiamo a video tutte le pagine tramie un ciclo for() e chiudiamo la connessione al database MySQL.
Nell'articolo precedente abbiamo visto come leggere i messaggi presenti nel database, ora vedremo come inserirli.
Creiamo un file chiamato firma.php e inseriamoci questo codice:
<?php
require("config.php");
if ($_POST['sign'] == FALSE) {
echo " <form action=\"firma.php\" method=\"POST\">\n";
echo " <strong>- Nome *</strong> <input type=\"text\" name=\"nome\"><br>\n";
echo " <strong>- E-Mail *</strong> <input type=\"text\" name=\"email\"><br>\n";
echo " <strong>- URL</strong> <input type=\"text\" name=\"url\"><br>\n";
echo " <strong>- Messaggio *</strong> <textarea name=\"messaggio\" cols=\"35\" rows=\"10\"></textarea><br>\n";
echo " <input type=\"hidden\" name=\"sign\" value=\"true\">\n";
echo " <input type=\"submit\" value=\" Firma! \">\n";
echo " </form>\n";
} else {
@mysql_query("INSERT INTO gbook (`id`, `nome`, `email`, `url`, `messaggio`, `ip`)
VALUES ('', '" . $_POST['nome'] . "',
'" . $_POST['email'] . "',
'" . $_POST['url'] . "',
'" . $_POST['messaggio'] . "',
'" . $_SERVER['REMOTE_ADDR'] . "');");
echo "Grazie per aver firmato il nostro Guestbook<br>";
echo "<a href=\"leggi.php\">Leggi i messaggi</a>\n";
}
@mysql_close();
?>
In questa parte del codice salta subito agli occhi che c'è un if(), che serve per controllare se una variabile è esistente o meno.
In caso positivo, inserisce il messaggio nel database tramite una query con la funzione mysql_query(), altrimenti visualizza il form.

MySQL: Ricerca full-text in un database MySQL
La differenza
Noi ci concentreremo appunto sull'ultimo metodo di ricerca. Le differenze tra i vari metodi sono numerose, ma per quale motivo usare una ricerca full-text?
La ricerca full-text possiede numerosi vantaggi: per prima cosa è migliore a livello di prestazioni (consente ricerche più veloci), e poi consente ricerche molto precise ordinando anche i risultati in base al grado di attinenza con la ricerca, in parole povere pesa i risultati. Per comprendere meglio l'utilità della ricerca full-text proviamo a pensare a Google. Quando si effettua una ricerca con Google i risultati vengono mostrati in base al grado di attinenza con la parola cercata. Questo è proprio quello che la ricerca full-text permette di fare.
La ricerca full-text si basa su indici, il che significa che la ricerca viene svolta duplicemente: innanzitutto MySQL ricerca il termine nell'indice e poi esegue la ricerca vera e propria. Per chiarire questo concetto provate a pensare di dover cercare in uno stradario di una qualche città "via Milano 54". Una ricerca condotta in modo classico inizierebbe a sfogliare tutte le carte dello stradario analizzandole fino a trovare la via desiderata. Una ricerca full-text invece per prima cosa va a consultare l'indice. Qui trova la via desiderata corredata dalle informazioni per localizzarla sulle carte. Con tali informazioni estrae poi la carta esatta. Si capisce bene che in questo modo la ricerca è molto più veloce ed efficiente. E' stato verificato che su un database di 100MB una ricerca di tipo full-text si dimostra circa 8/10 volte più veloce di una ricerca libero (con "LIKE").
Precisazioni iniziali
Bisogna precisare fin dall'inizio che la ricerca full-text è possibile solo su campi di testo, quindi CHAR, VARCHAR, TEXT ecc... Inoltre è possibile solo a condizione che sia stato creato un full-text index. L'indice full-text può essere creato al momento della creazione della tabella o anche su una tabella esistente. Per aggiungere l'indice ad una tabella esistente si può fare:
ALTER TABLE nomeTabella ADD FULLTEXT(primoCampo, secondoCampo, terzoCampo, ...);
Se invece si deve creare una nuova tabella l'indice si può creare ugualmente aggiungendo FULLTEXT:
CREATE TABLE nomeTabella (
primoCampo INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
secondoCampo VARCHAR(200),
terzoCampo TEXT,
FULLTEXT (secondoCampo, terzoCampo)
);
Ovviamente dentro FULLTEXT() bisogna inserire tutti i campi su cui creare l'indice full-text separati da una virgola ",".
E' doveroso ricordare inoltre che la ricerca full-text è possibile solo dalla versione 3.23.23 e successive di MySQL.
Query di ricerca
Vediamo come usare la ricerca full-text. Se ad esempio vogliamo cercare la parola "milano" nei campi "indirizzo", "nome", "descrizione" della tabella "locali" del nostro database, potremmo usare la seguente query:
SELECT * FROM locali WHERE MATCH(indirizzo, nome, descrizione) AGAINST('milano')
La sequenza di comandi MATCH() ... AGAINST() restituisce il valore di attinenza del risultato con il testo cercato (numero in floating-point compreso tra 0 e 10). Quindi, considerando che la clausola WHERE per essere verificata deve avere valore booleano "true", se il risultato in questione ha attinenza 0 su 10, ovvero non ha nessuna attinenza, viene scartato. Vengono quindi selezionati solo quei risultati con attinenza maggiore di 0. Questa query tuttavia non ha grande utilità, in quanto non ordina i risultati secondo la loro attinenza, nè tantomeno restituisce il valore di essa. Potremmo modificare la query in modo che ordini i risultati per attinenza e restituisca il valore della stessa riga per riga:
SELECT *, MATCH(indirizzo, nome, descrizione) AGAINST('milano') AS attinenza FROM locali WHERE MATCH(indirizzo, nome, descrizione) AGAINST('milano') ORDER BY attinenza DESC
In questo modo vengono restituiti tutti i campi e in più anche il valore dell'attinenza del risultato rispetto alla parola "milano", e le righe vengono ordinate da quella con più attinenza a quella che ne ha meno.
Possiamo anche fare la ricerca di tutti quei risultati che hanno parole che iniziano o terminano per "milano". Ciò si ottiene con il carattere jolly "*", che indica qualsiasi lettera. Quindi:
AGAINST("milano*") // cerca tutti i record con parole che iniziano per "milano"
AGAINST("*milano") // cerca tutti i record con parole che terminano per "milano"
Ricerca di concetti: il boolean mode
A partire dalla versione 4.0.1 di MySQL e successive è possibile combinare alla ricerca full-text il boolean mode: in parole povere è possibile effettuare ricerche con operatori booleani come si può fare con i motori di ricerca.
Facciamo un esempio pratico: se volessimo fare una ricerca come la precedente, cercando per tutti i risultati in cui compaia la parola "milano" ma contemporaneamente non compaia la parola "roma", potremmo usare una query di questo tipo:
SELECT *, MATCH(indirizzo, nome, descrizione) AGAINST('+milano -roma' IN BOOLEAN MODE) AS attinenza FROM locali WHERE MATCH(indirizzo, nome, descrizione) AGAINST('+milano -roma' IN BOOLEAN MODE) ORDER BY attinenza DESC
Come si può notare è stata aggiunta la clausola "IN BOOLEAN MODE" all'interno di AGAINST e sono stati aggiunti anche gli operatori booleani + e - all'interno del testo da cercare. Vediamo quali sono alcuni dei casi possibili per il testo di ricerca:
* 'milano roma': deve essere presente uno dei due termini
* '+milano +roma': devono essere presenti entrambi i termini
* '+milano roma': deve essere presente "milano" ed eventualmente "roma".
* '+milano -roma': deve essere presente "milano" ma non "roma"
* '+milano +(<roma >venezia)': devono essere presenti o "milano" e "roma" o "milano" e "venezia", ma i records con "milano" e "venezia" hanno rilevanza maggiore. ("<" indica minore rilevanza, ">" indica maggiore rilevanza)
* '"milano roma"': deve essere presente l'esatta sequenza "milano roma".