In questo articolo vedremo come sia possibile, da un'applicazione PHP, utilizzare il database relazionale in the cloud offerto dalla piattaforma di Windows Azure, che prende il nome di SQL Azure. Questo database sulla nuvola offre caratteristiche di alta disponibilità, scalabilità e georeplicazione.
Esistono alcune piccole differenze fra Microsoft SQL Server e Microsoft SQL Azure, che possono essere approfondite consultando la documentazione ufficiale sul sito di Windows Azure.
Negli scorsi due appuntamenti abbiamo realizzato una semplice applicazione Web che permette agli utenti di caricare foto e immagini in the cloud e di lasciare dei commenti. In questo articolo estenderemo ulteriormente questa Web application consentendo agli utenti di registrarsi al servizio tramite nome, cognome, username e password.
Creare un database SQL Azure
Per prima cosa avremo bisogno di creare un database SQL Azure nel quale memorizzare i dati. Windows Azure offre i database "as-a-service", quindi sarà possibile effettuare tutte le operazioni necessarie direttamente dall'interfaccia Web di gestione di Azure.
Accediamo a https://windows.azure.com
e in basso a sinistra scegliamo la scheda Database
.
Facendo clic sul nome della nostra subscription nell'elenco delle sottoscrizioni in alto a sinistra sarà possibile creare un nuovo database server cliccando sul tasto "Crea" del gruppo "Server" nella barra degli strumenti:
A questo punto, un rapido wizard ci guiderà nei pochi passi necessari per la creazione del nuovo server. Le informazioni da immettere, nell'ordine, saranno:
- L'area geografica in cui creare il server
- Il nome utente e la password per l'account amministratore del server
- Eventuali regole di firewall per l'accesso: qui è necessario sia abilitare la checkbox in basso, che consente ad altri servizi su Windows Azure di accedere al server, sia, per ora, aggiungere una nuova regola firewall che abiliti l'accesso dal nostro indirizzo IP corrente (in modo da poter utilizzare il database anche testando la nostra applicazione Web con l'emulatore)
Premendo il tasto "Fine" nell'ultima schermata del wizard, il server di database verrà creato in pochi secondi.
Non ci resta che creare un database all'interno di questo nuovo server. Scegliamo "Crea" dal gruppo di tasti "Database" nella barra degli strumenti in alto. Ci verrà chiesto di inserire un nome per il database e di scegliere edizione e dimensioni massime (per dettagli su edizioni, dimensioni e costi è possibile consultare il portale di Windows Azure nella sezione "Pricing"). Possiamo inserire i dati mostrati nella figura seguente e premere OK.
Gestire il database SQL Azure
Ora che abbiamo a disposizione un database SQL Azure, è necessario creare al suo interno le tabelle nelle quali memorizzare i dati. Possiamo collegarci al nostro database utilizzando SQL Server Management Studio, oppure più semplicemente attraverso il portale di gestione di SQL Azure. Approfitteremo di questa seconda opzione: dalla pagina del portale di Azure in cui abbiamo appena creato il nuovo database, selezioniamolo e premiamo il pulsante "Gestisci" nella barra degli strumenti in alto.
Ci verrà richiesto di inserire il nome utente e la password che abbiamo scelto per il server di database, quindi avremo accesso al portale Web di gestione di SQL Azure.
Da questa interfaccia Web possiamo lanciare direttamente lo script SQL per creare le tabelle per la nostra applicazione. Clicchiamo quindi su "Nuova…" in alto, inseriamo il codice seguente e premiamo il pulsante "Esegui".
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Users](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Nome] [nvarchar](max) NOT NULL,
[Cognome] [nvarchar](max) NOT NULL,
[Username] [nvarchar](max) NOT NULL,
[Password] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF)
)
GO
Abbiamo quindi ora una tabella "Users" pronta per ospitare i dati di registrazione degli utenti.
Preparazione dell'ambiente di sviluppo
Per interagire con un database SQL Azure (così come con un normale database SQL Server) è necessario installare e configurare il "SQL Server Driver for PHP". Possiamo fare uso del Microsoft Web Platform Installer per effettuare tutte le operazioni necessarie. Scarichiamo ed eseguiamo il Web Platform Installer (oppure lanciamolo direttamente se già presente sulla nostra macchina), quindi digitiamo "PHP" nella casella di ricerca in alto a destra.
Scegliamo di installare l'elemento "Driver Microsoft SQL v2.0 per PHP v.5.3 in IIS Express" premendo "Aggiungi" e clicchiamo il pulsante "Installa". Al termine della procedura, il nostro ambiente di sviluppo avrà tutti i componenti necessari all'esecuzione (è possibile che sia necessario riavviare il server IIS per utilizzare le modifiche appena apportate).
Per ulteriori informazioni sull'installazione del SQL Server Driver per PHP è possibile consultare la documentazione ufficiale.
Inserire dati su un database SQL Azure
Partiamo dall'applicazione PHP di esempio che abbiamo realizzato negli scorsi due appuntamenti. Cominciamo quindi a costruire la pagina PHP che permetterà agli utenti del nostro servizio di registrarsi, creando un file che chiameremo registrazione.php
Aggiungiamo prima di tutto un semplice form HTML in cui l'utente potrà inserire i suoi dati di registrazione:
<html>
<head>
<title>PHPSqlAzure</title>
</head>
<body>
<form method="post" action="registrazione.php">
<div>
<label for="txtNome">Nome:</label>
<input type="text" name="txtNome" />
</div>
<div>
<label for="txtCognome">Cognome:</label>
<input type="text" name="txtCognome" />
</div>
<div>
<label for="txtUsername">Username:</label>
<input type="text" name="txtUsername" />
</div>
<div>
<label for="txtPassword">Password:</label>
<input type="password" name="txtPassword" />
</div>
<div>
<input type="submit" value="Registrati" />
</div>
</form>
</body>
</html>
Una volta pronto il form possiamo aggiungere in cima al file il codice PHP per il salvataggio dei dati sul database SQL Azure:
<?php
$serverName = "tcp:fmsoojnacq.database.windows.net, 1433";
$connectionOptions = array("Database" => "phpsqlazure",
"UID" => "danielemidi@fmsoojnacq",
"PWD" => "mypassword");
$conn = sqlsrv_connect($serverName, $connectionOptions);
if($conn === false) die(print_r(sqlsrv_errors(), true));
if(isset($_GET['txtNome']))
{
$insertSql = "INSERT INTO Users (Nome, Cognome, Username, Password) ".
"VALUES (?,?,?,?)";
$params = array(&$_POST['txtNome'],
&$_POST['txtCognome'],
&$_POST['txtUsername'],
&$_POST['txtPassword'],);
$stmt = sqlsrv_query($conn, $insertSql, $params);
if($stmt === false) die(print_r(sqlsrv_errors(), true));
else echo "Registrazione completata con successo.</br>";
}
?>
Analizziamo le poche righe di codice che abbiamo inserito, nel dettaglio:
- Viene aperta una connessione al server di database SQL Azure specificando l'indirizzo del server e la porta (1433), nonché il nome del database e i dati di accesso che abbiamo scelto in fase di creazione sul portale di gestione di Windows Azure
- Verifichiamo se l'utente sta tentando di salvare dei nuovi dati (attenzione: non stiamo facendo attenzione alla validazione dei dati perché esula dagli scopi di questo articolo, ma in un sito reale sarà molto importante verificare la correttezza di tutti i dati inseriti dall'utente)
- Costruiamo la query SQL per l'aggiunta di una nuova riga al database degli utenti
- Riempiamo un array con i dati provenienti dalle caselle di testo
- Lanciamo la query sul database server e verifichiamone l'esito, dandone conferma all'utente
Nota: Questo codice è puramente a titolo esemplificativo e pertanto non è adatto per applicazioni reali in ambiente di produzione a causa di alcuni significativi problemi di sicurezza. Primo fra tutti, per tenere l'esempio più semplice possibile, non viene effettuata alcuna cifratura della password scelta dall'utente prima di persisterla sul database, pratica assolutamente da evitare per qualunque Web application reale.
Leggere dati da un database SQL Azure
Una volta completata la parte di codice relativa all'aggiunta di nuove righe al database, non resta che scrivere le poche righe che vadano a leggere i dati e li mostrino all'utente.
È sufficiente inserire il seguente frammento di codice dopo il form HTML e prima del tag di chiusura </body>
:
<?php
$sql = "SELECT * FROM Users ORDER BY Cognome";
$stmt = sqlsrv_query($conn, $sql);
if($stmt === false) die(print_r(sqlsrv_errors(), true));
if(sqlsrv_has_rows($stmt)) {
?>
<table>
<tr>
<td>Cognome</td>
<td>Nome</td>
<td>Username</td>
</tr>
<?php
while($row = sqlsrv_fetch_array($stmt)) {
print("<tr><td>".$row['Cognome']."</td>");
print("<td>".$row['Nome']."</td>");
print("<td>".$row['Username']."</td></tr>");
}
?>
</table>
<?php }
Il codice appena scritto si può comprendere molto facilmente:
- Costruiamo una query SQL che ottenga tutte le righe dal database ordinandole per cognome
- Eseguiamo questa query e costruiamo una tabella HTML che mostri riga per riga tutti i dati ottenuti dal database (evitando per sicurezza di mostrare la password dell'utente in chiaro)
Esecuzione e conclusioni
La nostra applicazione ora è completa e possiamo eseguirla sia nell'ambiente di emulazione locale di Windows Azure che direttamente sulla piattaforma cloud vera e propria.
Nel caso in cui il testing avvenga in locale, l'accesso al database SQL Azure da remoto è possibile solo se fra le regole di firewall specificate in fase di creazione del database è stato abilitato il proprio indirizzo IP corrente. È possibile in ogni momento aggiungere o aggiornare tali regole di firewall dal portale di gestione di Windows Azure per riflettere il proprio IP attuale ed avere quindi accesso al database SQL Azure anche dal proprio computer.
L'applicazione completa, una volta lanciata e testata con alcuni dati di prova, dovrebbe quindi apparire simile a quanto mostrato nello screenshot seguente: