Il primo sito

La prima domanda che ci si pone prima di realizzare un sito è "Quali strumenti occorrono?"
e spesso, preoccupati, pensando a quello che occorre, facciamo subito il conto con le nostre finanze.
Molti rinunciano in quanto ritengono che per realizzare un sito web occorra sborsare centinaia di euro, e forse in parte è anche vero, ma ci sono strumenti fantastici completamente gratuiti che vi consentono di realizzare il vostro sito web a costo zero!
La prima cosa che occorre è un Editor Web dove poter scrivere Html o almeno dove poter creare il vostro sito.
In pratica è il supporto principale senza il quale realizzare un sito sarebbe impossibile.
Se avete pazienza e voglia di imparare, basterà il Blocco Note di Windows e, una volta imparati i fondamentali di Html lo troverete di una praticità estrema in quanto poi, cosa non ultima, non sporca il codice, anzi, lo mantiene integro da qualsiasi intrusione.
Se invece volete un Web Editor professionale completamente gratis, potrete scaricare SoThink che non ha nulla da invidiare al più blasonato e costoso Front Page di Microsoft.
Parlando di grafica poi, il gratis regna sovrano! Un esempio di programma di grafica è GIMP
Se poi cercate gif particolari, basta che utilizzate i Motori di Ricerca per trovare quello che cercate... senza nessun problema.
Realizzare un sito non è poi così costoso, anzi, è completamente gratuito!
Una volta stabiliti quali saranno i contenuti del sito, la prima cosa da fare è creare una mappa in modo da avere la struttura gerarchica del sito stesso.
La mappa del sito consiste in una specie di diagramma piramidale dove al vertice troviamo la Home Page, la pagina principale del sito, collegata alle altre pagine interne poste più in basso.
Per creare una mappa non occorrono software particolari, anzi, non occorre il computer, ma ci serviremo di un foglio di carta con una penna... tutto qui.
Procedete come segue per creare la vostra mappa:
cercate per prima cosa di radunare i contenuti del sito per tematiche, ovvero, raggruppate tutti quei contenuti che hanno qualche cosa in comune tra loro.
Se per esempio il vostro sito parla della vostra città, sicuramente inserirete una sezione Svago, ovvero, la segnalazione di tutti quei posti da visitare per svagarsi e per divertirsi.
Scrivete dunque su un foglio di carta Svago e sotto scrivete, cinema, teatri, pub, discoteche... e così via:
Svago
Cinema
Teatri
Pub
Discoteche

Scrivendo in questo modo, senza volerlo avete creato anche un menu di navigazione...
Inoltre avete creato una categoria primaria con incluse delle categorie secondarie.
Continuate così cercando, come visto, di raggruppare i contenuti per tematiche in modo che alla fine avrete uno schema completo di quello che saranno i contenuti del vostro sito.
Fatto questo ora procediamo a creare la mappa.
Per prima cosa realizziamo lo schema, sempre utilizzando carta e penna:
Schema del sito web

Ecco come dovrebbe presentarsi la vostra mappa una volta che avete deciso e raggruppato i contenuti.
Questo sistema vi agevolerà non poco il lavoro di realizzazione del sito e vi permetterà di non commettere errori di gestione, anzi, vi aiuterà in seguito ad aggiornare il sito espandendolo con nuove sezioni e nuovi contenuti.
L'errore che molti webmaster fanno è quello di cominciare a realizzare un sito senza un minimo di organizzazione, tenendo conto solamente di quelli che sono i contenuti attuali senza pensare agli aggiornamenti futuri e quindi senza una programmazione del lavoro.
Una buona organizzazione vi consente di pianificare il vostro sito nel tempo tenendo conto degli aggiornamenti futuri e quindi, senza incorrere in errori e rifacimenti completi del sito.
Strana parola... ma cosa significa?
Lo storyboard di un sito rappresenta lo schema grafico di come verrà visualizzato il sito in video.
Per essere più chiari attraverso lo storyboard è possibile creare una bozza della grafica finale del sito, sia della home page sia delle pagine interne.
Per realizzare lo storyboard abbiamo bisogno di carta e penna e magari di un righello per tracciare linee precise.
Abbiamo a portata di mano la nostra mappa e tutti i contenuti del sito, ora si tratta solo di raggrupparli in maniera grafica, così da creare la nostra home page.
Ecco un esempio di come potrebbe essere uno storyboard:
Storyboard
In pratica si tratta di creare una struttura grafica che ospiti tutti i contenuti del sito, comprese le sezioni. E' come realizzare una brutta copia del sito stesso.
Il consiglio è quello di creare due storyboard, uno per la home page e uno per le pagine interne. Attraverso questo strumento noterete una facilità estrema nella realizzazione grafica del vostro sito senza imbattervi in titubanze o incertezze in quanto queste le avete lasciate tutte sul foglio di carta che ospita il vostro storyboard.
Oltre a organizzare i contenuti del sito, esiste un altra organizzazione non meno importante riferita alle cartelle.

Creare delle cartelle
dove inserire i contenuti agevola di gran lunga il lavoro della realizzazione vera e propria in quanto ordina tutti i contenuti del sito e tutte le pagine in modo che, dovendo fare una modifica, non dovrete impazzire a cercare la pagina nel marasma generale.
Non fate l'errore di lasciare sia immagini sia le pagine nella cartella principale del sito in quanto, con l'espandersi dei contenuti, il caos regnerà sovrano!
La prima cartella da creare nella cartella principale del sito è quella che dovrà contenere le immagini in modo da dividere queste da tutto il resto del contenuto.
Create subito questa cartella e nominatela Images oppure Immagini. Salvate al suo interno tutte le immagini che andrete ad utilizzare nelle vostre pagine.
Una volta salvate per trovarle, basterà che digitiate il percorso:
cartella_sito/images/immagine.gif
oppure
../images/immagine.gif
dove i puntini rappresentano la cartella principale del sito.
Ora create altre cartelle relative alle sezioni principali del vostro sito.
Se avete letto la lezione relativa alla mappa, create per esempio la cartella Svago dove al suo interno, inserirete tutte le pagine relative a questa sezione.
Anche questo vuol dire organizzare i contenuti del sito.
L'utilizzo delle immagini nel web è una cosa fantastica, ma basta non abusarne troppo!
Dovete sempre tener presente che se voi navigate con l'Adsl a velocità ultrasonica, ci sono utenti che ancora navigano con computer datati e magari con modem a 56K ai quali non vorrete negare la possibilità di visitare il vostro sito spero!
Utilizzate le immagini con parsimonia e solo se e dove è necessario evitando inutili appesantimenti delle pagine.
I formati immagine da utilizzare sono:

