Archive for the ‘Programmazione’ Category

Validare campi di input con php e le espressioni regolari

Molto spesso ci si trova a dover lavorare su campi di input e controllarne l’esattezza. In questo articolo vedremo come validare, tramite le espressioni regolari, tre tipi di dato che spesso si trovano nei form delle pagine html, ovvero l’email, il codice fiscale e la partita IVA. Il controllo che viene effettuato non controlla che essi siano corrispondenti a verità, ad esempio, non verifica che l’email esista, ma solo che è scritta nel formato corretto.

Per prima cosa impostiamo l’espressione per il controllo sotto forma di funzione:

 function controlla($stringa)  {
  $pattern="...."; //vedremo tra poco cosa inserire
  if(preg_match($pattern, trim($stringa)))
    return true;
  else
    return false;
}

Come si può notare la funzione è di tipo booleano, restituisce true se la stringa è conforme a un modello predefinito (pattern) altrimenti restituisce false. Quello che inseriremo nella variabile $pattern dipenderà dal tipo di controllo che vogliamo effettuare. Per effettuare il controllo sull’indirizzo email la variabile dovrà essere del tipo:

$pattern="^([a-z0-9_\.-])+@(([a-z0-9_-])+\\.)+[a-z]{2,6}$";

per il codice fiscale il pattern sarà:

$pattern="^[a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]$";

mentre, infine, per validare una partita IVA il pattern sarà:

$pattern="^[0-9]{11}$";

Per effettuare il controllo basterà una semplice condizione:

if(controlla($dato)){
echo "email/cf/piva corretti";
else
echo "Ricontrolla i dati";

Visualizzare località in Google Maps da coordinate inserite in un database

Posto questo articolo per un problema che mi ha fatto dannare per qualche sera. Avevo degli indirizzi in un database da convertire tramite geocoding in coordinate e quindi visualizzarli in google maps. Problema: non riuscivo ad avere un comportamento coerente delle visualizzazioni a ogni caricamento della pagina… Perciò ho cambiato il codice inserendo nel DB non solo l’indirizzo ma direttamente le coordinate. Lo script proposto avrà una parte php per l’inserimento delle coordinate nel DB e una parte javascript per la visualizzazione della mappa.

Per prima cosa vediamo come fare l’inserimento di un indirizzo nel DB utilizzando la classe geocoder5 che ho trovato al questo indirizzo.  Supponiamo di aver inserito i valori che ci interessano (via, cap, città, proviancia ed, eventualmente, nazione) in un form e di riprenderli in un file che li elabora.

require("geocoder5.class.php");

//inseriamo la nostra apiKey
$gmpKey = "tua apiKey";
$data = array();

//la variabile sede contiene tutti i campi sopra citati
array_push($data, addslashes($sede));
$test = & new geocodeaddr($data,$gmpKey); //istanzio il nuovo oggetto
$geocodeResults = $test->getAddress(); //richiamo la funzione
$a=0;

//controllo che l'indirizzo sia stato trovato altrimenti visualizzo l'errore
$controlla=$test->errorMsg1;
if ($controlla=='')
foreach ($geocodeResults as $rowResult){

//prendo i valori solo alla prima iterazione
if($a==0){
$query="INSERT INTO mappa (sede, latitudine, longitudine) VALUES( '$sede', '".$rowResult['lat']."', '".$rowResult['lng']."');";
mysql_query($query) or die(mysql_error());
}

$a++;
}
else
echo $test->errorMsg1;
} ?>

Il codice fin qua è molto semplice, stiamo solamente utilizzando la classe per tradurre l’indirizzo (che ricordo deve essere possibilmente nella forma via, cap, città, proviancia ed, eventualmente, nazione) in coordinate geografiche e inseriamo tali dati in una tabella del DB. Inoltre vi è la possibilità di gestire l’eventuale errore (indirizzo non trovato) personalizzandolo a vostro piacimento .

Passiamo adesso alla visualizzazione della mappa. Per prima cosa bisogna recuperare i dati dal database e inserirli in un vettore; avremo tre vettori: uno per l’indirizzo (lo useremo come descrizione nella nuvoletta che compare cliccando sopra un punto ben preciso), uno per la latitudine e uno per la longitudine. Salto questa parte che è abbastanza semplice e passiamo al resto del codice.

<script src="http://maps.google.com/maps?file=api&amp;dev=2&amp;hl=it&amp;key="<span style="color: #888888;">tuaKey" type="text/javascript"></script>
<script type="text/javascript">
//< ![CDATA[</code>

var map = null;

<span style="color: #ccffcc;"><span style="color: #333399;">function load()</span> </span>{
if (GBrowserIsCompatible()) {

map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());   /* pannellino in alto a sx x ingrandire o diminuire lo zoom */
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(41.90, 12.49), 5);  /* centro la mappa sull'italia */
geocoder = new GClientGeocoder();    /* oggetto che mi consente di comunicare col server gg x ottenere lat e log degli indirizzi*/

}
}//load

