Configurer la connexion à SQL Server 2008 Express avec Zend

| VAUDIN Michael | Olivier Van Hoof (ovh) | poulaid |

Vous verrez dans cet article comment configurer une connexion à une base de données SQL Server 2008, avec le framework Zend.
Commentez ♪

- Titre : Configurer la connexion à SQL Server 2008 Express avec Zend

- Auteurs : VAUDIN Michael, Olivier Van Hoof (ovh), poulaid

- Parution : 5 octobre 2010

- Mise à jour : 22 août 2013

- Licence : Copyright ® 2010 Astyan. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1. Prérequis

- 2. Installation dudit driver

- 3. Connexion à la base de données avec le driver natif

- 4. Connexion avec Zend_Db_Table en utilisant le driver PDO

- 5. Remerciements

1 - Prérequis

Tout d'abord, il faut télécharger le driver PHP pour SQL SERVER 2008 à cette adresse : Driver SQLSRV2.0.

Il faut aussi avoir Wamp (version2.0i) ou un autre server d'installé, ainsi que Zend configuré comme décrit dans mon autre tutoriel (« Installer le framework Zend en 15 minutes »).

Il vous faut également l'un des systèmes suivants :

- Windows 7 ;

- Windows XP Service Pack 3 ;

- Windows Vista Service Pack 1 ou plus récent ;

- Windows Server 2008 ;

- Windows Server 2008 R2 ;

- Windows Server 2003 Service Pack 1.

On peut maintenant passer à la suite.

2 - Installation dudit driver

Double-cliquez sur le fichier téléchargé « SQLSRV2.0.EXE », vous devriez voir :

Cliquez sur « Yes », choisissez ensuite le répertoire d'extraction des fichiers :

Les fichiers ont été extraits dans C:\wamp\bin\php\php5.3.0\ext.

Quittez Wamp (clic droit > exit) :

Relancez Wamp, puis faites un clic gauche sur l'icône, et allez dans PHP > PHP Extensions.

Vous devriez voir l'image suivante :

