Initiation à SDO
Introduction importante
SDO est une techno complexe. J'essaye de décortiquer son fonctionnement (régulièrement en plongeant dans le code de SDO), mais l'impression générale est que tout n'est pas figé.
Si vous êtes intéressé par cette technologie, vous pouvez utiliser ce tutorial comme point de départ pour creuser vous même un peu plus. Par contre pour l'instant, je ne conseille pas l'utilisation de SDO dans un cadre professionnel dans la mesure ou la techno n'est pas assez figée et l'API peu pratique (hum... ça n'engage que moi...)
Avant d'attaquer ce tutorial, il faut connaitre PDO et comprendre un peu à quoi sert la techno SDO. Le code fourni ci dessous est assez complexe pour un résultat assez ridicule. Il faut bien comprendre que cette techno n'est utile qu'à partir d'un certain niveau de complexité de l'application qu'on développe...
N'hésitez pas à m'envoyer vos remarques
Environnement
L'environnement utilisé est wamp server (outil sous windows permettant d'installer apache, php et mysql très facilement). Il faut installer une version récente pour avoir SDO partiellement installé.
Par ailleurs vous aurez besoin d'une base de données avec le dump suivant :
CREATE TABLE `member` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `login` VARCHAR( 100 ) NOT NULL , `password` VARCHAR( 30 ) NOT NULL , `email` VARCHAR( 200 ) NOT NULL ) ENGINE = innodb;
Installer SDO (wamp server)
- Installer la version 1.6.4 ou plus de wamp server
- dans php.ini, à la fin des extensions, ajouter :
- extension=php_sdo.dll
- extension=php_sdo_das_xml.dll
- allez télécharger sur PECL http://pecl.php.net/get/sdo-1.0.2.tgz
- décompressez le dans le répertoire WEBAPP/lib et renommez les sdo-1.0.2 en SDO
- faites pointer votre include_dir sur ce répertoire WEBAPP/lib
- Corriger le fichier SDO/DAS/Relational/UpdateNonContainmentReferenceAction.php en remplaçant <? par <?php (avec les versions de PHP que je vous fait utiliser, l'ancienne syntaxe ne fonctionne pas par défaut...)
- idem pour le fichier SDO/DAS/Relational/PDOConstants.colon.inc.php
Installer SDO (linux / unix)
vous aurez peut-être à installer autoconf (sous fedora : yum install autoconf.noarch)
Ensuite, il suffit de taper:
pear install sdo
Comme forcément rien ne marche directement avec cette librairie, il faudra sans doute déplacer les fichiers sdo.so et sdo_das_xml.so dans le répertoire extension_dir défini dans php.ini...
Voilà maintenant c'est installé...
Exemple simple
Le code en dessous est un exemple simple d'utilisation de SDO.
Je vous invite à décortiquer le code pour comprendre ce qui se passe. C'est très linéaire est un peu commenté. Les fonctions utilisées sont décrites dans la doc PHP
define("MYSQL_HOST","localhost"); define("MYSQL_PORT","3306"); define("MYSQL_DB_NAME","tutoriaux"); define("MYSQL_LOGIN","tuto"); define("MYSQL_PASSWORD",""); include_once("SDO/DAS/Relational.php"); function getPdo() { $pdo = new PDO("mysql:host=".MYSQL_HOST. ";port=".MYSQL_PORT. ";dbname=".MYSQL_DB_NAME, MYSQL_LOGIN, MYSQL_PASSWORD); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); return $pdo; } function getMemberDas() { //// // init tables //// $memberTable = array( "name" => "member", "columns" => array( "id", "login", "password", "email" ), "PK" => "id" ); $databaseDesc = array($memberTable); //// // parent-child relationships //// $metaDataDesc = array(); //// // Das creation //// $das = new SDO_DAS_Relational($databaseDesc,"member",$metaDataDesc); return $das; } // create DAS $das = getMemberDas(); // create PDO $pdo = getPdo(); //// // Create a member //// $root = $das->createRootDataObject(); $newMember = $root->createDataObject("member"); $newMember->login = "glou"; $newMember->password = "gla"; $newMember->email="philippe.levan@kitpages.com"; $das->applyChanges($pdo,$root); echo "<li>member created</li>\n"; //// // récupère la liste des membres //// $root = $das->executeQuery( $pdo, "select ". " id,". " login,". " password,". " email". " FROM member " ); echo "<li>Liste des membres</li>\n"; foreach ($root->member as $member) { echo "memberId=".$member->id. " ; login=".$member->login. " ; email=".$member->email."<br>\n"; } //// // efface les membres dont le login est "glou" //// $query = "SELECT ". " id,". " login,". " password,". " email". " FROM member ". " WHERE login=:login"; $stmt = $pdo->prepare($query); $root = $das->executePreparedQuery( $pdo, $stmt, array(":login"=>"glou") ); echo "<li>Effacement des membres</li>\n"; for ($j = count($root->member)-1 ; $j>=0 ; $j--) { echo "memberId=".$root->member[$j]->id." deleted<br>\n"; unset ($root->member[$j]); } $das->applyChanges($pdo,$root); //// // récupère la liste des membres après effacement //// $root = $das->executeQuery( $pdo, "select ". " id,". " login,". " password,". " email". " FROM member " ); echo "<li>Liste des membres après effacement :</li>\n"; foreach ($root->member as $member) { echo "memberId=".$member->id. " ; login=".$member->login. " ; email=".$member->email."<br>\n"; }
Conclusion
Pour l'instant, la technologie est trop peu figée et trop peu documentée. L'idéal serait que je continue ce tutorial avec un exemple faisant intervenir plusieurs tables et des relations, mais dans l'état actuel de SDO, je n'ai pas le temps de m'en occuper...
Avis aux amateurs :-)
Je rappelle ici les références :
Ajoutez vos propres commentaires :
