Archive for the 'Server WEB' Category

Nov 08 2009

Fare il binding di IIS 6 su un solo indirizzo IP

Published by Lorenzo under Server WEB, Windows Server

Scenario

Si prenda in considerazione un server Windows Server 2003 con Internet Information Services 6 con installato almeno un sito Web; il server in questione ha due o più schede di rete, oppure una scheda di rete con definiti due o più indirizzi IP, ad esempio, il nostro server ha due indirizzi IP, 172.16.1.1 e 172.16.1.10. Questo server ha un’installazione di IIS predefinita, con uno o più siti Web installati. In tale situazione, IIS rimane in ascolto sulla porta 80 su tutti gli indirizzi IP definiti sulla macchina.

Ora esaminiamo l’ipotesi di dover far girare sulla stessa macchina un altro server Web, che deve anch’esso rimanere in ascolto sulla porta 80: in questo caso, bisogna fare in modo che i siti di IIS rimangano in ascolto, invece che su entrambi gli indirizzi IP, su un solo indirizzo IP; nel nostro caso scegliamo l’indirizzo 172.16.1.1, in modo da lasciare “libero” l’indirizzo 172.16.1.10 per l’altro server Web.

A prima vista, la soluzione sembrerebbe semplice, cioé configurare il sito (o i siti) Web per rimanere in ascolto solamente sull’indirizzo 172.16.1.1, come mostrato in figura 1:

Porta d'ascolto sito IIS

Purtroppo però questa soluzione non funziona, IIS continua a rimanere in ascolto sulla porta 80 su tutti gli indirizzi IP della macchina, com’è possibile vedere col comando netstat:

netstat -noa | find ":80"

il cui output risulta essere questo:

TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       2548

che indica appunto che IIS si appropria della porta 80 su tutti gli IP disponibili.

Configurazione di IIS

Con i normali strumenti messi a disposizione dalla console di gestione di IIS, che io sappia non c’è modo di superare questa limitazione; per risolvere il problema, possiamo utilizzare l’utility httpcfg, contenuta nel pacchetto Windows Server 2003 Support Tools, che consente di svolgere questo e altri compiti su IIS.

Il primo passo consiste nel verificare su quali porte sta in ascolto IIS, col comando

httpcfg query iplisten

che, nel mio caso, restituisce questo output:

HttpQueryServiceConfiguration completed with 1168

Ciò significa che IIS segue l’impostazione predefinita, ovvero rimane in ascolto su tutti gli IP disponibili sulla macchina. Con httpcfg posso cambiare questa impostazione, istruendo IIS per rimanere in ascolto solamente sull’IP 172.16.1.1:

httpcfg set iplisten -i 172.16.1.1

il quale restituisce questo messaggio che conferma la corretta esecuzione del comando:

HttpSetServiceConfiguration completed with 0

La conferma è utile, ma è meglio controllare se la configurazione è corretta, digitando di nuovo il comando

httpcfg query iplisten

il cui output stavolta è differente:

      IP                      : 172.16.1.1
------------------------------------------------------------------------------

La configurazione è avvenuta correttamente, per renderla attiva è necessario riavviare il servizio HTTP e i servizi dipendenti, HTTP SSL e World Wide Web Publishing Service:

net stop http /y

L’opzione /y riavvia http e i servizi dipendenti da questo senza attendere la conferma dell’utente; procediamo ora all’avvio dei servizi fermati:

net start http
net start w3svc

Dopo aver riavviato i servizi, verifichiamo con netstat che IIS si sia piegato al nostro volere:

netstat -noa | find ":80"

ora l’output del comando netstat è quello “giusto”:

TCP    172.16.1.1:80          0.0.0.0:0              LISTENING       3928

Conclusioni

httpcfg è un’utility che consente di ovviare a quella che è una “curiosa” mancanza della GUI di IIS; una volta che se ne conosce l’esistenza e le modalità d’utilizzo, è abbastanza semplice arrivare al risultato desiderato, ma il sysadmin che si trova per la prima volta di fronte ad un problema simile può perdere anche parecchio tempo prima di risolvere il problema, e ciò secondo me è negativo e soprattutto poco sensato.