JPG
utilizzato soprattutto per le fotografie in quanto, pur se compresso, mantiene inalterata la nitidezza.
GIF
utilizzato per banner o piccole immagini anche animate. Una caratteristica di questo formato è la trasparenza, ovvero la possibilità di adattare il proprio sfondo con lo sfondo della pagina.
A volte un'immagine parla più di un testo. Tutto vero, ma accompagnare l'immagine con il testo parla ancora di più, quindi, non utilizzate solamente immagini per esprimere dei concetti che a voi sembrano scontati in quanto per altri potrebbero non essere tali.
Cercate di esprimere i concetti accompagnando l'immagine con del testo per esprimere chiarezza nei vostri concetti.
Se non volete utilizzare del testo, una soluzione potrebbe essere quella di allegare un testo all'immagine che viene visualizzato quando un utente posiziona il mouse sopra l'immagine stessa.
Vediamo come creare questo effetto utile, ricorrendo all'attributo Alt:
<img src="../images/immagine.gif"
alt="testo da visualizare">
Girando per il web a volte ci imbattiamo in siti molto scenografici, con una Home Page che somiglia molto di più ad una presentazione cinematografica.
In questi casi viene utilizzato il programma di grafica Flash che crea appunto questa fantastiche animazioni web.
La prima cosa da dire è che spesso vengono realizzate queste Home Page per dimostrare la bravura del webmaster, e solo per questo in quanto, per accedere a un sito non è possibile visionare una sorta di cartone animato e, anche se si clicca su Skip Intro, una buona parte, volenti o nolenti, la si deve sempre vedere.
La seconda cosa è che per visualizzare i contenuti di un sito gli utenti non devono cliccare mille volte, ma deve essere tutto a portata di clic immediato, ovvero, devono raggiungere i contenuti cliccando meno volte possibile e queste pagine scenografiche non agevolano questo.
La terza cosa è che i Motori di Ricerca non leggono queste schizzofrenie grafiche e quindi sarà difficile vedere un sito che utilizza queste tecnologie tra i primi posti nelle ricerche.
La quarta cosa è che queste pagine vengono visualizzate solamente da utenti con pc potenti, creando una sorta di discriminazione visiva e perdendo un gran numero di utenti impossibilitati a visionare il sito.
Ultima cosa è che per visionare queste animazioni occorre scaricare un plugin altrimenti non si vede nulla, e non tutti sono disposti a farlo.
Scarichereste un plugin appositamente per vedere questo sito? Fatevi questa domanda e datevi una risposta!
La semplicità per prima cosa e la velocità di caricamento per seconda. Ricordatevelo bene!
La scelta dei colori ricopre un ruolo fondamentale nelle buone sorti di un sito. La varietà e le sfumature sono infinite e spesso scegliere è una cosa ardua e certamente non immediata.
Anche questa scelta, come le altre, và ponderata stando attenti a non creare troppi contrasti forti tra una tonalità e l'altra.
Il consiglio è quello di utilizzare non più di tre colori e possibilmente, almeno due di loro, uno che sia il gradiente dell'altro.
Ecco un esempio di quello che intendo dire:

#666699 #DDDDE8 #F1F1F5

In questo esempio ho utilizzato un colore di base che è il primo a sinistra, e due gradienti dello stesso.
L'abbinamento tra il colore di sfondo e il testo è un abbinamento delicato da comporre in quanto il testo, se pur presente un colore di sfondo, deve essere sempre chiaro e leggibile senza che gli utenti si debbano sforzare troppo per leggere i contenuti.
Ecco un esempio di abbinamenti tra testo e sfondo da non utilizzare. Provate a leggere:

Provate a leggere questo testo se ci riuscite....scommetto che state facendo una gran fatica vero?

Evitate questo abbinamento!

Provate a leggere questo testo se ci riuscite....scommetto che state facendo una gran fatica vero?

Evitate questo abbinamento!

Provate a leggere questo testo se ci riuscite....scommetto che state facendo una gran fatica vero?

Evitate questo abbinamento!

Provate a leggere questo testo se ci riuscite....scommetto che state facendo una gran fatica vero?

Evitate questo abbinamento!

Avrete certamente capito che non è buona norma utilizzare colori di sfondo troppo scuri soprattutto quando contengono molto testo da leggere.
Ora vediamo un esempio di abbinamento corretto:

Scommetto che ora leggete bene senza affaticare i vostro occhi. In questo caso il testo risulta essere comprensivo e leggibile.
Scommetto che ora leggete bene senza affaticare i vostro occhi. In questo caso il testo risulta essere comprensivo e leggibile.
Scommetto che ora leggete bene senza affaticare i vostro occhi. In questo caso il testo risulta essere comprensivo e leggibile.
Scommetto che ora leggete bene senza affaticare i vostro occhi. In questo caso il testo risulta essere comprensivo e leggibile.

Per i testi cercate sempre di utilizzare colori scuri e se possibile, il nero sempre.
Utilizzate i colori per determinare le aree del sito come il menu, i banner, il logo, e via dicendo e vi accorgerete che enfatizzare delle sezioni attraverso i colori non è poi così difficile:

Sezioni colorate

