Couche d'abstraction sgbd avec résultats orienté objet

Soyez le premier à donner votre avis sur cette source.

Vue 5 470 fois - Téléchargée 264 fois

Description

Bonjour à tous
Une nouvelle mise à jour de la couche d'abstration à une DB.
Je vous indiquerai les modifications plus bas :)
Dans l'idée, il y a deux classes, celle de base, DB (abstract), et DBResults.
Quand vous faites un query (query, unbufferedQuery, multipleQuery, arrayQuery, objectQuery), le résultat de la requete est placé dans une nouvelle instance de la classe DBResults, qui est retourné.
Du coup, vous pouvez traiter le résultat indépendament de la classe, ce qui fait que vous pouvez faire différent query.
La méthode singleQuery, quant à elle, execute une requete uniquement de type 'action' (voir la methode isAnAction dans la classe DB) (cad autre que SHOW, EXPLAIN, DESCRIBE, SELECT).

Source / Exemple :


<?php
// On inclut les différents fichiers :
require_once ('genericException/genericException.class.php'); // Gestion des exceptions
require_once ('factory/factory.class.php'); // Factory (utilisée par dbConnector, donc nécéssaire !)
require_once ('db/dbConnector.class.php'); // Le connector (on peux aussi juste utiliser la factory)

$sCon = array ("mysql://root:passwd@127.0.0.1/dbName",
				"pgsql://root:passwd@127.0.0.1/dbName",
				"mssql://root:passwd@127.0.0.1/dbName");
// Différentes possibilités

// On crée l'instance de la base de donnée :
try {
	$oDb = dbconnector::connect ($sCon, 'db', false, dbConnector::LOAD_BALANCING); // Load balancing ?
	// On peux aussi utiliser dbConnector::FAIL_OVER (par défaut !)
}
catch (dbConnectorException $e) {
	echo "Oups ! :)";
}
catch (factoryException $e) {
	echo "Oups ! I did it again .... ?";
}
catch (... etc) {

}

// Maintenant on peux faire beaucoup de choses avec
// Comme faire mumuse en objet :
echo $oDb->query('requete')->fetchObject->NomColonne;

// Maintenant, il est aussi possible de faire
$QueryObject = $oDb->query('requete');
print_r ($QueryObject->fetchAll ()); // pour tout avoir
$QueryObject->rewind ();
$QueryObject->next ();
while ($QueryObject->valid ()) {
echo $QueryObject->column ('NOM ou INDEX de la colonne en cours');
// ou
$var = $QueryObject->current ();
echo $var['NOM ou INDEX de la colonne en cours'];
}
#
// la fonction prepare permet de préparer et parser une requete afin qu'elle soit prete a etre executée, exemple :
$sQuery = $oDb->prepare ('SELECT nom, prenom, login, passwd FROM §1user WHERE login=§2 AND passwd=§3', $TablePrefix, $LoginUser, $PasswdUser);
$QueryObject = $oDb->query ($sQuery);
#
#
// Bien sur, les méthodes de bases existes aussi, tel que (dans la classe DB):
/*
lastInsertRowid
lastInsertId
changes (= affected_rows)
query
singleQuery
unbufferedQuery
multipleQuery
arrayQuery
objectQuery

  • /
// Et voici les méthodes de la classe DBResults: /* fetch fetchObject fetchSingle fetchAll freeResult column numFields numRows
  • Ainsi que les éléments implémentés de la classe Iterator, Seekable et countable
  • /
?>

Conclusion :


De grosses mises à jours ont été faites.

Le groupement de classes supporte maintenant la connection sur des serveurs dispatchés, en LOAD BALANCING ou FAIL OVER.
Elle supporte MySQL, PostGreSQL, MsSQL et d'autres bientots ;)

Et comme toujours : Correction de bugs, amélioration du code, optimisation, danse avec le ptit chat, etc :)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
Bon, grosse mise à jours, j'ai pris en compte vos commentaires :
Maintenant on peux se connecter à Pgsql (qui est pris en charge automatiquement (repertoire /db/dbms/pgsql.class.php)), mais aussi à Microsoft Sql Server (et comme toujours, à MySQL ! :))

La classe supporte la connexion à des serveurs dispatchés, en Load Balancing ou Fail Over (par défaut).

J'attends vos avis ! :)
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
c'est vrai faudra que je regarde ca de plus pres ! :)
Merci pour ta remarque :)
Messages postés
2480
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
19
Salut,

Une classe d'abstraction c'est bien, mais c'est mieux quand c'est compatible avec d'autres moteurs que MySQL...

# $DB->connect ('host', 'login', 'password');
# $DB->selectDb ('base');

Avec postgreSQL, ça marche pas...

Même DB::open, étant donné qu'elle sélectionne la base après la connexion ne fonctionnera pas avec pgSQL...

A moins que je ne dise une ânerie, hein, mais j'ai bien cru voir que la connexion ne se faisait pas de la même manière entre MySQL et pgSQL (pour ne citer que les deux moteurs auxquels je me suis intéressé). Du coup, je pense que le code de connexion doit se trouver dans la classe concrète, puisque dépendant du moteur.
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
D'apres moi, le multiton est une autre classe qui sera utilisé pour gerer toutes les instances de mes classes. Comme c'est une autre classe, je n'ai pas pensé à la mettre ici car il y en a des tres bien sur phpcs mais perso je m'en sert pour instancier mes classes :)

Ensuite, le mode Auto, au final tu fait pareil ici, sauf que tu appel une fonction en plus, c'est pas vilain :p (c'est d'ailleur pour ca qu'il y a deux possibilités : open ou connect+selectDb)
Personnellement je préfere utiliser une fonction de plus que de "surcharger" la fonction __construct. Apres, ce n'est qu'un avis personnel :)

Pour les exceptions, au final ca revient au meme. Le probleme dans ton idée, c'est que je ne fait pas forcément appel à la fonction str_replace, or, dans ton cas, si, ce qui use d'une fonction supplémentaire (à mon avis). Maintenant, c'est sur qu'il y a des choses à améliorer :)

Pour le next dans le constructeur, je suis justement pas sur, d'apres FhX (adns les commentaires de la source de Malalam), il dit qu'il ne doit pas etre dans le constructeur, mais que c'est à toi de faire appel dans une boucle while, et que c'est fait automatiquement dans une boucle foreach, mais c'est pas mon cas :/ bizar :)

Merci bien de tes commentaires :)
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Pour le next de l'Iterateur, il me semble que c'est un comportement normal. Pour remédier à ce pb, il faut faire appel à next() dans le constructeur de ton Iterateur.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.