Link di riferimento

http://technet.microsoft.com/en-us/library/cc786389%28WS.10%29.aspx

One response so far

Lug 21 2009

Configurare indirizzo IP e porte d’ascolto di Apache

Lo appunto qui così non mi dimentico.

E’ possibile configurare Apache 2 sotto Debian Lenny per fare rimanere il web server in ascolto su determinate porte e su determinati indirizzi IP, tramite la direttiva Listen. Questa direttiva (o più direttive Listen), in Debian è presente nel file di configurazione /etc/apache2/ports.conf, che viene richiamato tramite una direttiva include dal file principale di configurazione di Apache, /etc/apache2/apache2.conf.

Ad esempio, avendo un server web Debian Lenny con Apache 2, con due indirizzi IP come indicato di seguito:

IP1: 192.168.1.1
IP2: 5.6.7.8

se voglio che il server rimanga in ascolto su tutti e due gli indirizzi sulla porta 80, mi basta lasciare la direttiva predefinita indicata come di seguito:

Listen 80

la quale indica che Apache rimane in ascolto su tutte le interfacce di rete sulla porta 80. Se invece desidero che Apache rimanga in ascolto solamente sull’IP2 sulla porta 80, il contenuto del file ports.conf sarà il seguente:

Listen 5.6.7.8:80

Se invece ho l’esigenza di avere Apache in ascolto su entrambi gli indirizzi IP, ma su porte diverse, il file ports.conf si presenterà così:

Listen 192.168.1.1:80
Listen 5.6.7.8:8080

Dopo ogni modifica al file ports.conf, devo far ripartire Apache con il comando

/etc/init.d/apache2 restart

per applicare le modifiche effettuate.

4 responses so far

Giu 02 2008

Hosting virtuale con Debian: server Web Apache

Se un server Linux Debian viene utilizzato come server Web, è abbastanza probabile che questo ospiti più siti, ed è piuttosto comune che questi siti vengano gestiti da persone diverse, che debbono avere quindi un accesso FTP dedicato per poter caricare i file del proprio sito, e magari poter avere l’accesso al proprio database MySQL tramite PhpMyAdmin, facendo in modo che gli operatori non vadano a gironzolare su directory o database non di loro competenza.

In questo primo articolo (il prossimo tratterà della configurazione del server FTP vsftpd), darò per scontato che siano già installati (tramite il solito apt) Apache2, PHP5, MySQL; ipotizziamo quindi di dover creare due siti, webtest.it e webprova.it, e creiamo le relative directory:

# mkdir /var/www/webtest
# mkdir /var/www/webprova

Ora, create le directory, dobbiamo configurare gli host virtuali in Apache. Apache2, in Debian, consente la configurazione degli host virtuali inserendo un file di configurazione per ogni host virtuale che si intende creare nella directory /etc/apache2/sites-available, per cui, andremo a creare i due file per i due domini:

# touch /etc/apache2/sites-available/webtest.it
# touch /etc/apache2/sites-available/webprova.it

A questo punto, creati i file vuoti, vanno editati con questi contenuti:

File /etc/apache2/sites-available/webtest.it

NameVirtualHost *:80
<VirtualHost *:80 >
ServerAdmin webmaster@webtest.it
ServerName www.webtest.it
DirectoryIndex index.html index.php
DocumentRoot /var/www/webtest
<Directory "/var/www/webtest">
Order Deny,Allow
Allow from all
Options -Indexes
</Directory>
ErrorLog /var/log/apache2/webtest.it.log
LogLevel warn
CustomLog /var/log/apache2/access.webtest.it.log combined
</VirtualHost>

File /etc/apache2/sites-available/webprova.it

<VirtualHost *:80 >
ServerAdmin webmaster@webprova.it
ServerName www.webprova.it
DirectoryIndex index.html index.php
DocumentRoot /var/www/webprova
<Directory "/var/www/webprova">
Order Deny,Allow
Allow from all
Options -Indexes
</Directory>
ErrorLog /var/log/apache2/webprova.it.log
LogLevel warn
CustomLog /var/log/apache2/access.webprova.it.log combined
</VirtualHost>