In questo layout abbiamo l'area del logo e dei banner in tinta scura, in quanto non conterranno testo ma solo immagini.
Abbiamo poi l'area del menu laterale e del menu superiore in gradiente più chiaro per delimitarle dalle altre ma per poter inserire anche del testo leggibile. Le aree centrali dei contenuti sono di un gradiente ancora più chiaro in quanto conterranno principalmente del testo.
Utilizzando un colore di base e due suoi gradienti, abbiamo realizzato una struttura piacevole ma soprattutto pratica e leggibile.
Non serve dunque cercare artifizi e colori impossibili. Basta poco per realizzare un sito di facile accesso per tutti e di facile comprensione.
La voglia di utilizzare font spettacolari per i contenuti del nostro sito è tanta, ma veramente tanta. Peccato però che questo è impossibile, o almeno, controproducente e il perchè ve lo spiego subito.
Se utilizzate per esempio il font Agency FB è perchè nella cartella dei Font di Windows contenuta sul vostro disco fisso avete il font Agency FB giusto?
Bene, se gli utenti non hanno installato questo tipo di font, non visualizzeranno mai il vostro Agency FB ma, in automatico, visualizzeranno il Times New Roman, decisamente meno bello e meno spettacolare.
Ecco spiegato il motivo per cui non bisogna utilizzare font particolari, anche se con dispiacere.
Magari utilizzateli per realizzare un banner, lì si visualizzerà sempre e comunque!
I font maggiormente utilizzati nella realizzazione di un sito sono Arial, Verdana, Helvetica, Times New Roman.
Questi font sono normalmente installati in tutte le cartelle Font di Windows, quindi, verranno sempre visualizzati da tutti.
Cercate inoltre di non utilizzare font con sottolineature in quanto potrebbero essere scambiati per link dagli utenti.
Utilizzate magari il grassetto se proprio dovete dare enfasi a un concetto.
Quelli che parlano bene lo chiamano il brand ovvero, il marchio.
Rafforzare il marchio sempre e comunque. Tutti, a prima vista, devono capire a chi e a cosa si riferisce.
Noi invece, che siamo appena agli inizi, lo chiameremo il logo, che in pratica poi è la stessa cosa, ma che ci consente di darci meno arie e di essere più umili.
Anche se siamo agli inizi, non bisogna sottovalutare l'importanza del nostro logo e per prima cosa ne dobbiamo creare uno, giusto?
Quando realizzate il vostro logo, cercate di utilizzare colori e sfumature che state utilizzando per le vostre pagine, in modo da creare una simbiosi tra logo e i contenuti del sito che rappresenta. Non è sbagliato in quanto fa parte del brand!
Inoltre, cosa importante e professionale, fate in modo che il logo diventi un link alla vostra Home Page in maniera che gli utenti, cliccandoci sopra, tornino sempre al punto di partenza.
Realizzando il vostro banner non sarebbe sbagliato poter inserire al suo interno il vostro logo in quanto il vostro banner girerà su più circuiti e così farà anche il logo.
Per utilizzare il logo nel vostro banner, una volta realizzato quello principale per il sito, createne uno con altezza massima di 60px, l'altezza del banner, e inseritelo al suo interno.
Oltre a questo, allegate il vostro logo ad ogni messaggio di posta in uscita, qualsiasi sia la destinazione. Questa è una buona pubblicità gratuita!
Quando visitate un sito la prima pagina che appare in video è la Home Page, ovvero, la pagina principale, la "porta d'ingresso".
La caratteristica della Home Page è quella di racchiudere tutti i contenuti del sito con tanto di descrizione e il menu di navigazione.
La Home Page può determinare il successo di un sito in quanto, se i contenuti non sono espressi in modo chiaro, gli utenti non verranno certo più a visitarvi. Pertanto fate molta attenzione a come esporre i contenuti, soprattutto sotto il profilo della grafica.
Arrivati fino a questo punto avrete certamente intuito che il vostro sito verrà suddiviso in sezioni, alcune più importanti e altre meno.
Cercate di definire bene quali sono le sezioni piu importanti per poterle impostare in maniera corretta sulla vostra Home Page.
Queste sezioni devono apparire subito a vista degli utenti, ovvero, per visualizzarle non devonoscrollare la pagina.
Ecco un esempio grafico di come potrebbero essere impostate le sezioni:

Sezioni della Homepage

In questo esempio la sezione principale, ovvero, quella alla quale tenete di più e che ritenete la più importante del sito, appare in testa alle altre.
Quando un utente apre il vostro sito la sezione principale appare a prima vista e l'utente non deve muovere la pagina con il mouse per poterla individuare.
Se è vero che la Home Page è la pagina più importante del sito, le pagine interne certamente non sono da meno.
Dovete porre la vostra attenzione sullo stile grafico di queste pagine a prescindere dai contenuti, facendo in modo che tutte (e dico tutte) le pagine devono necessariamente avere una struttura grafica uguale e costante.
In pratica, i menu devono trovarsi sempre nello stesso punto e tutti i contenuti devono rispettare tutte le posizioni.
Anche i colori devono essere uguali per tutte le pagine, senza variazioni e senza provare artifizi che porterebbero solamente a una gran confusione. Tutto questo serve a fare in modo che gli utenti non abbiano l'impressione di navigare su un altro sito, ma devono rendersi conto di trovarsi sempre sullo stesso.
Ecco come potrebbe essere la struttura grafica di una pagina interna:

Struttura di una pagina interna al sito

Se scegliete questo stile grafico per le vostre pagine interne, tale deve rimanere per tutte le altre pagine in modo che quando viene caricata una nuova pagina, quella che cambia è solamente l'area destinata ai contenuti.
I menu di navigazione consentono ai vostri utenti di muoversi tra le pagine del vostro sito quindi, devono essere chiari, precisi e senza errori.
La semplicità prima di tutto!
Proviamo ora a realizzare un menu che comprenda una sezione principale e delle sezioni secondarie, e ditemi vuoi quale tra i due esempi vi sembra il più corretto e intuitivo:

Svago

Teatri

Cinema

Pub

Discoteche

Svago

Teatri

Cinema

Pub

Discoteche

Sicuramente il menu di sinistra è molto più intuitivo in quanto definisce, con il grassetto, una sezione con le relative sezioni associate mentre il menu di destra è confusionario in quanto non suddivide la sezione principale da quelle associate.
Non è difficile, basta utilizzare anche il solo testo per realizzare menu intuitivi.
Per realizzare i vostri menu potete utilizzare anche piccole gif, ma fate attenzione a non cambiarle mai da una pagina all'altra. Devono rimanere tali per tutti il sito e questo per non creare confusione e dubbi.
Il software Xara WebStyle che vi consentirà di realizzare pulsanti e barre di navigazione.
Un menu di navigazione molto usato oggi è il menu "Molliche di pane" che richiama alla memoria la favola di Pollicino.
Questo menu è molto utile su siti composti da numerose pagine e, posto su ogni pagina, consente all'utente di ripercorrere il percorso a ritroso per tornare sempre al punto di partenza.
Ecco un esempio per capire il funzionamento: facciamo l'ipotesi che un utente arrivi a visitare la pagina Cinema e, in qualche modo, voglia tornare alla pagina precedentemente visitata. Ecco come fare:
>> Home Page - Svago - Cinema 
Chiaro il concetto?
Volete vedere come realizzare un menu elegante utilizzando solamente le tabelle?

  Svago
  Teatri
  Cinema
  Pub
  Discoteche

