Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PEAR_DATAOBJECT


Information sur le tutorial

Catégorie :Class et Objet ( POO ) Date de création : 17/05/2005 16:51:55 Vu : 8 172 fois

Note :
6,5 / 10 - par 4 personnes
6,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

DataObject est une couche d'abstraction de base de donnees gerant les tables comme une classe object...  elle permet de se connecter a n'importe quelle base de donnees en gardant les memes fonctions donc inutile de changer le code (Mysql, PostGrepSql, Oracle, ODBC, ...).  De plus, chaque table de la base de donnees est representees par un classe object heritees de DataObject ...

Tutorial

Ceci est mon premier tutorial donc ...
Tout d'abord, voici la structure du serveur web que j'utilise.  Tout les references seront basees sur cette structure ...

/usr  -> composant du serveur
/usr/local/Apache2  ->  le serveur Apache
/usr/local/Mysql  ->  Base de Donnees ...  les exemples donnees seront pour  cette base de donnees...
/usr/local/PHP   ->  Composant pour PHP
/usr/local/PHP/PEAR  ->  Repertoire dedies pour PEAR et ses classes ...
/www/   -->  repertoire ou seront places les fichiers web ....

pour l'exemple :

/www/AssetManagement  -->  mon repertoire detravail.    Il vous faudra definir un repertoire pour lacreation des classes par DataObject (preciser plus bas)
/www/AssetMagement/classes  ->  contient toutes les classes
/www/AssetMagement/ini   --> contient les fichiers ini


Telecharger :
PEAR_DB
 et
PEAR_DataObject

Pour ceux utilisant PHP sous Windows (EasyPHP, Uniserver), la plupartdes packages sont deja installes, il faut parfois juste decommentescertaines lignes de PHP.ini  ...
Tout d'abord, il faut editer le fichier PHP.ini :
    safe_mode_include_dir =   ".;/usr/local/PHP/includes;/usr/local/PHP/pear;/usr/local/PHP/pear/Db"
    include_path = ".;/usr/local/PHP/includes;/usr/local/PHP/pear;/usr/local/PHP/pear/Db"

Ces lignes permettent juste de preciser le chemin de recherche des packages pour PEAR.

Ensuite, une fois telecharges les packets pour DataObject du liensci-dessus, vous decompressez PEAR DB et vous le copiez dans/usr/local/PHP/PEAR/DB et
PEAR_DataObject dans .../PEAR/DB/DataObject.   Tout lespackages utilisant DataObject (et ils sont nombreux) devront se placerdans ce repertoire ..

Donc ...

Nouvelle structure du site :
/usr/local/PHP/PEAR/DB -> repertoire contenant tout les packages de couche d'abstraction
/usr/local/PHP/PEAR/DB/DataObject -> repertoire contenant le package DataObject et ses derives (quick_form, ...)

Maintenant la partie configuration ... (celle ou je me suis le plus battue pour la faire fonctionner ...)
Dans ../DataObject, il devrait y avoir 2 fichiers :
DataObject.ini et DOconfig.ini ... si ils n'y sont pas, il faudra les creer ..
DataObject.ini:
; DataObject INI File
[DB]
[DB_DataObject]
database        = mysql://usert:somepassword@localhost/db  
        ; the default database dsn see pear spec for more details

schema_location = /www/AssetManagement/ini     
class_location  = /www//AssetManagement/classes 
require_prefix  = DataObjects/
class_prefix    = DataObjects_
debug = 0
debug_ignore_updates = 0
dont_die = 0
dont_use_pear_sequences = 0
build_views = 0
----------------------------

database  <---   type de la base de donnees et parametres y afferant ...
schema_location  <---   emplacement pour les fichiersde configuration de la base de donnees... 
class_location  <-- Emplacement des classes d'objects ... sera l'emplacement par defaut lors de l'autocreation des classes....

DOConfig :
<?
require_once('PEAR.php');
$config = parse_ini_file('DataObject.ini',TRUE);
      foreach($config as $class=>$values) {
          $options = &PEAR::getStaticProperty($class,'options');
          $options = $values;
      }
$_DB_DATAOBJECT_FORMBUILDER['CONFIG'] = $config['DB_DataObject_FormBuilder'];
?>
DOConfig contient les definitions et lecode necessaire pour le fonctionnement des classes et package deDataObject.  Ci-dessus, il y a egalement le module FormBuilder.  Pour celui-ci on ajoutera une section supplementaire dansDataObject.ini ... (Hors tuto  donc je passe )...