Ora i due siti sono configurati con impostazioni "normali", vediamo il loro significato:

NameVirtualHost *:80
Serve per definire su quale interfaccia di rete e su quale porta deve rimanere in ascolto l’host virtuale Apache, in questo caso rimane in ascolto su tutte le interfacce sulla porta 80

<VirtualHost *:80 >
Identifica l’apertura della sezione relativa alla configurazione dell’host virtuale, l’indicazione successiva a VirtualHost (*:80) deve essere identica a quella della direttiva NameVirtualHost

ServerAdmin webmaster@webtest.it
Indica l’indirizzo e-mail dell’amministratore del dominio

ServerName www.webtest.it
Rappresenta il nome FQDN del sito, è fondamentale scrivere bene questa voce altrimenti il nostro sito non sarà visibile

DirectoryIndex index.html index.php
Esprime l’ordine di ricerca di determinate pagine Web rappresentanti la home page quando viene fatta da un browser una richiesta del tipo www.webtest.it/ o www.webtest.it/test/, se in queste directory non esiste una pagina chiamata index.html o index.php (o qualsiasi altro nome file indicato nella direttiva DirectoryIndex), Apache restituirà un errore 403 Forbidden se usiamo la direttiva "Options -Indexes" (come effettivamente faremo), oppure, se questa direttiva non viene utilizzata, visualizzeremo i files presenti nella directory

DocumentRoot /var/www/webtest
Indica la directory in cui sono posizionati i file del nostro sito

<Directory "/var/www/webtest">
Identifica l’inizio della configurazione delle autorizzazioni per la directory del sito

Order Deny,Allow
Allow from all

Queste due righe stanno ad indicare che il sito è visibile a tutti

Options -Indexes
Come indicato in precedenza, questa opzione permette di visualizzare un errore 403 di accesso negato se si digita un indirizzo del tipo www.webtest.it/test/ ed in questa directory non esiste un file chiamato con uno dei nomi file indicati nella direttiva DirectoryIndex; se non si specifica questa opzione, sarà visibile il contenuto dell’intera directory, cosa da evitare.

ErrorLog /var/log/apache2/webtest.it.log
LogLevel warn
CustomLog /var/log/apache2/access.webtest.it.log combined

ErrorLog fornisce un percorso per il file di log contenente le segnalazioni di errore che incontra Apache, mentre LogLevel indica la verbosità delle operazioni di logging attraverso un sistema di livelli, di cui "warn" è uno dei più bilanciati; CustomLog identifica la posizione del file di log che registra gli accessi al sito Web.

Giunti qui, andiamo a creare i file di log che abbiamo specificato nei file di configurazione dei virtual hosts:

# touch /var/log/apache2/access.webtest.it.log
# touch /var/log/apache2/webtest.it.log
#
touch /var/log/apache2/access.webprova.it.log
# touch /var/log/apache2/webprova.it.log

dopodiché, bisogna abilitare i siti virtuali, e ciò è possibile tramite il comando a2ensite, il quale crea dei link simbolici nella cartella /etc/apache2/sites-enabled/ che puntano ai file di configurazione creati in precedenza nella cartella /etc/apache2/sites-available/:

# a2ensite webtest.it
# a2ensite webprova.it

ciò è necessario poiché nel file di configurazione di Apache (/etc/apache2/apache2.conf) vi è una direttiva che include i file presenti nella cartella /etc/apache2/sites-enabled/.

Ora non rimane altro che riavviare Apache ed avremo i nostri virtual hosts funzionanti.

Giunti qui, rimane da fare un’unica cosa, cioé installare e configurare PhpMyAdmin per poter gestire il proprio database MySQL tramite sito Web. Per installare PhpMyAdmin, possiamo utilizzare il comando

# apt-get install phpmyadmin

dopodiché, dobbiamo creare un alias su ogni sito sul quale vogliamo rendere disponibile PhpMyAdmin; l’alias si rende necessario poiché l’installazione di PhpMyAdmin viene effettuata nella directory /usr/share/phpmyadmin, per cui, o si fa l’alias, oppure si copia la directory phpmyadmin nella directory del sito, ma ciò non conviene, poiché:

  1. è un’operazione che dovremmo ripetere per ogni aggiornamento di PhpMyAdmin
  2. nel caso di più host virtuali che utilizzano PhpMyAdmin, dovremmo ripetere la copia per ogni host virtuale che utilizza PhpMyAdmin

per cui, è bene utilizzare un alias per ogni virtual host, che mappi una directory virtuale (ad esempio, /phpmyadmin) per ogni host virtuale che utilizza PhpMyAdmin. Configurare l’alias è molto semplice, prendendo ad esempio i file di configurazione dei due domini citati precedentemente, basta aggiungere questa riga dopo l’istruzione DocumentRoot:

Alias /phpmyadmin /usr/share/phpmyadmin

quindi, dopo aver chiuso e salvato il/i file di configurazione, basta far ripartire Apache per poter utilizzare PhpMyAdmin, la cui configurazione esula dagli scopi di questo articolo; in ogni caso, tenere presente che, se PhpMyAdmin è configurato con un livello di sicurezza ‘cookie’, nome utente e password richiesti per entrare in PhpMyAdmin, non sono altro che gli utenti definiti in MySQL, per cui, bisogna fare attenzione alle autorizzazioni che si assegnano ai vari database, onde evitare che certi utenti possano accedere a database non di loro competenza.

Link di riferimento
Gestione Moduli e Virtual Hosts di Apache2 su Debian e Ubuntu
HowTo: Configurazione dei Virtual Hosts (alias) con Apache2 su Debian ETCH

One response so far

Lug 27 2007

Richiesta di autenticazione tramite file .htaccess

Può capitare, avendo un sito web composto da diverse directory e/o sottodirectory, di dover consentire l’accesso ad una particolare directory solamente ad alcuni utenti. Avendo un web server come Apache su piattaforma Linux (le informazioni indicate di seguito le ho provate su una Debian Etch), è possibile utilizzare un file .htaccess, da creare nella directory a cui si vuole limitare l’accesso, per raggiungere lo scopo prefisso.

Il primo passo consiste appunto nella creazione del file .htaccess e nell’assegnazione dei corretti permessi al file stesso:

# touch /var/www/sito/dirProtetta/.htaccess
# chmod 644 /var/www/sito/dirProtetta/.htaccess

Fatto questo, editare il file .htaccess col proprio editor preferito inserendo queste righe:

AuthName "Area protetta"
AuthType Basic
AuthUserFile /var/www/sito/dirProtetta/.htpasswd
<Limit GET PUT POST>
Require valid-user
</Limit>

L’istruzione nella prima riga rappresenta il titolo della finestra di richiesta autenticazione, la seconda riga indica invece il tipo di autenticazione alla directory, cioé l’autorizzazione di tipo Basic, che consente il passaggio in chiaro del traffico di autenticazione, a differenza dell’autenticazione di tipo Digest; la terza riga specifica il percorso del file .htpasswd, che altri non è che il file contenente le accoppiate username -> password degli utenti a cui è consentito autenticarsi. Di seguito abbiamo il tag <Limit>, con gli attributi GET, PUT e POST che rappresentano le operazioni consentite in relazione alla directory (rispettivamente download, upload e invio informazioni tramite form), al cui interno vi è l’istruzione "Require valid-user" che dice ad Apache di consentire l’accesso alla directory solamente agli utenti riconosciuti come validi, cioé che hanno fornito le corrette credenziali d’accesso.

Eseguiti questi passaggi, bisogna creare gli utenti del caso tramite il comando htpasswd. La creazione del primo utente comporta anche la creazione del file .htpasswd, tramite questo comando:

# htpasswd -c /var/www/sito/dirProtetta/.htpasswd utente1

Digitato questo comando, verrà chiesta per due volte la password da assegnare all’utente, e contestualmente verrà creato il file .htpasswd nella directory specificata con l’opzione -c; a questo file vanno assegnati adeguate autorizzazioni, in particolare il gruppo www-data (il gruppo che contiene l’utente omonimo che esegue il demone apache2) dovrà poter accedere al file almeno in lettura:

# chown root:www-data /var/sito/dirProtetta/.htpasswd
# chmod 640 .htpasswd