Ho realizzato una tabella di 100 pixel con 5 celle verticali e 2 orizzontali. Le piccole celle a sinistra sono di 7 pixel mentre quelle che contengono il testo sono di 93 pixel (100 - 7 = 93).
Giocando poi con i colori delle celle ho creato una sorta di pulsanti contenenti i link del menu.
Senza utilizzare pulsanti o gif del genere, è possibile creare menu eleganti utilizzando solo tabelle e testo. La semplicità regna sovrana!
Ecco, sempre utilizzando una tabella, una barra di navigazione semplice e intuitiva:

Home Page Contatti Forum Chat News

In questo caso ho utilizzato una tabella di 400 pixel divisa in 5 celle di 80 pixel ciascuna.
Sempre giocando con i colori, ho creato una barra di navigazione facile ed intuitiva senza utilizzare gif o pulsanti del genere.


Il primo sito in PHP - gestione articoli

• Introduzione e requisiti
• Creazione del database MySQL e del file di connessione
• Creazione delle pagine di visualizzazione di categorie e contenuti
• Creazione della pagina di visualizzazione dei contenuti
• Struttura di base del pannello di amministrazione
• Creazione di nuove categorie e contenuti
• Pagine di modifica e cancellazione delle categorie
• Pagine di modifica e cancellazione dei contenuti
• Informazioni di chiusura
Questa guida si pone come obiettivo di insegnare a realizzare un sito web per la gestione automatizzata dei contenuti.
Sarà quindi illustrato tutto il codice per realizzare un sito web in PHP e MySQL gestibile on-line, suddiviso in categorie contenenti articoli.
Il tutto sarà amministrabile tramite un pannello multiutente.
La struttura grafica del sito è stata volutamente lasciata scarna per rendere più chiaro il codice strutturale PHP.
Prerequisiti
Non è richiesta alcuna conoscenza di codice PHP e/o HTML.
E' necessario uno spazio web gratuito o a pagamento che supporti PHP e MySQL. Consigliati Altervista e Xoopiter fra gli spazi free.
E' possibile testare in locale il tutto, utilizzando EasyPHP per installare PHP e MySQL nel vostro PC.
In questa lezione vedremo come creare le tabelle SQL del nostro database e come implementare una connessione MySQL con PHP.
Eseguite in un database a vostra scelta questo codice SQL, che creerà le tabelle necessarie, ossia "accesso", contenente i dati di accesso al pannello di amministrazione, "tblcat", contenente i dati delle categorie e "tblcontent", contenente i dati degli articoli.