le contenu du repertoire ini (ma base de donnees s'appelle "asset"):
    asset.ini   <--  autocreer lors de la generation des classes
       ex :
[department]
ID_Dept = 129
DIERCODE = 2
Department = 2

[department__keys]
ID_Dept = N

[employee]
ID_Employee = 129
ID_Title = 1
ID_Function = 1
ID_Dept = 1
ID_StatEmp = 1
LastName = 2
FirstName = 2
Login = 2
PhoneExt = 2
Hired = 6
Departed = 6

[employee__keys]
ID_Employee = N

[employee_has_hardware]
ID_Employee = 129
ID_HW = 129
    asset.links.ini  <---  contient les liens entre les tables
ex :
[employee]
ID_Title=title:ID_Title
ID_Function=function:ID_
ID_Dept=department:ID_Dept
ID_StatEmp=statusemployee:ID_StatEmp

[employee_has_hardware]
ID_Employee=employee:ID_Employee
ID_HW=hardware:ID_HW

[pc]
ID_HW=hardware:ID_HW

[hardware]
ID_Lease=lease:ID_Lease
ID_Location=location:ID_Location
ID_Vendor=vendor:ID_Vendor
ID_Asset=assettype:ID_Asset
ID_Status=status:ID_Status
ID_Lease=leasing:ID_Leasing;

Si tout est bien configurer, il suffit a present de lancer la commande d'autogeneration :
Sous Windows (desole mais pas encore essayer sous Linux mais ce doit etre plus ou moins la meme commande):
(a partir d'un shell prompt bien sur :...  mon serveur est sur le drive Y:\ ) 
y:\
cd \usr\local\php
php.exe Y:\usr\local\Php\pear\DB\DataObject\CreateTables.php

Ceci va permettre la generation des classes a partir de la base dedonnees ...  chaque classe sera copiees dans le repertoire definiedans Data

Voici un exemplede classe generee par DataObject :

<?php
/**
 * Table Definition for employee
 */
require_once 'DataObject.php';

class DataObjects_Employee extends DB_DataObject
{
    ###START_AUTOCODE
    /* the code below is auto generated do not remove the above tag */

    var $__table ='employee';                       // table name
    var$ID_Employee;                    // int(11)  not_null primary_key multiple_key auto_increment
    var$ID_Title;                       // int(11) 
    var$ID_Function;                    // int(11) 
    var$ID_Dept;                        // int(11) 
    var$ID_StatEmp;                     // int(11) 
    var$LastName;                           // string(30) 
    var$FirstName;                           // string(30) 
    var$Login;                          // string(18) 
    var$PhoneExt;                       // string(18) 
    var$Hired;                          // date(10) 
    var$Departed;                       // date(10) 

    /* ZE2 compatibility trick*/
    function __clone() { return $this;}

    /* Static get */
    function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('DataObjects_Employee',$k,$v); }

    /* the code above is auto generated do not remove the tag below */
    ###END_AUTOCODE
                   
}

Une fois ceci enplace, vous pouvez utiliser toute les fonctions de DataObject.

Personnellement, j'ajoute encore un fichier que j'ai nomme DO.php dansle root de mon site afin de m'assurer que le package DataObject estbien appelle :
<?php

require_once('PEAR.php');
$options = &PEAR::getStaticProperty('DB_DataObject','options');
$config = parse_ini_file('db/DataObject/DataObject.ini',TRUE);
$options=$config['DB_DataObject'];
?>

Recapitulons...

package PEAR (DB, DataObject) dans /usr/local/PHP/PEAR
DataObject.ini et DOConfig.ini dans /user/local/PHP/PEAR/DB/DataObject
DO.php dans le root du site (www/AssetManagement)
Repertoire Classes (ou le nom preciser dans DataObject.ini) dans le root du site
Repertoir Ini (ou le nom preciser dans DataObject.ini) dans le root du site

Utilisation ...

Comme un bon exemple vaut mieux que mille ligne d'explication :
ici on veut recuperer le nom de tout les PC de la base de donnees ... :
<?php

1 - require_once('do.php');
2 - require_once('classes/pc.php');
3 - DB_DataObject::debugLevel(0);
4 - $pc = new DataObjects_Pc;
5 - $number_of_rows = $pc->find();

6 - while ($pc->fetch()) {
    echo '<p>PC Name : '.$pc->Name.'<br>Serial : '.{$pc->Serial}.'  <p>';
    print_r($pc);
   
}

?>

1 et 2 : on ajoute le module appellant la classe (DO.php) et on ajoute la classe que l'on va utiliser (pc.php)
3 : DebugLevel(0)  en mettant a 1, on peut voir toutes lesconnexions a la base de donnees ... permet parfois de voir si il y a unprobleme de liens ou non ...
4 : on cree un object instance de la classe PC
5 : on recupere tout les PC et on stocke le total
6 : on boucle dans les resultats pour les afficher ($pc->Name)

Vous remarquerez,pas de connexion, pas de requête SQL…  c’estbeau…

 
Autre exemple unpeu plus complexe :

 <?php
// trying to retrieve employee id
require_once('/www/AssetManagement/do.php');
require_once('/www/AssetManagement/classes/employee.php');
$employee = new DataObjects_employee;
DB_DataObject::debugLevel(0);
$tablehead=array();
$tabledata=array(); 
// $array2pass,se trouve des variables passées par paramètres , j’ai coupe par clarté
// ce qui est intéressantici c’est la fonction whereadd dans laquelle on ajoute une clause //« WHERE »a la requête SQL … ici on fait une recherche globale donc la requête est « %requête% »
     
foreach ($array2pass as $a)
            {
            1 :       $wheresql="$a[0] like\"%$a[1]%\" "; #echo $wheresql."\n";
            2 :        $employee->whereAdd($wheresql);
        $tablehead[]=$a[0];
        $tabledata[]=$a[1];
            }
             3 -   $nb=$employee->find();
          if ($nb> 0) {  // if there is some employeeto display
             $tabledata=array();
            4 -        while ($employee->fetch())
                       {
                                   #print_r($employee);
                                   $row=$employee->ID_Employee;#echo$row.'<br />'."\n";
            5 -        $tabletemp=GetEmployeeData($row);
                        $tabledata=array_merge($tabledata,$tabletemp[1]);
                        $returndata[0]=$tabletemp[0];
                       }

}
    $returndata[1]=$tabledata;
}
$emphead=$returndata[0];
$empdata=$returndata[1];
if (empty($empdata))
{
    echo 'No datafound <br />'."\n";
}
else
{
    6 -     $tbl=DisplayTable($emphead,$empdata,$styletable='smtTable',$stylehead='smtHeader');
    7 -    echo $tbl;
}
?>

 