Ora possiamo creare gli altri utenti in questo modo:

# htpasswd /var/www/sito/dirProtetta/.htpasswd utente2

Creati gli utenti, abbiamo fatto quasi tutto; l’ultimo passaggio consiste nel modificare la configurazione di Apache in modo tale che sia consentito l’accesso ai file .ht per la directory che vogliamo proteggere, infatti, almeno in Debian (non so se è così anche con altre distribuzioni), l’accesso ai file .ht è inibito per default, quindi bisogna dire ad Apache che vogliamo sovrascrivere questa impostazione limitatmente alla directory specifica. In particolare, cercare all’interno del file /etc/apache2/apache2.conf il tag <Files> in modo tale che la configurazione finale sia questa:

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

<Directory /var/www/sito/dirProtetta/>
    AllowOverride AuthConfig Limit
</Directory>

dove il tag <Directory> rappresenta appunto la sovrascrittura delle impostazioni date all’interno del tag <Files>.

E’ tutto, ora quando un utente accede a questa particolare directory del sito si ritroverà davanti alla richiesta di inserimento di username e password che Apache dovrà autenticare o meno.

No responses yet

Lug 07 2007

Gestire gli upload di file in ASP

Quando si realizza una pagina di caricamento file (upload) in ASP, intervengono diversi fattori che determinano il successo o meno del caricamento, in particolare, con file piuttosto grandi, è possibile avere dei problemi che possono dipendere dal fatto che, passato un determinato periodo di tempo, lo script ASP va in timeout prima che il file sia stato caricato completamente sul server Web, oppure, un altro fattore che entra in gioco è la dimensione massima del file che può essere caricato su un server Web.

Per quanto riguarda la regolazione del timeout dello script, è possibile utilizzare la proprietà Server.ScriptTimeout, che indica il tempo massimo - espresso in secondi - a disposizione dello script per la sua completa esecuzione, secondo questa forma:

Server.ScriptTimeout = 300

Con l’esempio indicato, uno script andrà in timeout dopo 300 secondi, ossia dopo 5 minuti.

La dimensione massima caricabile su un server Web IIS 6.0 su Windows Server 2003 invece va regolata editando il file c:\windows\system32\inetsrv\metabase.xml e impostando il valore del parametro "AspMaxRequestEntityAllowed", che assume il valore predefinito di 204800 byte (200Kbyte), alla dimensione desiderata, espressa sempre in byte. L’editing diretto di questo file però non è consentito se IIS è attivo, ma comunque è possibile modificare questo valore tramite l’esecuzione di uno script VBS in grado di variare questo parametro, seguendo questa sintassi:

cscript adsutil.vbs set w3svc/ASPMaxRequestEntityAllowed dimensione

dove al posto di dimensione va indicata la massima dimensione in byte consentita per i file caricati tramite upload. Fatta questa modifica va riavviato il servizio iisadmin tramite la console di gestione dei servizi di Windows Server oppure tramite il comando iisreset. Fatta questa operazione, la modifica è attiva ed è operativo il nuovo limite di caricamento file sul server Web.

Link di riferimento
Knowledge Base Microsoft

No responses yet

Apr 10 2007

Importare dati da file CSV ad un DB utilizzando ASP

Può capitare di dover importare dei dati in un database di un’applicazione partendo da un file Excel. In questi casi, può essere una buona soluzione convertire il file di Excel in un file di testo (ad esempio un file CSV) ed importare i dati presenti nel file di testo in una o più tabelle del nostro DB. In questo caso prendiamo in esame un’applicazione ASP che si poggia su un database MySQL, con il file di dati trasformato da Excel in CSV, coi campi delimitati dal ";". In MySQL esiste un comando, load data infile, che permette appunto di importare file di testo in una tabella a scelta, peccato che questa procedura non si adatti a tutte le situazioni, ad esempio, non funziona quando non si ha un accesso diretto al server Web, oppure se il file contiene dati che non vanno su un’unica tabella ma che, essendo un file di testo una tabella di un database "piatto", non ha un minimo di normalizzazione, da ricreare in fase di importazione.