CREATE TABLE `accesso` (
`id` int(11) NOT NULL auto_increment,
`username` text NOT NULL,
`password` text NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `tblcat` (
`catId` int(11) NOT NULL auto_increment,
`catName` varchar(100) default NULL,
`catDesc` text,
`catSpot` text,
PRIMARY KEY (`catId`)
);
CREATE TABLE `tblcontent` (
`contentId` int(11) NOT NULL auto_increment,
`contentTitle` varchar(255) default NULL,
`contentText` text,
`catId` int(11) default NULL,
`autore` text NOT NULL,
PRIMARY KEY (`contentId`)
);

Passiamo ora alla realizzazione del file "connessione.php", contenente il seguente codice:
 
<?php
$hostname_connessione = "localhost"; // Il nome dell’host
$database_connessione = "sitoweb"; // Il nome del database
$username_connessione = "root"; // Il nome utente di accesso al database
$password_connessione = ""; // La password di accesso al database
$connessione = mysql_pconnect($hostname_connessione, $username_connessione, $password_connessione) or trigger_error(mysql_error(),E_USER_ERROR);
?>

Nel codice del file in questione si dovranno settare, come indicato, i parametri di accesso al servizio MySQL e al database.
In questa lezione vedremo come realizzare le pagine di visualizzazione, ossia "index.php", in cui sarà visualizzato l'elenco delle categorie, e "categoria.php", in cui sarà visualizzato l'elenco degli articoli disponibili per ogni categoria.
Ecco il codice di "index.php":
 
<?php require_once('connessione.php'); ?>
<?php
mysql_select_db($database_connessione, $connessione);
$query_elencocat = "SELECT * FROM tblcat ORDER BY catName ASC";
$elencocat = mysql_query($query_elencocat, $connessione) or die(mysql_error());
$row_elencocat = mysql_fetch_assoc($elencocat);
$totalRows_elencocat = mysql_num_rows($elencocat);
?>
<html>
<head>
<title>Elenco categorie </title>
</head>
<body>
<div align="center"><a href="index.php">Home</a></div>
<div align="center"><b>Elenco delle categorie:</b></div>
<?php do { ?><div align="center">
<a href="categoria.php?catId=<?php echo $row_elencocat['catId']; ?>"><?php echo $row_elencocat['catName']; ?></a></div>
<?php } while ($row_elencocat = mysql_fetch_assoc($elencocat)); ?>
<hr>
<div align="left">Qui il testo della home page... </div>
<hr>

<div align="right" ><a href="admin/login.php">Amministrazione</a></div>
</body>
</html>
<?php
mysql_free_result($elencocat);
?>

Da notare come venga effettuata una selezione delle categorie dalla tabella "tblcat", quindi un ciclo WHILE DO per visualizzarle.
Ecco il codice di "categoria.php":
 
<?php require_once('connessione.php'); ?>
<?php
$colname_testocategoria = "1";
if (isset($_GET['catId'])) {
$colname_testocategoria = (get_magic_quotes_gpc()) ? $_GET['catId'] : addslashes($_GET['catId']);
}
mysql_select_db($database_connessione, $connessione);
$query_testocategoria = sprintf("SELECT * FROM tblcat WHERE catId = %s", $colname_testocategoria);
$testocategoria = mysql_query($query_testocategoria, $connessione) or die(mysql_error());
$row_testocategoria = mysql_fetch_assoc($testocategoria);
$totalRows_testocategoria = mysql_num_rows($testocategoria);
$colname_contenuti = "1";
if (isset($_GET['catId'])) {
$colname_contenuti = (get_magic_quotes_gpc()) ? $_GET['catId'] : addslashes($_GET['catId']); }
mysql_select_db($database_connessione, $connessione);
$query_contenuti = sprintf("SELECT * FROM tblcontent WHERE catId = %s ORDER BY contentTitle ASC", $colname_contenuti);
$contenuti = mysql_query($query_contenuti, $connessione) or die(mysql_error());
$row_contenuti = mysql_fetch_assoc($contenuti);
$totalRows_contenuti = mysql_num_rows($contenuti);
?>
<html>
<head>
<title>Elenco degli articoli disponibili</title>
</head>
<body>
<div align="center"><a href="index.php">Home</a></div>
<div align="center"><h1><?php echo $row_testocategoria['catName']; ?></h1></div>
<?php do { ?>
<div align="center"><a href="contenuto.php?contentId=<?php echo $row_contenuti['contentId']; ?>"><?php echo $row_contenuti['contentTitle']; ?></a></div>
<?php } while ($row_contenuti = mysql_fetch_assoc($contenuti)); ?>
<hr>

<div align="center"><b><?php echo $row_testocategoria['catText']; ?> </b></hr></div>
</body>
</html>
<?php
mysql_free_result($testocategoria);
mysql_free_result($contenuti);
?>

Da notare come vengano fatte due selezioni in base al valore del parametro "catId", recuperato tramite il modo GET.
La prima selezione serve a recuperare i dati della categoria scelta, la seconda per visualizzare gli articoli disponibili per la categoria.
In questa lezione vedremo come realizzare la pagina di visualizzazione degli articoli.
Ecco il codice:
 
<?php require_once('connessione.php'); ?>
<?php
mysql_select_db($database_connessione, $connessione);
$colname_contenutoscelto = "1";
if (isset($_GET['contentId'])) {
$colname_contenutoscelto = (get_magic_quotes_gpc()) ? $_GET['contentId'] : addslashes($_GET['contentId']);
}
mysql_select_db($database_connessione, $connessione);
$query_contenutoscelto = sprintf("SELECT * FROM tblcontent WHERE contentId = %s", $colname_contenutoscelto);
$contenutoscelto = mysql_query($query_contenutoscelto, $connessione) or die(mysql_error());
$row_contenutoscelto = mysql_fetch_assoc($contenutoscelto);
$totalRows_contenutoscelto = mysql_num_rows($contenutoscelto);
?>
<html>

<head>
<title>Visualizzazione articoli </title>
</head>
<body>
<div align="center"><a href="index.php">Home</a></div>
<div align="center"><a href="categoria.php?catId=<?php echo $row_contenutoscelto['catId']; ?>">Clicca qui per tornare all'elenco degli articoli</a></div>
<div align="center"><h1><?php echo $row_contenutoscelto['contentTitle']; ?></h1></div>
<div align="left"> <?php echo nl2br($row_contenutoscelto['contentText']); ?></div>
</body>
</html>
<?php
mysql_free_result($contenutoscelto);
?>

Da notare come venga effettuata anche in questo caso una query di selezione dell'articolo in base al valore di "contentId", recuperato tramite il modo GET.
Quindi l'articolo viene visualizzato tramite la funzione ECHO.
Da notare anche il fatto che si utilizzi il comando NL2BR nella visualizzazione del testo dell'articolo, che permette di visualizzare il testo rispettando gli a capo digitati nel form dall'autore.
In questa parte realizzeremo la struttura base del pannello di amministrazione, ossia una pagina per l'accesso, "login.php", e una pagina riservata, "areariservata.php".
Creiamo una cartella "admin" all'interno della cartella dove sono i files realizzati fino ad ora.
In questa cartella inseriremo tutti i files riguardanti il pannello di amministrazione.
Ecco il codice di "login.php":
<?php require_once('../connessione.php'); ?>
<?php
session_start();
$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($accesscheck)) {
$GLOBALS['PrevUrl'] = $accesscheck;
session_register('PrevUrl');
}
if (isset($_POST['username'])) {
$loginUsername=$_POST['username'];
$password=$_POST['password'];
$MM_fldUserAuthorization = "";
$MM_redirectLoginSuccess = "areariservata.php";
$MM_redirectLoginFailed = "login.php";
$MM_redirecttoReferrer = false;
mysql_select_db($database_connessione, $connessione);
$LoginRS__query=sprintf("SELECT username, password FROM accesso WHERE username='%s' AND password='%s'",
get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password));
$LoginRS = mysql_query($LoginRS__query, $connessione) or die(mysql_error());
$loginFoundUser = mysql_num_rows($LoginRS);
if ($loginFoundUser) {
$loginStrGroup = "";
$GLOBALS['MM_Username'] = $loginUsername;
$GLOBALS['MM_UserGroup'] = $loginStrGroup;
session_register("MM_Username");
session_register("MM_UserGroup");
if (isset($_SESSION['PrevUrl']) && false) {
$MM_redirectLoginSuccess = $_SESSION['PrevUrl'];
}
header("Location: " . $MM_redirectLoginSuccess );
}
else {
header("Location: ". $MM_redirectLoginFailed );
}
}
?>
<html>

<head>
<title>Accesso al pannello </title>
</head>
<body>
<div align="center"><a href="../index.php">Torna al sito </a></div>
<div align="center">
<form name="frmlogin" id="frmlogin" method="POST" action="<?php echo $loginFormAction; ?>">
Nome utente <br>
<input name="username" type="text" id="username" size="30">
<br>
Password <br> <input name="password" type="password" id="password" size="30"><br>
<input name="pulsantelogin" type="submit" id="pulsantelogin" value="Login">
</form>
</div>
</body>
</html>

Da notare come vengano recuperati i dati dal form, sia controllato se sono presenti nel database e vengano create due variabili di sessione. Nel caso in cui i dati inseriti siano errati, l'utente viene rimandato alla pagina di accesso. Nel caso contrario viene indirizzato a "areariservata.php".
Ecco il codice di "areariservata.php":

<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup');
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";  
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
$isValid = False;
if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)

$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<html>
<head>
<title>Pannello di amministrazione</title> </head>
<body>
<div align="center"><a href="<?php echo $logoutAction ?>">Torna al sito </a></div>
<div align="center"><h1>Accesso effettuato con successo.</h1>
<p align="center"><a href="nuovacategoria.php">Clicca qui per creare una nuova categoria</a></p>
<p align="center"><a href="nuovoarticolo.php">Clicca qui per creare un nuovo articolo</a></p>
<p align="center"><a href="modificacategorie.php">Clicca qui modificare le categorie presenti</a></p>
<p align="center"><a href="modificaarticoli.php">Clicca qui per modificare i contenuti presenti </a></p>
</body>
</html>

In questa lezione vedremo il codice delle pagine per la creazione di categorie e contenuti, ossia rispettivamente "nuovacategoria.php" e "nuovoarticolo.php". Realizzeremo inoltre una pagina di conferma operazione avvenuta, "grazie.php".
Ecco il codice di "nuovacategoria.php":

<?php require_once('../connessione.php'); ?>
<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup');
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
$isValid = False; if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)

$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";