<span style="color: #333399;">function createMaker</span>(infos, lat, lon){

var point;
point = new GLatLng(lat,lon); //creo il punto
map.addOverlay(createMarker(point, infos)); //aggiunge il punto alla mappa

}

<span style="color: #333399;">function createMarker</span>(point, infos)
{
var icona = new GIcon();
icona.image = "img/marker.png"; //scelgo il puntatore
icona.iconSize = new GSize(12, 20);
icona.iconAnchor = new GPoint(6, 20);
icona.infoWindowAnchor = new GPoint(6, 20);
icona.shadowSize = new GSize(24, 20);

// Variabile marker
var marker = new GMarker(point, icona);

// Crea listener per il click sull'oggetto
GEvent.addListener(marker, "click", function()
{
marker.openInfoWindowHtml(infos);
});

return marker;
}

<span style="color: #333399;">function showAll()</span>{

var infos=Array(
< ?php
$b=0;
while($b<(count($x)-1)){
echo "$indirizzi[$b]";
if($b!=(count($indirizzi)-2)) echo ",";
$b++;
}//while1
?>
);

var latitudine=Array(
< ?php
$c=0;
while($c<(count($latitudine)-1)){
echo "$latitudine[$c]";
if($c!=(count($latitudine)-2)) echo ",";
$c++;
}//while2
?>
);

var longitudine=Array(
< ?php
$d=0;
while($d<(count($longitudine)-1)){
echo "$longitudine[$d]";
if($d!=(count($longitudine)-2)) echo ",";
$d++;
}//while3
?>
);

for(var i=0; i<indirizzi .length; i++) createMaker(infos[i], latitudine[i], longitudine[i]);

}//showAll
//]]>
</indirizzi></script>

La funzione load() ha il compito di istanziare un oggetto del tipo GMap2 che è quello che ci permette di comunicare con il server di google per ottenere i servizi necessari al nostro scopo. Successivamente verrà richiamata la funzione showAll() che ha il compito di trasformare gli array php in array javascript per passarli alla funzione createMaker. Quest’ultima funzione verrà richiamata più volte per quante sono le località da visualizzare nella mappa.

La funzione createMaker deve creare, per ogni coppia di coordinate geografiche, un punto per la mappa che verrà aggiunto dalla funzione addOverlay della classe GMap2 . Tale funzione accetta in ingresso, però, un oggetto di tipo GMarker e, per ottenere tale oggetto, richiamiamo la funzione createMarker. All’interno di tale funzione possiamo definire l’icona (un’immagine a nostra scelta) da utilizzare e le sue proprietà, ma lo scopo principale è quello di creare il marker passandogli il punto e le informazioni da visualizzare nella relativa nuvoletta. Nell’esempio riportato la nuvoletta delle informazioni viene visualizzata al click del mouse sull’icona ed è gestita da GEvent.addListener.

Supponiamo di inserire il codice appena visto in un file chiamato mappa.php, per terminare il nostro script non ci resta che richiamare le funzioni al caricamento della pagina:

<body onLoad="load(); showAll();" onUnload="GUnload()">

Se volessimo integrare la mappa in una nostra pagina web a parte basta inserire il codice:

<iframe align="middle" width="430" height="450" frameborder="0" src="mappa.php">

nel punto della pagina in cui vogliamo visualizzare la mappa e il gioco è fatto.

SHORT – Effettuare un redirect 301 tramite .htaccess (mod_rewrite) o PHP

Capita spesso di dover modificare l’indirizzo di una pagina web, ad esempio, nei cambi di dominio per reindirizzare al nuovo dominio; proprio in questi casi abbiamo bisogno di indicare che lo spostamento di indirizzo è permanente, così che anche i motori di ricerca modifichino il loro database. Il metodo migliore per effettuare tale operazione è il cosiddetto redirect 301. Il redirect 301 può essere implementato in diverse maniere in base al linguaggio, noi ne vedremo solo 2.

Una prima soluzione è quella di utilizzare la funzione header() di php nel seguente modo:

<?
header( “HTTP/1.1 301 Moved Permanently” );
header( “Location: http://www.nuovo-indirizzo.com” );
?>

Se però il web server utilizzato è Apache con il modulo mod_rewrite attivo allora la soluzione ottimale è senza dubbio utilizzare un file .htaccess configurato nel seguente modo:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^tuodominio.it [NC]
RewriteRule ^(.*)$ http://www.tuodominio.it/$1 [L,R=301]
Redirect permanent /vecchia-pagina.php http://www.nuovo-link.it
</IfModule>

Questo codice non fa altro che impostare su tuodominio.it un rewrite 301 dalla pagina /vecchia-pagina.php (che può essere l’index se si vuole reindirizzare l’url principale) alla pagina http://www.nuovo-link.it (in questo caso ci va tutto l’url).


Controllo di dati inseriti da form html

Il controllo dei dati inseriti dall’utente può essere effettuato sia lato client attraverso javascript (al submit dell’utente) o lato server.  In questo articolo vedremo come effettuare un controllo molto semplice sui dati attraverso PHP.

Supponiamo di avere un form di questo tipo:

<?php

if(isset($_SESSION['errore'])){

echo $_SESSION['errore'];

unset($_SESSION['errore']);

}

?>

<form name="mioForm" action="inoltra.php" method="post" >

<table width="420" border="0" cellspacing="2" cellpadding="2" >

<tr>

<td><label for="nome">Nome*</label></td>

<td><input type="text" name="nome" id="nome" size="20" maxlength="40" value="<?php

if(isset($_SESSION['nome'])){

echo $_SESSION['nome'];

unset($_SESSION['nome']);

}

?>"/></td>

</tr>

<tr>

<td><label for="password">Password*</label></td>

<td><input type="password" name="password" id="password" size="20" maxlength="40" value="<?php

if(isset($_SESSION['password'])){

echo $_SESSION['password'];

unset($_SESSION['password']);

}

?>"/></td>

</tr><input type="submit" value="Invia" />

</form>

Per adesso commentiamo solo il fatto che il form è composto da 2 campi: nome e password. I dati verranno passati alla pagina inoltra.php tramite il metodo POST;  tale pagina effettueremo il controllo, vediamo una parte di codice:

<?php session_start();

if (isset($_POST['nome']) && $_POST['nome']!=""){

$_SESSION['nome']=(string)$_POST['nome'];

$nome=$_SESSION['nome'];

}else{

$_SESSION['errore']='<p><strong>ERRORE: completare il campo "Nome"</strong></p>';

//ricavo l'URL della pagina di provenienza

$url = $_SERVER['HTTP_REFERER'];

//effettuo il reindirizzamento

header("Location: $url");

break;

}

if (isset($_POST['password']) && strlen($_POST['password'])<4){

$_SESSION['password']=(string)$_POST['password'];

$password=$_SESSION['password'];

}else{

$_SESSION['errore']='<p><strong>ERRORE:  il campo "Password" deve essere di almeno 4 caratteri</strong></p>';

$url = $_SERVER['HTTP_REFERER'];

header("Location: $url");

break;

} ?>

Il codice è molto semplice. Con un if controlliamo che il dato passato sia settato e non sia un campo vuoto, se la condizione è verificata allora inserisco il valore del dato passato sia in una variabile si sessione che in una variabile locale (è una scelta soggettiva, io preferisco usare le variabili di sessione solo tra pagine e poi utilizzare variabili locali per tutti gli altri scopi); il controllo su una variabile vuota si può anche fare tramite la funzione empty(). Per quanto riguarda il campo password ho effettuato il controllo sulla lunghezza della stessa che deve, in questo caso, essere formata da almeno 4 caratteri.

Se almeno un controllo non va a buon fine si inizializza un’altra variabile di sessione riportante l’errore riscontrato, si richiama l’indirizzo della pagina di provenienza (molto utile se il form è inserito in più di una url), si fa il redirect alla pagina suddetta e infine si blocca l’esecuzione dello script. Senza l’istruzione break verrà fatto il reindirizzamento dopo che lo script sarà eseguito completamente, quindi verranno eseguite eventuali query o altre operazioni su dati incompleti o mancanti.

Ritorniamo alla pagina contenente il form. Se è la prima volta che si arriva al form il codice php non contribuirà a dare nessun risultato perché le variabili di sessione non sono ancora state inizializzate. Nel caso in cui il form sia già stato compilato ma in maniera incompleta, la prima operazione php è la visualizzazione dell’errore riscontrato prima del form così da avvisare l’utente dell’errore. Successivamente le sessioni vengono utilizzate per immettere nei campi i valori precedentemente immessi, velocizzando quindi, in caso di errore, la compilazione dei campi da parte dell’utente. Alla fine di ogni operazione viene de-allocata la variabile di sessione per evitare che essa sia visualizzabile ogni volta all’arrivo del form dello stesso utente.

Naturalmente il controllo visto ora è un controllo minimale che tende solo a verificare che l’utente abbia inserito dei dati e che essi rispettino una certa lunghezza; controlli più estesi si potrebbero fare sul contenuto del campo attraverso le espressioni regolari. In un altro articolo vedremo come usare le espressioni regolari e come modificare il contenuto dei dati sia per motivi di sicurezza che per evitare errori nell’utilizzo del database.