1 :  on crée une requête « WHERE »
2 : on ajoute la requêtea l’objet (employee->whereAdd($wheresql); )
3 : une foistoute les clauses Where ajoutée, on lance la recherche
4 : on récupèreles données répondant a la requête et on les stocke dans un tableau
5 : FonctionGetEmployeeData($row), je récupère les données de la table employee a partir dunuméro du champs …  (je détaille cette fonctionplus bas)
6 : Fonctionpour l’affichage du tableau repris dans http://www.phpcs.com/code.aspx?id=30609
7 : onimprime le tableau 


la fonction GetEmployeeData
 :

 Toujours selon lemême principe :

 function GetEmployeeData($ID='')
{
    require_once('/www/AssetManagement/do.php');
    require_once('/www/AssetManagement/classes/employee.php');
    $employee = newDataObjects_employee;
    DB_DataObject::debugLevel(0);
    if (!empty($ID)){$employee->ID_Employee=$ID;}      //matching Employee ID with passed ID
    $nb=$employee->find();              // finding Employee
       if ($nb == 0)
    {
        return(array('')); exit;           //if no Employee found with match id, return blank array
    }
    $empdata=array();                //preparing array to return
    $emphead=array();

     while($employee->fetch())               //Getting Employee Data
    {
       $employee->getLinks();          // Getting linked table data
        $emphead='"ID","FirstName","Last Name","Login","PhoneExt.","Hired","Departed","Department","DIERCODE","Title","Function","Status"';
        $empdata[]=de_empty($employee->ID_Employee);   // la fonction de_empty retourne juste "_" au cas ou la valeur estvide, juste pour ne pas avoir de case vide dans le tableau
        $empdata[]=de_empty($employee->FirstName);
        $empdata[]=de_empty($employee->LastName);
        $empdata[]=de_empty($employee->Login);
        $empdata[]=de_empty($employee->PhoneExt);
        $empdata[]=de_empty($employee->Hired);
        $empdata[]=de_empty($employee->Departed);
        $empdata[]=de_empty($employee->_ID_Dept->Department);
        $empdata[]=de_empty($employee->_ID_Dept->DIERCODE);
        $empdata[]=de_empty($employee->_ID_Title->Title);
        $empdata[]=de_empty($employee->_ID_Function->Function);
        $empdata[]=de_empty($employee->_ID_StatEmp->Status);
    }
    $returndata=array($emphead,$empdata);
    return($returndata); 
}

 
J’ai séparé cettefonction du reste du code car je l’utilise a plusieurs place … 