break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "nuovacategoria")) {
$insertSQL = sprintf("INSERT INTO tblcat (catName, catText) VALUES (%s, %s)",
GetSQLValueString($_POST['catName'], "text"),
GetSQLValueString($_POST['catText'], "text"));
mysql_select_db($database_connessione, $connessione);
$Result1 = mysql_query($insertSQL, $connessione) or die(mysql_error());
$insertGoTo = "grazie.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];

}
header(sprintf("Location: %s", $insertGoTo));
}
?>
<html>
<head>
<title>Pannello di amministrazione</title>
</head>
<body>
<div align="center"><a href="<?php echo $logoutAction ?>">Torna al sito </a></div>
<div align="center">
<p><a href="areariservata.php">Clicca qui per tornare al main frame del pannello di amministrazione</a></p>
<p><h1>Creazione di una nuova categoria </h1></p>
<form name="nuovacategoria" id="nuovacategoria" method="POST" action="<?php echo $editFormAction; ?>">
Nome della categoria <br >
<input name="catName" type="text" id="catName" size="50">
<br>
Testo della categoria <br>
<textarea name="catText" cols="50" rows="10" id="catText"></textarea><br>
<input name="pulsanteinserisci" type="submit" id="pulsanteinserisci" value="Inserisci">
<input name="pulsantecancella" type="reset" id="pulsantecancella" value="Cancella">
<input type="hidden" name="MM_insert" value="nuovacategoria">
</form></div>
</body>
</html>

Ed ecco il codice di "nuovoarticolo.php":
<?php require_once('../connessione.php'); ?>
<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);

if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup');
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
$isValid = False; if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)
$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
switch ($theType) {
case "text";
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "inserisciarticolo")) {
$insertSQL = sprintf("INSERT INTO tblcontent (contentTitle, contentText, catId) VALUES (%s, %s, %s)",
GetSQLValueString($_POST['contentTitle'], "text"),
GetSQLValueString($_POST['contentText'], "text"),
GetSQLValueString($_POST['catId'], "int")); 
mysql_select_db($database_connessione, $connessione);
$Result1 = mysql_query($insertSQL, $connessione) or die(mysql_error());
 $insertGoTo="grazie.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
mysql_select_db($database_connessione, $connessione);
$query_legenda = "SELECT * FROM tblcat ORDER BY catName ASC";
$legenda = mysql_query($query_legenda, $connessione) or die(mysql_error());
$row_legenda = mysql_fetch_assoc($legenda);
$totalRows_legenda = mysql_num_rows($legenda);
?>
<html>
<head>
<title>Pannello di amministrazione </title>
</head>
<body>
<div align="center"><a href="<?php echo $logoutAction ?>">Torna al sito </a></div>
<div align="center">
<p><a href="areariservata.php">Clicca qui per tornare al main frame del pannello di amministrazione</a></p>
<p><h1>Creazione di un nuovo articolo/contenuto</h1></p>
<form name="inserisciarticolo" id="inserisciarticolo" method="POST" action="<?php echo $editFormAction; ?>">
Titolo del contenuto<br>
<input name="contentTitle" type="text" id="contentTitle" size="50">
<br>
Testo del contenuto<br>
<textarea name="contentText" cols="50" rows="10" id="contentText"></textarea>
<br>
ID della categoria di appartenenza (vedi legenda qui sotto)<br>
<input name="catId" type="text" id="catId" size="10">
<br>
Legenda degli ID<br>
<table style="border:1px dashed #FFFFFF">
<tr><td><div align="center"><strong>Categoria</strong></div></td>
<td><div align="center"><strong>ID</strong></div></td>
</tr>
<?php do { ?>
<tr>
<td><div align="center"><?php echo $row_legenda['catName']; ?></div></td>
<td><div align="center"><?php echo $row_legenda['catId']; ?></div></td>
</tr>
<?php } while ($row_legenda = mysql_fetch_assoc($legenda)); ?>
</table>
<br>
<input name="pulsanteinserisci" type="submit" id="pulsanteinserisci" value="Inserisci">
<input name="pulsantecancella" type="reset" id="pulsantecancella" value="Cancella">
<input type="hidden" name="MM_insert" value="inserisciarticolo">
</form>
</div>
</body>
</html>
<?php
mysql_free_result($legenda);
?>

Infine il codice di "grazie.php":
<?php require_once('../connessione.php'); ?>
<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup');
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
$isValid = False; if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)
$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<html>
<head>
<title>Pannello di amministrazione</title>
</head>
<body>
<div align="center"><a href="<?php echo $logoutAction ?>">Torna al sito </a></div>
<p align="center"><h1>Operazione effettuata con successo. </h1></p>
<p align="center"><a href="nuovacategoria.php">Clicca qui per creare una nuova categoria</a></p>
<p align="center"><a href="nuovoarticolo.php">Clicca qui per creare un nuovo articolo</a></p>
<p align="center"><a href="modificacategorie.php">Clicca qui modificare le categorie presenti</a></p>
<p align="center"><a href="modificaarticoli.php">Clicca qui per modificare i contenuti presenti </a></p>
</body>
</html>

In questa lezione vedremo il codice per la modifica e la cancellazione delle categorie. Realizzeremo quindi una pagina "modificacategorie.php" con l'elenco delle categorie presenti e una pagina "modcat.php" che permetterà di modificare ogni singola categoria. Quindi realizzeremo il codice di "delcat.php" per la cancellazione delle categorie.
Ecco il codice di "modificacategorie.php":

<?php require_once('../connessione.php'); ?>
<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup')
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";
function isAuthorized($strUsers, $strGroups,$UserName, $UserGroup) {
$isValid = False; if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)
$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<?php
mysql_select_db($database_connessione, $connessione);
$query_elencocategorie = "SELECT * FROM tblcat ORDER BY catName ASC";
$elencocategorie = mysql_query($query_elencocategorie, $connessione) or die(mysql_error());
$row_elencocategorie = mysql_fetch_assoc($elencocategorie);
$totalRows_elencocategorie = mysql_num_rows($elencocategorie);
?>
<html>
<head>
<title>Pannello di amministrazione</title>
</head>  
<body>
<div align="center"><a href="<?php echo $logoutAction ?>">Torna al sito </a></div>
<td><div align="center">
<p><a href="areariservata.php">Clicca qui per tornare al main frame del pannello di amministrazione</a></p>
<p><h1>Modifica una categoria di articoli</h1></p>
<table border="0">
<tr>
<td><strong>Categoria</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<?php do { ?>
<tr>
<td><?php echo $row_elencocategorie['catName']; ?></td>
<td><a href="modcat.php?catId=<?php echo $row_elencocategorie['catId']; ?>">Modifica</a></td>
<td><a href="delcat.php?catId=<?php echo $row_elencocategorie['catId']; ?>">Cancella</a></td>
</tr>
<?php } while ($row_elencocategorie = mysql_fetch_assoc($elencocategorie)); ?>
</table>
</div>
</body>
</html>
<?php
mysql_free_result($elencocategorie);
?>