Una situazione tipica può essere quella di un file di testo contenente una lista di dipendenti e delle relative aziende di appartenenza, infatti esistendo più dipendenti per ogni azienda, le informazioni relative ad ogni singola azienda vengono ripetute diverse volte, e quindi questi dati non possono essere importati in una singola tabella, ma dovranno essere posti in due tabelle, aziende e dipendenti, in relazione uno a molti; in questo caso, non può essere usata l’istruzione load data infile, poiché, a quanto ne so io, questo comando non supporta l’inserimento in due tabelle distinte. Intanto vediamo da quali campi è composto il file CSV e come questi campi verranno distribuiti nelle due tabelle "Dipendenti" e "Aziende":

File CSV

Cognome;Nome;Via;CAP;Localita;CodiceFiscale;NomeAzienda;
ViaAzienda;CAPAzienda;LocalitaAzienda;PartitaIVA

Tabella Dipendenti

idDipendente int not null auto_increment primary key
cognome varchar(30) not null
nome varchar(30) not null
via varchar(60)
CAP varchar(5)
localita varchar(60)
codiceFiscale varchar(16)
idAzienda int not null

Tabella Aziende

idAzienda int not null auto_increment primary key
nomeAzienda varchar(60) not null
viaAzienda varchar(60)
CAPAzienda varchar(5)
localitaAzienda varchar(60)
partitaIVA varchar(11)

A questo punto vediamo come impostare il codice vbscript della pagina ASP. Per prima cosa bisognerà aprire il file di testo che quindi dovrà essere posto in una cartella visibile del nostro server Web, utilizzando l’oggetto FileSystemObject per aprire il file e per scorrerlo; i primi dati a dover essere letti sono quelli relativi alle aziende, visto che poi dovrò associare i dipendenti all’azienda di appartenenza. Di seguito la prima parte del codice:

<%
Dim percorso, fileFSO, apriFile, rigaFile, arrRiga
‘dichiarazione delle variabili
Dim vNomeAzienda, vViaAzienda, vCAPAzienda, vLocalitaAzienda, vPartitaIVA
Dim conn, importTempAziende, importAziende, truncateTempAziende, queryAzienda, rsAzienda, importIscritti
Dim vidAzienda, vCognome, vNome, vVia, vCAP, vLocalita, vCodiceFiscale, vPartitaIVAAzienda
set conn = server.CreateObject("ADODB.Connection")
‘creazione dell’oggetto di connessione al database
conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; DATABASE=prova; UID=prova; PWD=prova; OPTION=3" ‘opzioni di connessione al DB
conn.Open ‘apertura della connessione al DB
percorso = Server.MapPath("filecsv.csv") ’si specifica il percorso relativo del file da aprire. Server.MapPath serve per convertire un percorso virtuale in un percorso fisico
set fileFSO = server.CreateObject("Scripting.FileSystemObject") ‘crea una nuova istanza dell’oggetto FileSystemObject
if fileFSO.FileExists(percorso) then ‘utilizzo - all’interno di una struttura condizionale if… then… else - il metodo FileExists per verificare se il file esiste
set apriFile = fileFSO.openTextFile(percorso, 1) ‘utilizzo il metodo openTextFile per aprire il file csv in sola lettura (il numero 1 significa l’apertura del file in sola lettura)
do until apriFile.AtEndOfStream ‘uso un ciclo per leggere riga per riga il file fino ad arrivare alla fine tramite la proprietà AtEndOfStream
rigaFile = apriFile.ReadLine ‘uso il metodo ReadLine per leggere una riga del file di testo e trasformarla in stringa
arrRiga = split(rigaFile, ";") ‘tramite la funzione split trasformo la stringa ottenuta tramite il metodo ReadLine in un array
vNomeAzienda = arrRiga(6) ‘assegno alla variabile vNomeAzienda il valore relativo al nome dell’azienda pescato nell’array creato precedentemente
vNomeAzienda = replace(vNomeAzienda, "’", "”") ’sostituzione dell’apice con un doppio apice per permettere l’inserimento nella tabella senza problemi
vViaAzienda = arrRiga(7)
vViaAzienda = replace(vViaAzienda, "’", "”")
vCAPAzienda = arrRiga(8)
vLocalitaAzienda = arrRiga(9)
vLocalitaAzienda = replace(vLocalitaAzienda, "’", "”")
vPartitaIVA = arrRiga(10)
%>