Ce qui est intéressantici c’est la fonction GetLinks :

Comme préciserplus haut, dans le répertoire ini, on trouve 2 fichiers : asset.inicontenant la définition de la base de données et asset.links.ini
Grâce a cefichier, on lie les tables entre elles… C’est ici que la fonction getLinks() est intéressante car elle vapermettre de récupérer les éléments lies :

Dans ma table, latable employee est liée a la table Department par le champ ID_Dept … 

[employee]
ID_Dept=department:ID_Dept

donc on récupèreles valeurs de la table department par $employee->_ ID_Dept->Department …

Donc une seule requêtepour récupérer toutes les valeurs que l’on a besoin … c’est pas beau la vie …
Voila  …  j’espère avoir aider
à éclaircir l’utilisationde PEAR ::DataObject …

Les exemples de code repris font partie d’une sériede script que j’utilise pour mon site et fonctionnent sans problèmes, j’aijuste un peu alléger le code des différentes structures de contrôle et depassage de paramètres ainsi que pour l’affichage des data …

La liste complètedes fonctions de PEAR ::DataObject se trouve sur le site de PEAR comme indiqué au début …

A bientôt
signaler à un administrateur
Commentaire de jandali le 01/10/2005 16:33:11

Bravo pour ce tuto bien structuré

signaler à un administrateur
Commentaire de thierrybo le 15/01/2006 20:56:21

Concernant l'endroit ou mettre les fichiers ini de définition des tables, on peut aussi les laisser avec les classes, en tout cas çà marche pour moi !

signaler à un administrateur
Commentaire de galadriann le 16/01/2006 08:55:28

Cela depend en fait de la configuration de ton serveur et de PEAR.  Par defaut il me semble qu'il va chercher dans l'arborescence pear.  

Si cela fonctionne pour toi, c'est impecable.

a+

signaler à un administrateur
Commentaire de matsri2003 le 17/01/2006 10:46:30

Après avoir suivi ce tutoriel, j'ai pu vérifier que mon serveur pouvait créer, modifier des objets dans ma base MySql.
Mais depuis que c'est mon client javascript qui est à l'initiative des requetes, c'est à dire que c'est le client qui appelle du code php serveur afin qu'il accède à la base, et bien j'ai un message d'erreur : CONNECT FAILED vers ma base, qui semble être introuvable.

Je me doutes que cela doit venir de mon fichier DataObject.ini, mais je ne vois pas quoi mettre d'autre. En effet, tout marche bien si je lance directement mon fichier .php qui accède à ma base, mais si c'est le client qui appelle le même code .php, et bien le code PEAR DAtaObject va retourner une erreur comme quoi il ne trouve pas la base. Je me dit qu'il s'agit surement d'une erreur liée à un chemin absolu, ou à mon DSN, mais je ne vois pas comment le corriger, voyez vous un problème dans mon fichier de config ?
De plus, si je lance le code client .html en l'appelant depuis l'éditeur qui est PHPEd de Nusphere, et bien bizarrement l'erreur disparait et l'accès à la base a pu se faire.
La différence d'adresse entre les deux modes de lancement est:
-Avec PhpEd, l'adresse est:
http://localhost:8080/file:/D:/Donnees/Root/AppelServeur.html?DBGSESSID=-1

-Sans PhpEd:
http://localhost/AppelServeur.html

Sachant que mon localhost est défini dans D:/Donnees/Root.


Voici le contenu de mon fichier DataObject.ini:
[DB_DataObject]