Ed ecco ora il codice di "modcat.php":
 
<?php require_once('../connessione.php'); ?>
<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup');
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
$isValid = False; if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)
$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "modcat")) {
$updateSQL = sprintf("UPDATE tblcat SET catName=%s, catText=%s WHERE catId=%s",
GetSQLValueString($_POST['catName'], "text"),
GetSQLValueString($_POST['catText'], "text"),
GetSQLValueString($_POST['catId'], "int"));
mysql_select_db($database_connessione, $connessione);
$Result1 = mysql_query($updateSQL, $connessione) or die(mysql_error());
$updateGoTo = "grazie.php";
if (isset($_SERVER['QUERY_STRING'])) {
$updateGoTo .= (strpos($updateGoTo, '?')) ? "&" : "?";
$updateGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $updateGoTo));
}
$colname_mostracat = "1";
if (isset($_GET['catId'])) {
$colname_mostracat = (get_magic_quotes_gpc()) ? $_GET['catId'] : addslashes($_GET['catId']);
}
mysql_select_db($database_connessione, $connessione);
$query_mostracat = sprintf("SELECT * FROM tblcat WHERE catId = %s", $colname_mostracat);
$mostracat = mysql_query($query_mostracat, $connessione) or die(mysql_error());
$row_mostracat = mysql_fetch_assoc($mostracat);
$totalRows_mostracat = mysql_num_rows($mostracat);
?>
<html>
<head>
<title>Pannello di amministrazione</title>
</head>
<body>
<div align="center"><a href="<?php echo $logoutAction ?>">Torna al sito </a></div>
<div align="center">
<p><a href="areariservata.php">Clicca qui per tornare al main frame del pannello di amministrazione</a></p>
<p><a href="modificacategorie.php">Clicca qui per tornare all'elenco delle categorie modificabili</a></p>
<p><strong>Modifica di una categoria</strong></p>
<form action="<?php echo $editFormAction; ?>" name="modcat" id="modcat" method="POST">
Nome della categoria <br>
<input name="catName" type="text" id="catName" value="<?php echo $row_mostracat['catName']; ?>" size="50">
<br>
Testo della categoria <br>
<textarea name="catText" cols="50" rows="10" id="catText"><?php echo $row_mostracat['catText']; ?></textarea> <br>
<input name="catId" type="hidden" id="catId" value="<?php echo $row_mostracat['catId']; ?>">
<input name="pulsanteinserisci" type="submit" id="pulsanteinserisci" value="Modifica">
<input name="pulsantecancella" type="reset" id="pulsantecancella" value="Cancella">
<input type="hidden" name="MM_update" value="modcat">
</form>
</div>
</body>
</html>
<?php
mysql_free_result($mostracat);
?>

Realizziamo ora la pagina di cancellazione delle categorie, "delcat.php":

<?php require_once('../connessione.php'); ?>
<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup');
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
$isValid = False; if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)
$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;  
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "")? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
if ((isset($_GET['catId'])) && ($_GET['catId'] != "")) {
$deleteSQL = sprintf("DELETE FROM tblcat WHERE catId=%s",
GetSQLValueString($_GET['catId'], "int"));
mysql_select_db($database_connessione, $connessione);
$Result1 = mysql_query($deleteSQL, $connessione) or die(mysql_error());  
$deleteGoTo = "grazie.php";
if (isset($_SERVER['QUERY_STRING'])) {
$deleteGoTo .= (strpos($deleteGoTo, '?')) ? "&" : "?";
$deleteGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $deleteGoTo));
}
?>

In questo tutorial vedremo la costruzione delle pagine di modifica e cancellazione degli articoli, rispettivamente "modificaarticoli.php", contenente l'elenco degli articoli, "modarticolo.php", contenente il codice per la modifica di ogni articolo, e "delarticolo.php", contenente il codice per la cancellazione degli articoli.
Ecco il codice di "modificaarticoli.php":
<?php require_once('../connessione.php'); ?>
<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup');
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
$isValid = False; if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)
$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<?php
mysql_select_db($database_connessione, $connessione);
$query_elencocontenuti = "SELECT * FROM tblcontent ORDER BY contentTitle ASC";
$elencocontenuti = mysql_query($query_elencocontenuti, $connessione) or die(mysql_error());
$row_elencocontenuti = mysql_fetch_assoc($elencocontenuti);
$totalRows_elencocontenuti = mysql_num_rows($elencocontenuti);
?>
<html>
<head>
<title>Pannello di amministrazione </title>
</head>
<body>
<div align="center"><a href="<?php echo $logoutAction ?>">Torna al sito </a></div>
<div align="center">
<p><a href="areariservata.php">Clicca qui per tornare al main frame del pannello di amministrazione</a></p>
<p><h1>Modifica un contenuto</h1></p>
<table border="0">
<tr>
<td><strong>Contenuto</strong></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<?php do { ?>
<tr>
<td><?php echo $row_elencocontenuti['contentTitle']; ?></td>
<td><a href="modarticolo.php?contentId=<?php echo $row_elencocontenuti['contentId']; ?>">Modifica</a></td>
<td><a href="delarticolo.php?contentid=<?php echo $row_elencocontenuti['contentId']; ?>">Cancella</a></td>
</tr>
<?php } while ($row_elencocontenuti = mysql_fetch_assoc($elencocontenuti)); ?>
</table>
</div>
</body>
</html>
<?php
mysql_free_result($elencocontenuti);
?>