(quelques extensions ne seront pas cochées chez vous, c'est normal)

Vous avez maintenant le choix entre six nouvelles extensions :

- php_sqlsrv_52_nts_vc6.dll (1) ;

- php_sqlsrv_52_ts_vc6.dll (2) ;

- php_sqlsrv_53_nts_vc6.dll (3) ;

- php_sqlsrv_53_ts_vc6.dll (4) ;

- php_sqlsrv_53_nts_vc9.dll (5) ;

- php_sqlsrv_53_ts_vc9.dll (6) ;

52 et 53 correspondent à la version de PHP que l'on utilise, c'est-à-dire 5.3.0 dans ce tutoriel ; les extensions (1) et (2) fonctionnant avec la version 5.2.* de PHP, elles ne nous intéressent donc pas ici.

Si le nom du fichier pilote contient « vc9 », il doit être utilisé avec une version de PHP compilée avec Visual C++ 9.0. S'il contient « vc6 », il doit être utilisé avec une version de PHP compilée avec Visual C++ 6.0.

Nous utilisons une version de PHP compilée avec Visual C++ 6.0, les extensions (5) et (6) ne sont donc pas pour nous.

Il ne reste que les extensions (3) et (4) qui sont respectivement « non thread safe » et « thread safe », le choix entre ces extensions dépend de la .dll PHP qui est présente dans le dossier : C:\wamp\bin\php\php5.3.0.

Personnellement, j'ai le fichier php5ts.dll, j'ai donc choisi la version thread-safe (4) (si vous avez le fichier php5.dll, l'extension (3) est faite pour vous !).

Cliquez donc une fois sur la ligne « php_sqlsrv_53_ts_vc6 », attendez quelques secondes, puis cliquez sur « Restart All Services ».

Vous devriez maintenant voir à gauche de la ligne, ça signifie que l'extension est lancée.

Lancez maintenant votre IDE préféré pour tester la connexion à votre base de données.

3 - Connexion à la base de données avec le driver natif

Une fois votre IDE lancé, vous avez deux possibilités pour vous connecter :

- première possibilité :

Allez dans le fichier « application.ini », qui se trouve dans le dossier Application/configs de votre projet et tapez les lignes suivantes :

En remplaçant bien sûr le nom d'hôte (ASTYAN-PC\SQLEXPRESS) par le nom de votre PC ou une adresse IP suivie de  « \SQLEXPRESS » si vous êtes sous SQL SERVER 2008 EXPRESS, sinon mettez le nom du moteur après le « \ »,

ex. : ASTYAN-PC\EXPRESS2008R2 ;

Testez ensuite la connexion à la base de données en utilisant votre DbTable,

Ex. : DbTable Medecin ;

$_name représente le nom de la table (ici Medecin) ;

Je n'entrerai pas plus dans les détails de ce côté-là (ce n'est pas un tutoriel de Zend).

- deuxième possibilité de connexion :

dans n'importe quelle page PHP de votre projet, tapez ceci (en modifiant ASTYAN-PC par votre base de données).

<?php
$config=array(
'Database'=>'nomdelabase',
'UID'=>'logindelabase',
'PWD'=>'motdepassedelabase'
);
$connect=sqlsrv_connect('ASTYAN-PC\SQLEXPRESS',$config);
?>

Et voilà vous êtes connecté, vous pouvez ensuite effectuer une requête comme ceci :

<?php

$result=sqlsrv_query($connect,'SELECT * FROM matable');
while($row=sqlsrv_fetch_array($result))
{
echo $row['nomcolonnedematable'];
}

?>

4 - Connexion avec Zend_Db_Table en utilisant le driver PDO

PDO est la manière moderne de s'adresser aux bases données en PHP depuis la version 5, en offrant une couche orientée objet standard commune à tous les moteurs de base de données. D'ailleurs beaucoup de bibliothèques de bases de données de haut niveau s'appuient dessus. Pour plus d'informations je vous invite à lire l'excellent article comprendre PDO.

Pour utiliser une base de données SQL Server via PDO, Zend Framework propose la classe Zend_Db_Adapter_Pdo_Mssql. Malheureusement celle-ci s'appuie sur un ancien driver PDO. Pour utiliser le nouveau driver PDO de Microsoft, il suffit de modifier la manière de se connecter au driver natif. En parcourant la documentation, on peut lire que la chaîne de connexion (DSN) doit être au format suivant : sqlsrv:server=(local);Database=mabase. « (local) » est une syntaxe particulière qui remplace localhost, tout autre serveur s'écrit normalement, par exemple : sqlsrv:server=192.168.1.2;Database=mabase. Sachant cela, nous pouvons dériver la classe Zend_Db_Adapter_Pdo_Mssql et surcharger la méthode _dsn() qui se charge de construire la chaîne de connexion PDO.

library/Application/PDO/SqlSrv.php

class Application_PDO_SqlSrv extends Zend_Db_Adapter_Pdo_Mssql {
/**
* PDO type.
*
* @var string
*/
protected $_pdoType = 'sqlsrv';

/**
* Creates a PDO DSN for the adapter from $this->_config settings.
*
* @return string
*/
protected function _dsn()
{
// baseline of DSN parts
$params = $this->_config;
$dsn = 'sqlsrv:server=';
if (isset($params['host'])) {
$dsn .= $params['host'];
}

$dsn = str_ireplace('localhost', '(local)', $dsn);

if (isset($params['port']) && !empty($params['port'])) {
$dsn .= ',' . $params['port'];
}
if (isset($params['dbname']) && !empty($params['dbname'])) {
$dsn .= ';Database=' . $params['dbname'];
}

return $dsn;
}
}

Il faut aussi changer l'attribut $_pdoType qui doit correspondre au nom système du driver utilisé : « pdo_sqlsrv » devient donc « sqlsrv ».

Pour utiliser automatiquement notre nouvel adaptateur, il suffit de préciser le namespace dans le fichier de configuration application/configs/application.ini :

application/configs/application.ini

resources.db.adapter                               = "pdo_sqlsrv"
resources.db.params.adapterNamespace               = "Application"
resources.db.params.host                           = "localhost\SQLEXPRESS"
resources.db.params.username                       = "admin"
resources.db.params.password                       = "motDePasse"
resources.db.params.dbname                         = "nomBase"

Comme vous pouvez le constater, la configuration ne change qu'à deux endroits par rapport à la version précédente : le nom de l'adaptateur (pdo_sqlsrv) et le namespace pour utiliser notre classe. Cela suffit à Zend Framework pour retrouver notre classe dans library/Application/PDO/SqlSrv.php.

On peut dès lors tester avec une classe modèle toute simple :

application/models/Users.php

class Application_Model_Users extends Zend_Db_Table_Abstract
{
protected $_name = 'Users';
protected $_primary = array('id');
}

Et le test est tout aussi trivial :

$users = new Application_Model_Users();
Zend_Debug::dump($users->fetchAll());

Ce bout de code affiche tous les enregistrements de la table users.

5 - Remerciements

Je tiens à remercier tout particulièrement Olivier Van Hoof pour son aide dans la publication de cet article, ainsi que mahefasoa pour sa relecture assidue.