Ora abbiamo tutti gli elementi che ci servono per inserire i dati relativi alle aziende in una tabella di transito, infatti non è possibile inserire direttamente i dati nella tabella Aziende, poiché i dati sarebbero duplicati e quindi il database di fatto inutile, quindi di seguito verrà fatto in modo di inserire questi dati nella tabella "transitoAziende", e da qui si prenderanno i dati filtrati in modo da non avere record duplicati per inserirli nella tabella "Aziende".

<%
ImportTempAziende = "INSERT INTO tempAziende (nomeAzienda, viaAzienda, capAzienda, localitaAzienda, partitaIVA) " & _
VALUES (’" & vNomeAzienda & "’, ‘" & vViaAzienda & "’, ‘" & vCAPAzienda & "’, ‘" & vLocalitaAzienda & "’, ‘" & vPartitaIVA & "’)"
‘istruzione di inserimento dei dati prelevati dall’array nella tabella tempAziende
conn.Execute ImportTempAziende ‘esecuzione dell’istruzione SQL precedente
loop ‘termine del ciclo
end if ‘termine struttura condizionale
importAziende = "INSERT INTO aziende (nomeAzienda, viaAzienda, capAzienda, localitaAzienda, partitaIVA) " & _
SELECT nomeAzienda, viaAzienda, capAzienda, localitaAzienda, partitaIVA FROM tempAziende GROUP BY partitaIVA
‘istruzione per filtrare i dati dalla tabella tempAziende ed inserirli nella tabella aziende
truncateTempAziende = "TRUNCATE TABLE tempAziende" ‘istruzione per cancellare i dati di transito presenti all’interno della tabella tempAziende
conn.Execute importAziende ‘esecuzione dell’istruzione SQL definita nella variabile importAziende
conn.Execute truncateTempAziende ‘esecuzione dell’istruzione SQL definita nella variabile truncateTempAziende
set fileFSO = nothing ‘libero la memoria occupata dall’istanza fileFSO
%>

Con le istruzioni precedenti la procedura inserisce, riga per riga, i dati relativi alle aziende presenti nel file CSV nella tabella tempAziende, quindi fa in modo di filtrare i dati dalla tabella tempAziende ed eliminare i record duplicati tramite l’istruzione GROUP BY (utilizzando DISTINCT, se i dati non sono "perfetti", si rischia di non eliminare completamente i duplicati), quindi questi dati filtrati sono inseriti nella tabella aziende tramite un’unica istruzione SQL, "INSERT INTO SELECT"; infine, vengono cancellati i dati dalla tabella tempAziende essendo questi dati di natura temporanea. A questo punto bisogna inserire i dipendenti nella tabella "dipendenti". In primo luogo, dovrò riaprire il file "filecsv.csv" tramite il solito ciclo, ricreare l’array per ogni riga del file csv, ed "estrarre" dall’array i dati relativi ai dipendenti, e la partita IVA dell’azienda corrispondente per poter associare il dipendente all’azienda; come si può vedere, la prima parte del codice è identica alla parte precedente:

<%
set fileFSO = server.CreateObject("Scripting.FileSystemObject") ‘crea una nuova istanza dell’oggetto FileSystemObject
if fileFSO.FileExists(percorso) then ‘utilizzo - all’interno di una struttura condizionale if… then… else - il metodo FileExists per verificare se il file esiste
set apriFile = fileFSO.openTextFile(percorso, 1) ‘utilizzo il metodo openTextFile per aprire il file csv in sola lettura (il numero 1 significa l’apertura del file in sola lettura)
do until apriFile.AtEndOfStream ‘uso un ciclo per leggere riga per riga il file fino ad arrivare alla fine tramite la proprietà AtEndOfStream
rigaFile = apriFile.ReadLine ‘uso il metodo ReadLine per leggere una riga del file di testo e trasformarla in stringa
arrRiga = split(rigaFile, ";") ‘tramite la funzione split trasformo la stringa ottenuta tramite il metodo ReadLine in un array
vCognome = arrRiga(0) ‘assegno alla variabile vCognome il valore relativo al nome dell’azienda pescato nell’array creato precedentemente
vCognome = replace(vCognome, "’", "”") ’sostituzione dell’apice con un doppio apice per permettere l’inserimento nella tabella senza problemi
vNome = arrRiga(1)
vNome = replace(vNome, "’", "”")
vVia = arrRiga(2)
vVia = replace(vVia, "’", "”")
vCAP = arrRiga(3)
vLocalita = arrRiga(4)
vLocalita = replace(vLocalita, "’", "”")
vCodiceFiscale = arrRiga(5)

vPartitaIVAAzienda = arrRiga(10)
%>

Ottenuti i dati che ci servono, per ogni dipendente bisogna ricavare l’azienda di appartenenza, nel dettaglio significa fare una query sulla tabella Aziende cercando l’idAzienda corrispondente alla Partita IVA ricavata in precedenza. Se si fosse impostata la partita IVA come chiave primaria non sarebbe stato necessario dover fare questa query, ma in alcuni casi i dati che vengono forniti non sono poi così ben bonificati… Una volta ottenuto l’ID dell’azienda, è possibile inserire il dipendente nella tabella Dipendenti completo di Foreign Key, indispensabile per poter mettere in relazione la tabella Aziende con la tabella Dipendenti.

<%
queryAzienda = "SELECT idAzienda FROM aziende WHERE PI = ‘" & vPartitaIVAAzienda & "’" ‘definizione della query per ottenere l’idAzienda in base alla Partita IVA
set rsAzienda = server.CreateObject("ADODB.Recordset") ‘istanziazione recordset
rsAzienda.Open queryAzienda, conn, 3, 3 ‘apertura recordset
vidAzienda = rsAzienda("idAzienda") ‘assegnazione dell’ID dell’azienda alla relativa variabile
importIscritti = "INSERT INTO iscritti (cognome, nome, via, CAP, localita, codiceFiscale, idAzienda)  VALUES " & _
(’" & vCognome & "’, ‘" & vNome & "’, ‘" & vVia & "’, ‘" & vCAP & "’, ‘" & vLocalita & "’, ‘" & vCodiceFiscale & "’, " & vidAzienda & ")"
‘definizione dell’istruzione di inserimento dipendente
conn.Execute importIscritti ‘esecuzione dell’inserimento dipendente
loop ‘termine del ciclo
end if ‘termine struttura condizionale
set fileFSO = nothing ‘libero la memoria occupata dall’istanza fileFSO
rsAzienda.close ‘chiusura del recordset
set rsAzienda = nothing ‘libero memoria
conn.close ‘chiusura connessione al database
set conn = nothing ‘libero memoria
%>

Ora sono inseriti anche i dipendenti con indicata anche la loro azienda d’appartenenza. Siccome non sono esattamente un esperto di questi argomenti, ho affrontato la questione a modo mio, quindi molto probabilmente esistono modi più brillanti di risolvere il problema, nel mio caso questa soluzione ha l’indubbio pregio di funzionare. Chi volesse segnalare metodi migliori per affrontare la situazione può farlo tramite la pagina dei contatti.

No responses yet

Dic 29 2006

Cambiare dimensione massima dei file in upload in PHP

Per cambiare la dimensione massima dei file in upload su un sistema Windows Server 2003 con Apache e PHP (ma non dovrebbe cambiare nulla sui sistemi Linux), bisogna intervenire su alcune direttive nel file php.ini.
In particolare, cambiare i parametri memory_limit, post_max_size e upload_max_filesize secondo questa sintassi:

memory_limit = 16M
post_max_size = 5M
upload_max_filesize = 5M

In questo modo, si porta la dimensione massima dei file che il server Web può accettare in upload a 5MByte. Il valore memory_limit è impostato a 16MByte di default. Fatte queste modifiche, basta salvare il file php.ini e riavviare i servizi di Apache, in questo modo le nostre applicazioni Web sono pronte per accettare file in upload fino a 5MByte. Ovviamente, il valore usato nell’esempio è indicativo, è possibile cambiare questo valore a piacere.

No responses yet