Quindi il codice di "modarticolo.php":
<?php require_once('../connessione.php'); ?>
<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup');
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
$isValid = False; if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)
$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;  
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
 $editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "modificarticolo")) {
$updateSQL = sprintf("UPDATE tblcontent SET contentTitle=%s, contentText=%s, catId=%s WHERE contentId=%s",
GetSQLValueString($_POST['contentTitle'], "text"),
GetSQLValueString($_POST['contentText'], "text"),
GetSQLValueString($_POST['catId'], "int"),
GetSQLValueString($_POST['contentId'], "int"));  
mysql_select_db($database_connessione, $connessione);
$Result1 = mysql_query($updateSQL, $connessione) or die(mysql_error());  
$updateGoTo = "grazie.php";
if (isset($_SERVER['QUERY_STRING'])) {
$updateGoTo .= (strpos($updateGoTo, '?')) ? "&" : "?";
$updateGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $updateGoTo));
}
mysql_select_db($database_connessione, $connessione);
$query_legenda = "SELECT * FROM tblcat ORDER BY catName ASC";
$legenda = mysql_query($query_legenda, $connessione) or die(mysql_error());
$row_legenda = mysql_fetch_assoc($legenda);
$totalRows_legenda = mysql_num_rows($legenda);
$colname_mostrarticolo = "1";
if (isset($_GET['contentId'])) {
$colname_mostrarticolo = (get_magic_quotes_gpc()) ? $_GET['contentId'] : addslashes($_GET['contentId']);
}
mysql_select_db($database_connessione, $connessione);
$query_mostrarticolo = sprintf("SELECT * FROM tblcontent WHERE contentId = %s",
$colname_mostrarticolo);
$mostrarticolo = mysql_query($query_mostrarticolo, $connessione) or die(mysql_error());
$row_mostrarticolo = mysql_fetch_assoc($mostrarticolo);
$totalRows_mostrarticolo = mysql_num_rows($mostrarticolo);
?>
<html>
<head>
<title>Pannello di amministrazione </title>
</head>
<body>
<div align="center"><a href="<?php echo $logoutAction ?>">Torna al sito </a></div>
<div align="center">
<p><a href="areariservata.php">Clicca qui per tornare al main frame del pannello di amministrazione</a></p>
<p><a href="modificaarticoli.php">Clicca qui per tornare all'elenco degli articoli modificabili</a> </p>
<p><h1>Modifica di un articolo/contenuto </h1></p>
<form name="modificarticolo" id="modificarticolo" method="POST" action="<?php echo $editFormAction; ?>">
<br>Titolo del contenuto<br>
<input name="contentTitle" type="text" id="contentTitle" value="<?php echo $row_mostrarticolo['contentTitle']; ?>" size="50">
<br>
Testo del contenuto<br>
<textarea name="contentText" cols="50" rows="10" id="contentText"><?php echo $row_mostrarticolo['contentText']; ?></textarea><br>
ID della categoria di appartenenza (vedi legenda qui sotto) <br>
<input name="catId" type="text" id="catId" value="<?php echo $row_mostrarticolo['catId']; ?>" size="10">
<br>
Legenda degli ID<br>
<table style="border:1px dashed #FFFFFF">
<tr><td><div align="center"><strong>Categoria</strong></div></td>
<td><div align="center"><strong>ID</strong></div></td>
</tr>
<?php do { ?>
<tr>
<td><div align="center"><?php echo $row_legenda['catName']; ?></div></td>
<td><div align="center"><?php echo $row_legenda['catId']; ?></div></td>
</tr>
<?php } while ($row_legenda = mysql_fetch_assoc($legenda)); ?>
</table>
<br>
<input name="contentId" type="hidden" id="contentId" value="<?php echo $row_mostrarticolo['contentId']; ?>">
<input name="pulsanteinserisci" type="submit" id="pulsanteinserisci" value="Modifica">
<input name="pulsantecancella" type="reset" id="pulsantecancella" value="Cancella">
<input type="hidden" name="MM_update" value="modificarticolo">
</form>
</div>
</body>
</html>
<?php
mysql_free_result($legenda);  
mysql_free_result($mostrarticolo);
?>

Infine il codice di "delarticolo.php":
<?php require_once('../connessione.php'); ?>
<?php
session_start();
$logoutAction = $_SERVER['PHP_SELF']."?doLogout=true";
if ((isset($_SERVER['QUERY_STRING'])) && ($_SERVER['QUERY_STRING'] != "")){
$logoutAction .="&". htmlentities($_SERVER['QUERY_STRING']);
}
if ((isset($_GET['doLogout'])) &&($_GET['doLogout']=="true")){
session_unregister('MM_Username');
session_unregister('MM_UserGroup');
$logoutGoTo = "../index.php";
if ($logoutGoTo) {
header("Location: $logoutGoTo");
exit;
}
}
?>
<?php
session_start();
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) {
$isValid = False; if (!empty($UserName)) {
$arrUsers = Explode(",", $strUsers);
$arrGroups = Explode(",", $strGroups);
if (in_array($UserName, $arrUsers)) {
$isValid = true;
}
if (in_array($UserGroup, $arrGroups)) {
$isValid = true;
}
if (($strUsers == "") && true) {
$isValid = true;
}
}
return $isValid;
}
$MM_restrictGoTo = "login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {
$MM_qsChar = "?";
$MM_referrer = $_SERVER['PHP_SELF'];
if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0)
$MM_referrer .= "?" . $QUERY_STRING;
$MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
header("Location: ". $MM_restrictGoTo);
exit;
}
?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
if ((isset($_GET['contentId'])) && ($_GET['contentId'] != "")) {
$deleteSQL = sprintf("DELETE FROM tblcontent WHERE contentId=%s",
GetSQLValueString($_GET['contentId'], "int"));  
mysql_select_db($database_connessione, $connessione);
$Result1 = mysql_query($deleteSQL, $connessione) or die(mysql_error());  
$deleteGoTo = "grazie.php";
if (isset($_SERVER['QUERY_STRING'])) {
$deleteGoTo .= (strpos($deleteGoTo, '?')) ? "&" : "?";
$deleteGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $deleteGoTo));
}
?>

In questo tutorial abbiamo illustrato un ottimo metodo per la gestione di un sito web, adatto a siti sia di carattere personale sia aziendale. Esso infatti permette al proprietario di inserire, modificare, cancellare categorie e articoli in tempo reale da qualsiasi postazione internet e in qualsiasi momento.
E’ probabile che se utilizzato nel server locale, non funzioni l’accesso all’area riservata, sebbene si inseriscano i dati corretti. Questo non è dovuto ad un problema del codice proposto in questa guida, ma bensì ad un bug interno di EasyPHP. Ciononostante, lo script funziona ottimamente se caricato on-line.
Una volta effettuato l’accesso al pannello di amministrazione, possiamo iniziare ad inserire, modificare, cancellare articoli e categorie.
Potete scaricare i files compreti del manuale qui:
http://www.agwebsolutions.it/public/manuali/ilmiositocom/sito.zip
E’ inoltre possibile visualizzare una copia funzionante dello script a questo indirizzo:
http://www.agwebsolutions.it/public/manuali/ilmiositocom/index.php