J’ai récupéré la semaine dernière un token de test pour SQL Azure (lien d’inscription à la CTP de SQL Azure), et comme j’étais en train de regarder le driver SQL Server pour PHP, j’ai fait un petit test pour combiner les deux.

 

  • Création de Northwind dans SQL Azure.

J’ai un peu retouché le script de création de Northwind (j’ai repris celui fourni pour SQL 2000 !) pour prendre en compte quelques différences entre SQL Azure et SQL 2000 (disparition de certains types obsolètes genre Image et Text, et moins d’instructions DDL)  et créé la base de données directement depuis le portail (http://sql.azure.com). Pour l’exécution du script j’ai pris SQL Server Management Studio. Dans la version actuelle de SQL Azure on ne peut pas se connecter directement avec l’explorateur d’objets, mais en exécutant une nouvelle requête on peut fournir les infos de connexion et exécuter des scripts sans difficulté :

image

Le script de création retouché :

 

  • Installation de PHP et du driver pour SQL Server

J’ai un peu joué avec vingt façons de faire donc je ne vous donnerai pas de recette miracle, mais le Web Platform Installer devrait fonctionner pour l’installation de PHP. J’ai installé une 5.3 et une 5.2.10 (toutes les deux en version non threadsafe, puisque ça se marie bien avec FastCGI). Pour le driver PHP SQL Server vous le trouverez sur CodePlex, les instructions d’installation sont claires.

 

  • Utilisation du driver pour attaquer une base SQL Express 2008

Je suis certain que le code est bourré de maladresses, mais c’est un premier essai. A noter que j’ai pris une authentification par login/password, de façon à pouvoir porter le code directement pour SQL Azure (qui ne supporte pas encore d’authentification fédérée) :

 

<h1>Test de connexion sql server</h1>
<?php
// Infos de connexion
  $server = "localhost\sqlExpress";
  $user = "monuser";
  $pass = "monMotDePasse";
  $database = "Northwind";

// connexion a la base
  $connectionoptions = array(
  "Database" => $database, 
  "UID" => $user, 
  "PWD" => $pass,
  "MultipleActiveResultSets" => "0");
  $conn = sqlsrv_connect($server, $connectionoptions)
    or die ( print_r( sqlsrv_errors() ));

// Creation et execution de la requete
  $tsql = "SELECT * from Employees";    
  $stmt = sqlsrv_query( $conn, $tsql);
  if( $stmt === false )
  {
       echo "Impossible d'executer la requete.</br>";
       die( print_r( sqlsrv_errors()));
  }

// Affichage des resultats
  while( $row = sqlsrv_fetch_array($stmt))
  {
    echo "Nom : ".$row["FirstName"].", ";
    echo "Prenom : ".$row["LastName"]."<br/>";
  }


// Un peu de menage
  sqlsrv_free_stmt( $stmt);
  sqlsrv_close( $conn);
?>

 

image

 

A noter : j’ai désactivé MultipleActiveResultSet qui ne fouctionne pas sur Sql Azure avec les versions que j’ai, mais je n’ai pas creusé plus les raisons. Le résultat de cette page n’est pas superimpressionnant, mais ça fonctionne pas mal:

 

  • Utilisation du driver pour attaquer SQL Azure

Modulo les petites précautions prises plus haut (retouche du script, passage de login/password, et désactivation de MARS), il n’y a pas de modifications à apporter au script, j’ai juste retouché 3 lignes :

<h1>Test de connexion sql azure</h1>
<?php
// Infos de connexion
  $server = "monserveur.ctp.database.windows.net";
$user = "monuser@monserveur"; $pass = "monMotDePasse"; $database = "Northwind"; …

 

image

Le résultat, sans grande surprise :

 

Un dernier détail : puisque nous ne sommes plus dans un périmètre sûr, il est malsain de passer un username/password en clair. Modifiez votre chaine de connexion pour demander un chiffrement quand vous travaillez sur SQL Azure :

// connexion a la base
  $connectionoptions = array(
  "Database" => $database, 
  "UID" => $user, 
  "PWD" => $pass,
  "MultipleActiveResultSets" => "0",
  "Encrypt" => "1");
  $conn = sqlsrv_connect($server, $connectionoptions)
    or die ( print_r( sqlsrv_errors() ));