database    = mysql://root:root@localhost:3306/maBaseDeDonnees
schema_location = D:\Donnees\Root\Schema
class_location  = D:\Donnees\Root\Mapping\DB
require_prefix  = DataObjects/
class_prefix    = DataObjects_
debug = 5
debug_ignore_updates = 0
dont_die = 0
dont_use_pear_sequences = 0
build_views = 0

L'erreur retournée, en mode debug=5 stipule après avoir tenté de se connecter : Extension not found,..... CONNECT FAILED...

Merci pour votre aide rapide.

signaler à un administrateur
Commentaire de galadriann le 19/01/2006 09:02:44

il me semble que j'avais le meme probleme au debut, c'est ce qui ma conduit a faire ce tuto...

les chemins dans DataObjectini doivent toujours etre relatif au serveur web et non au repertoire de fichier.  De plus le "\" de windows n'est pas bien reconnu par les serveurs Web.  Votre erreur peut donc venir de la.

Essayez ceci :

[DB_DataObject]

database    = mysql://root:root@localhost:3306/maBaseDeDonnees
schema_location = /Root/Schema
class_location  = /Root/Mapping/DB
require_prefix  = DataObjects/
class_prefix    = DataObjects_
debug = 5
debug_ignore_updates = 0
dont_die = 0
dont_use_pear_sequences = 0
build_views = 0

signaler à un administrateur
Commentaire de ADIB le 25/01/2006 13:05:32

Bravo pour ce tuto,
j'ai suivit votre demarche  mais je n'arrive a aboutir a un resultat voici le code de mon script:
<?php
/* Quelques fichiers indispensables */    
set_include_path(get_include_path() . ";c:\www\php5\PEAR");
require_once "PEAR.php";
define("DB_DATAOBJECT_NO_OVERLOAD",true); /* Nécessaire pour certaines versions défectueuses de PHP4 */
require_once "DB/DataObject.php";
require_once "Structures/DataGrid.php";
require_once 'DB.php';  
$user = 'root';
$passwd = '300571';
$mysqlServer = 'localhost';
$dataBaseName ='sdgtut';

$dsn ='mysql://'.$user.':'.$passwd.'@'.$mysqlServer.'/'.$dataBaseName;
$db =& DB::connect($dsn);
if (DB::isError($db)) {
    die($db->getMessage());}
echo 'la connexion a reussie' ;
$db->disconnect();

/* Configuration base de données et DataObject */
$dataobjectOptions = &PEAR::getStaticProperty("DB_DataObject","options");
$dataobjectOptions["database"] =$dsn;
$dataobjectOptions["proxy"] = "full";

class DataObject_Fruits extends DB_DataObject
{
    var $__table = "fruits";
    var $id;
    var $name;
    var $stock;
    var $price;
}

/* Instantiation */
$dataobject = new DataObject_Fruits();
$datagrid =& new Structures_DataGrid(10); /* 10 rows per table */

/* Couplage */
$datagrid->bind($dataobject);

/* Rendu */
$datagrid->render();
?>

le resultat obtenu est connexion reussi mais le code qui vient apres n'est pas interpreter que faut il faire et merci.

signaler à un administrateur
Commentaire de galadriann le 26/01/2006 09:07:55

D'abord, premiere remarque, evitez de mettre les mots de passe Root dans un code sur un site internet ... on ne sait jamais qui peut lire le code ...  ;-)

Ensuite, vous faites bien un extend de DataObject dans la classe Fruit ...  mais rien d'autre ...   DataObject gere la connexion, pas le traitement ...

dans mon exemple j'avais 2 fonctions :
-->     function __clone() { return $this;}

    /* Static get */
-->    function staticGet($k,$v=NULL)
       { return DB_DataObject::staticGet('DataObjects_Employee',$k,$v); }

c'est cette function qui appellee devrait donner des resultats...

Maintenant je ne connais pas datagrid pour verifier 100% mais il me semble que au moins la fonction StaticGet devrait etre presente (elle est autogeneree lors de la creation des classe)...

Maintenant cela fait longtemps que je n'utilise plus Pear pour mes connexions ...  je crois que je vais m'y remettre du coup ...  (pour info j'utilise EZ_Sql comme classe d'abstraction de base de donnee... plus souple et simple)...

J'espere que je vous aurais aide un peu ...

a+

Carlos

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,109 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.